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 bfdf708..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 e6ad7cc..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 831c832..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.11 $  $Date: 2005/07/14 15:22:06 $ 
- */
-
-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 bdc558c..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ExpressionTest.java
+++ /dev/null
@@ -1,3303 +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.12 $  $Date: 2005/07/20 19:27:27 $ 
- */
-package org.eclipse.jem.tests.proxy;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.jem.internal.proxy.common.AmbiguousMethodException;
-import org.eclipse.jem.internal.proxy.core.*;
-import org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent;
-import org.eclipse.jem.internal.proxy.ide.IDEStandardBeanProxyFactory;
-import org.eclipse.jem.internal.proxy.initParser.tree.*;
- 
-/**
- * 
- * @since 1.0.0
- */
-public class ExpressionTest extends AbstractTestProxy {
-
-	/**
-	 * 
-	 * 
-	 * @since 1.0.0
-	 */
-	public ExpressionTest() {
-		super();
-	}
-
-	/**
-	 * @param name
-	 * 
-	 * @since 1.0.0
-	 */
-	public ExpressionTest(String name) {
-		super(name);
-	}
-	
-	public void testIProxyBeanTypeProxy() throws CoreException, IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		// Test that proxy bean type is first an expression proxy and after expression evaluation does it become a real proxy. 
-		// Can't test that it doesn't become a real proxy before evaluation because it may become resolved under the covers. For
-		// example IDE expression immediately resolves it.
-		//
-		// First we must make sure we have a clean registry because it could of been resolved from a previous test.
-		recreateRegistry();
-		
-		// Now do an expression and get a proxy.
-		IExpression exp = proxyFactory.createExpression();
-		IProxyBeanType beanTypeProxy = proxyTypeFactory.getBeanTypeProxy(exp, "testPackage.TestAccess");
-		assertNotNull(beanTypeProxy);
-		assertTrue(beanTypeProxy.isExpressionProxy());
-		final IBeanTypeProxy[] resolution = new IBeanTypeProxy[1];
-		((ExpressionProxy) beanTypeProxy).addProxyListener(new ExpressionProxy.ProxyListener() {
-			public void proxyResolved(ProxyEvent event) {
-				resolution[0] = (IBeanTypeProxy) event.getProxy();
-			}
-			public void proxyVoid(ProxyEvent event) {
-				fail("Proxy should not be void.");
-			}
-			public void proxyNotResolved(ProxyEvent event) {
-				fail("Proxy should of resolved.");
-			}
-		});
-		
-		exp.invokeExpression();
-		assertNotNull(resolution[0]);
-		IBeanTypeProxy beanTypeProxy2 = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess");
-		assertNotNull(beanTypeProxy2);
-		assertTrue(beanTypeProxy2.isBeanProxy());
-		assertTrue(beanTypeProxy2.isValid());
-		assertSame(beanTypeProxy2, resolution[0]);	// In case of beantypes we will get identical ones back (identity not just equals).
-	}
-
-	public void testIProxyMethodProxy() throws CoreException, IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		// Test that proxy methode is first an expression proxy and after expression evaluation does it become a real proxy. 
-		// Can't test that it doesn't become a real proxy before evaluation because it may become resolved under the covers. For
-		// example IDE expression immediately resolves it.
-		//
-		// First we must make sure we have a clean registry because it could of been resolved from a previous test.
-		recreateRegistry();
-		
-		// Now do an expression and get a proxy.
-		IExpression exp = proxyFactory.createExpression();
-		IProxyBeanType beanTypeProxy = proxyTypeFactory.getBeanTypeProxy(exp, "testPackage.TestAccess");
-		IProxyMethod methodProxy = beanTypeProxy.getMethodProxy(exp, "xyz");
-		assertNotNull(methodProxy);
-		assertTrue(methodProxy.isExpressionProxy());
-		final IMethodProxy[] resolution = new IMethodProxy[1];
-		final boolean[] wasVoid = new boolean[1];
-		((ExpressionProxy) methodProxy).addProxyListener(new ExpressionProxy.ProxyListener() {
-			public void proxyResolved(ProxyEvent event) {
-				resolution[0] = (IMethodProxy) event.getProxy();
-			}
-			public void proxyVoid(ProxyEvent event) {
-				wasVoid[0] = true;
-			}
-			public void proxyNotResolved(ProxyEvent event) {
-			}
-		});
-		IProxyMethod methodProxy2 = beanTypeProxy.getMethodProxy(exp, "xyz");
-		assertSame(methodProxy, methodProxy2);	// It should return same expression proxy each time.
-		
-		exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, methodProxy, true, 0);
-		exp.createClassInstanceCreation(ForExpression.METHOD_RECEIVER, beanTypeProxy, 0);
-		exp.invokeExpression();
-		
-		assertFalse(wasVoid[0]);
-		assertNotNull(resolution[0]);
-		IMethodProxy methodProxy3 = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess").getMethodProxy("xyz");
-		assertNotNull(methodProxy3);
-		assertTrue(methodProxy3.isBeanProxy());
-		assertTrue(methodProxy3.isValid());
-		// Can't test identity of methodproxies because some registries (IDE for example) create a new method proxy each time.
-	}
-
-	public void testIProxyFieldProxy() throws CoreException, IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		// Test that proxy field is first an expression proxy and after expression evaluation does it become a real proxy. 
-		// Can't test that it doesn't become a real proxy before evaluation because it may become resolved under the covers. For
-		// example IDE expression immediately resolves it.
-		//
-		// First we must make sure we have a clean registry because it could of been resolved from a previous test.
-		recreateRegistry();
-		
-		// Now do an expression and get a proxy.
-		IExpression exp = proxyFactory.createExpression();
-		IProxyBeanType beanTypeProxy = proxyTypeFactory.getBeanTypeProxy(exp, "testPackage.TestAccess");
-		IProxyField fieldProxy = beanTypeProxy.getFieldProxy(exp, "STATIC_FIELD");
-		assertNotNull(fieldProxy);
-		assertTrue(fieldProxy.isExpressionProxy());
-		final IFieldProxy[] resolution = new IFieldProxy[1];
-		final boolean[] wasVoid = new boolean[1];
-		((ExpressionProxy) fieldProxy).addProxyListener(new ExpressionProxy.ProxyListener() {
-			public void proxyResolved(ProxyEvent event) {
-				resolution[0] = (IFieldProxy) event.getProxy();
-			}
-			public void proxyVoid(ProxyEvent event) {
-				wasVoid[0] = true;
-			}
-			public void proxyNotResolved(ProxyEvent event) {
-			}
-		});
-		
-		IProxyField fieldProxy2 = beanTypeProxy.getFieldProxy(exp, "STATIC_FIELD");
-		assertSame(fieldProxy, fieldProxy2);	// It should return same expression proxy each time.
-		
-		exp.createFieldAccess(ForExpression.ROOTEXPRESSION, fieldProxy, true);
-		exp.createClassInstanceCreation(ForExpression.FIELD_RECEIVER, beanTypeProxy, 0);
-		IBeanProxy v = exp.getExpressionValue();
-		assertNotNull(v);
-		assertEquals(3, ((IIntegerBeanProxy) v).intValue());
-		
-		assertFalse(wasVoid[0]);
-		assertNotNull(resolution[0]);
-		IFieldProxy fieldProxy3 = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess").getFieldProxy("STATIC_FIELD");
-		assertNotNull(fieldProxy3);
-		assertTrue(fieldProxy3.isBeanProxy());
-		assertTrue(fieldProxy3.isValid());
-		// Can't test identity of methodproxies because some registries (IDE for example) create a new method proxy each time.
-	}
-
-	public void testCastStringType() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createCastExpression(ForExpression.ROOTEXPRESSION, "short");
-		exp.createPrimitiveLiteral(ForExpression.CAST_EXPRESSION, 10l);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("short", result.getTypeProxy().getTypeName());
-		assertEquals((short) 10, ((INumberBeanProxy) result).shortValue());
-	}
-	
-	public void testCastProxyType() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createCastExpression(ForExpression.ROOTEXPRESSION, proxyTypeFactory.getBeanTypeProxy("short"));
-		exp.createPrimitiveLiteral(ForExpression.CAST_EXPRESSION, 'a');
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("short", result.getTypeProxy().getTypeName());
-		assertEquals((short) 'a', ((INumberBeanProxy) result).shortValue());	
-	}
-	
-	public void testCastError() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createCastExpression(ForExpression.ROOTEXPRESSION, proxyTypeFactory.getBeanTypeProxy("short"));
-		try {
-			exp.createProxyExpression(ForExpression.CAST_EXPRESSION, proxyFactory.createBeanProxyWith(Boolean.TRUE));
-			exp.getExpressionValue();
-			fail("Should of thrown ClassCastException");
-		} catch (ThrowableProxy e) {
-			if (!e.getTypeProxy().getFormalTypeName().equals("java.lang.ClassCastException"))
-				throw e;	// Some other exception, rethrow it.
-		}
-	}	
-	
-	public void testCastFailed() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createCastExpression(ForExpression.ROOTEXPRESSION, proxyTypeFactory.getBeanTypeProxy("short"));
-		try {
-			exp.getExpressionValue();
-			fail("Should of gotton IllegalStateException");
-		} catch (IllegalStateException e) {
-			System.out.println("From testCastFailed (This is successful): "+e.getLocalizedMessage());
-		}		
-	}
-
-	public void testInstanceofStringType() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInstanceofExpression(ForExpression.ROOTEXPRESSION, "java.lang.String");
-		exp.createStringLiteral(ForExpression.INSTANCEOF_VALUE, "asdf");
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(true, ((IBooleanBeanProxy) result).booleanValue());
-	}
-	
-	public void testInstanceofProxyType() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInstanceofExpression(ForExpression.ROOTEXPRESSION, proxyTypeFactory.getBeanTypeProxy("java.lang.String"));
-		exp.createStringLiteral(ForExpression.INSTANCEOF_VALUE, "asdf");
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(true, ((IBooleanBeanProxy) result).booleanValue());
-		
-	}
-	
-	public void testInstanceofFailed() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInstanceofExpression(ForExpression.ROOTEXPRESSION, proxyTypeFactory.getBeanTypeProxy("java.lang.String"));
-		try {
-			exp.getExpressionValue();
-			fail("Should of gotton IllegalStateException");
-		} catch (IllegalStateException e) {
-			System.out.println("From testInstanceofFailed (This is successful): "+e.getLocalizedMessage());
-		}		
-	}
-	
-	public void testTypeLiteral() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTypeLiteral(ForExpression.ROOTEXPRESSION, "java.lang.String");
-		IBeanProxy result = exp.getExpressionValue();
-		assertTrue("Not a bean type proxy.", result instanceof IBeanTypeProxy);
-		IBeanTypeProxy type = (IBeanTypeProxy) result;
-		assertTrue("Not valid.", type.isValid());
-		assertEquals("java.lang.String", type.getFormalTypeName());
-	}
-
-	public void testTypeFails() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		try {
-			exp.createTypeLiteral(ForExpression.ROOTEXPRESSION, "java.lang.Stng");
-			exp.getExpressionValue();
-			fail("Should not of gotton a result.");
-		} catch (ThrowableProxy e) {
-			assertEquals("java.lang.ClassNotFoundException", e.getTypeProxy().getFormalTypeName());
-		}
-	}
-	
-	public void testNesting() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInstanceofExpression(ForExpression.ROOTEXPRESSION, "short");
-		exp.createCastExpression(ForExpression.INSTANCEOF_VALUE, "short");
-		exp.createPrimitiveLiteral(ForExpression.CAST_EXPRESSION, (short) 10);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(true, ((IBooleanBeanProxy) result).booleanValue());
-	}
-	
-	public void testPrefixPlus() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createPrefixExpression(ForExpression.ROOTEXPRESSION, PrefixOperator.PRE_PLUS);
-		exp.createPrimitiveLiteral(ForExpression.PREFIX_OPERAND, 10);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(10, ((INumberBeanProxy) result).intValue());
-		
-	}
-	
-	public void testPrefixMinus() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createPrefixExpression(ForExpression.ROOTEXPRESSION, PrefixOperator.PRE_MINUS);
-		exp.createPrimitiveLiteral(ForExpression.PREFIX_OPERAND, 10);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(-10, ((INumberBeanProxy) result).intValue());
-		
-	}
-
-	public void testPrefixMinusChar() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createPrefixExpression(ForExpression.ROOTEXPRESSION, PrefixOperator.PRE_MINUS);
-		exp.createPrimitiveLiteral(ForExpression.PREFIX_OPERAND, 'a');
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(-'a', ((INumberBeanProxy) result).intValue());
-		
-	}
-
-	public void testPrefixComplement() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createPrefixExpression(ForExpression.ROOTEXPRESSION, PrefixOperator.PRE_COMPLEMENT);
-		exp.createPrimitiveLiteral(ForExpression.PREFIX_OPERAND, (short) 10);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(~10, ((INumberBeanProxy) result).intValue());
-		
-	}
-
-	public void testPrefixNot() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createPrefixExpression(ForExpression.ROOTEXPRESSION, PrefixOperator.PRE_NOT);
-		exp.createPrimitiveLiteral(ForExpression.PREFIX_OPERAND, true);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(false, ((IBooleanBeanProxy) result).booleanValue());
-		
-	}
-
-	public void testPrefixFail() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createPrefixExpression(ForExpression.ROOTEXPRESSION, PrefixOperator.PRE_NOT);
-		try {
-			exp.createPrimitiveLiteral(ForExpression.PREFIX_OPERAND, 10);
-			exp.getExpressionValue();
-			fail("Should of failed.");
-		} catch (ThrowableProxy e) {
-			System.out.println("Test was successful: "+e.getProxyLocalizedMessage());
-		}
-		
-	}
-	
-	public void testTimes() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_TIMES, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 4);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(3*4, ((INumberBeanProxy) result).intValue());
-		
-	}
-	
-	public void testTimesExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_TIMES, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 5d);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("double", result.getTypeProxy().getTypeName());
-		assertEquals((3*4*5d), ((INumberBeanProxy) result).doubleValue(), 0);
-		
-	}
-
-	public void testTimesExtendedNested() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_TIMES, 1);
-		exp.createInfixExpression(ForExpression.INFIX_LEFT, InfixOperator.IN_MINUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 10);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 5);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 5d);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("double", result.getTypeProxy().getTypeName());
-		assertEquals(((10-5)*4*5d), ((INumberBeanProxy) result).doubleValue(), 0);
-		
-	}
-
-	public void testDivide() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_DIVIDE, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 2);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(4/2, ((INumberBeanProxy) result).intValue());
-		
-	}
-	
-	public void testDivideExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_DIVIDE, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 12);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2d);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("double", result.getTypeProxy().getTypeName());
-		assertEquals((12/3/2d), ((INumberBeanProxy) result).doubleValue(), 0);
-		
-	}
-
-	public void testRemainder() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_REMAINDER, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(4%3, ((INumberBeanProxy) result).intValue());
-		
-	}
-	
-	public void testRemainderExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_REMAINDER, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 12);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 9);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2d);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("double", result.getTypeProxy().getTypeName());
-		assertEquals((12%9%2d), ((INumberBeanProxy) result).doubleValue(), 0);
-		
-	}
-
-	public void testMinus() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_MINUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(4-3, ((INumberBeanProxy) result).intValue());
-		
-	}
-	
-	public void testMinusExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_MINUS, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 12);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 9);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2d);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("double", result.getTypeProxy().getTypeName());
-		assertEquals((12-9-2d), ((INumberBeanProxy) result).doubleValue(), 0);
-		
-	}
-
-	public void testLeftShift() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_LEFT_SHIFT, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(4<<3, ((INumberBeanProxy) result).intValue());
-		
-	}
-	
-	public void testLeftShiftExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_LEFT_SHIFT, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 12);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 9);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals((12<<9<<2), ((INumberBeanProxy) result).intValue(), 0);
-	}
-
-	public void testRightShiftSigned() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_RIGHT_SHIFT_SIGNED, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, -10000000);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(-10000000>>3, ((INumberBeanProxy) result).intValue());
-	}
-	
-	public void testRightShiftSignedExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_RIGHT_SHIFT_SIGNED, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, -10000000);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals((-10000000>>4>>2), ((INumberBeanProxy) result).intValue(), 0);
-	}
-	public void testRightShiftUnSigned() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_RIGHT_SHIFT_UNSIGNED, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, -10000000);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(-10000000>>>3, ((INumberBeanProxy) result).intValue());
-	}
-	
-	public void testRightShiftUnSignedExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_RIGHT_SHIFT_UNSIGNED, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, -10000000);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals((-10000000>>>4>>>2), ((INumberBeanProxy) result).intValue(), 0);
-	}
-
-	public void testLess() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_LESS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, -10000000);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(-10000000<3, ((IBooleanBeanProxy) result).booleanValue());
-	}
-
-	public void testLessEquals() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_LESS_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(3<=3, ((IBooleanBeanProxy) result).booleanValue());
-	}
-
-	public void testGreater() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_GREATER, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, -10000000);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(-10000000>3, ((IBooleanBeanProxy) result).booleanValue());
-	}
-
-	public void testGreaterEquals() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_GREATER_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 2);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(2>=3, ((IBooleanBeanProxy) result).booleanValue());
-	}
-
-	public void testEqualsPrimitives() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3d);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(3d==3, ((IBooleanBeanProxy) result).booleanValue());
-	}
-	
-	public void testEqualsObjects() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_EQUALS, 0);
-		exp.createTypeLiteral(ForExpression.INFIX_LEFT, "java.lang.String");
-		exp.createTypeLiteral(ForExpression.INFIX_RIGHT, "java.lang.String");
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(String.class == String.class, ((IBooleanBeanProxy) result).booleanValue());
-	}	
-
-	public void testNotEqualsPrimitives() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_NOT_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3d);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(3d!=3, ((IBooleanBeanProxy) result).booleanValue());
-	}
-	
-	public void testNotEqualsObjects() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_NOT_EQUALS, 0);
-		exp.createTypeLiteral(ForExpression.INFIX_LEFT, "java.lang.String");
-		exp.createTypeLiteral(ForExpression.INFIX_RIGHT, "java.lang.String");
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(String.class != String.class, ((IBooleanBeanProxy) result).booleanValue());
-	}	
-
-	public void testXOR() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_XOR, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 5);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(5^3, ((INumberBeanProxy) result).intValue());
-		
-	}
-	
-	public void testXORExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_XOR, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 23);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 9);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals((23^9^2), ((INumberBeanProxy) result).intValue(), 0);
-		
-	}
-
-	public void testAnd() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_AND, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 5);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(5&3, ((INumberBeanProxy) result).intValue());
-	}
-	
-	public void testAndExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_AND, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 13);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 15);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 1);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals((13&5&1), ((INumberBeanProxy) result).intValue(), 0);
-	}
-
-	public void testOr() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_OR, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 5);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 2);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(5|2, ((INumberBeanProxy) result).intValue());
-	}
-	
-	public void testOrExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_OR, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 13);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 6);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals((13|6|2), ((INumberBeanProxy) result).intValue(), 0);
-	}
-
-	public void testPlus() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 5);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 2);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getTypeName());
-		assertEquals(5+2, ((INumberBeanProxy) result).intValue());
-	}
-
-	public void testPlusExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 5);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 2);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2l);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("long", result.getTypeProxy().getTypeName());
-		assertEquals(5+2+2l, ((INumberBeanProxy) result).intValue());
-	}
-
-	public void testPlusStringLeft() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
-		exp.createProxyExpression(ForExpression.INFIX_LEFT, proxyFactory.createBeanProxyWith("abc"));
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 2);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("java.lang.String", result.getTypeProxy().getTypeName());
-		assertEquals("abc"+2, ((IStringBeanProxy) result).stringValue());
-	}
-
-	public void testPlusStringRight() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 2);
-		exp.createProxyExpression(ForExpression.INFIX_RIGHT, proxyFactory.createBeanProxyWith("abc"));		
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("java.lang.String", result.getTypeProxy().getTypeName());
-		assertEquals(2+"abc", ((IStringBeanProxy) result).stringValue());
-	}
-	
-	public void testPlusStringLeftNull() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
-		exp.createProxyExpression(ForExpression.INFIX_LEFT, proxyFactory.createBeanProxyWith("abc"));
-		exp.createNull(ForExpression.INFIX_RIGHT);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("java.lang.String", result.getTypeProxy().getTypeName());
-		assertEquals("abc"+null, ((IStringBeanProxy) result).stringValue());
-	}
-	
-	public void testPlusStringRightNull() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
-		exp.createNull(ForExpression.INFIX_LEFT);
-		exp.createProxyExpression(ForExpression.INFIX_RIGHT, proxyFactory.createBeanProxyWith("abc"));
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("java.lang.String", result.getTypeProxy().getTypeName());
-		assertEquals(null+"abc", ((IStringBeanProxy) result).stringValue());
-	}
-
-	public void testPlusStringLeftChar() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
-		exp.createProxyExpression(ForExpression.INFIX_LEFT, proxyFactory.createBeanProxyWith("abc"));
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 'a');
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("java.lang.String", result.getTypeProxy().getTypeName());
-		assertEquals("abc"+'a', ((IStringBeanProxy) result).stringValue());
-	}
-
-	public void testPlusStringRightChar() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 'a');
-		exp.createProxyExpression(ForExpression.INFIX_RIGHT, proxyFactory.createBeanProxyWith("abc"));
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("java.lang.String", result.getTypeProxy().getTypeName());
-		assertEquals('a'+"abc", ((IStringBeanProxy) result).stringValue());
-	}
-
-	public void testConditionalAnd() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_AND, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, true);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, true);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(true && true, ((IBooleanBeanProxy) result).booleanValue());
-	}
-
-	public void testConditionalAndExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_AND, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, true);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, true);
-		exp.createInfixExpression(ForExpression.INFIX_EXTENDED, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(true && true && (3 == 3), ((IBooleanBeanProxy) result).booleanValue());
-	}
-
-	public void testConditionalAndFalseLast() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_AND, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, true);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, false);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(true && false, ((IBooleanBeanProxy) result).booleanValue());
-	}
-
-	public void testConditionalAndFalseFirst() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_AND, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, false);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, true);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(false && true, ((IBooleanBeanProxy) result).booleanValue());
-	}
-
-	public void testConditionalAndExtendedAndFalseFirst() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_AND, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, false);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, true);
-		exp.createInfixExpression(ForExpression.INFIX_EXTENDED, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(false && true && (3 == 3), ((IBooleanBeanProxy) result).booleanValue());
-	}
-
-	public void testConditionalOr() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_OR, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, false);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, true);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(false || true, ((IBooleanBeanProxy) result).booleanValue());
-	}
-
-	public void testConditionalOrExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_OR, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, false);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, false);
-		exp.createInfixExpression(ForExpression.INFIX_EXTENDED, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(false || false || (3 == 3), ((IBooleanBeanProxy) result).booleanValue());
-	}
-
-	public void testConditionalOrTrueFirst() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_OR, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, true);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, false);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(true || false, ((IBooleanBeanProxy) result).booleanValue());
-	}
-
-	public void testConditionalOrExtendedAndTrueMiddle() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_OR, 1);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, false);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, true);
-		exp.createInfixExpression(ForExpression.INFIX_EXTENDED, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("boolean", result.getTypeProxy().getTypeName());
-		assertEquals(false || true || (3 == 3), ((IBooleanBeanProxy) result).booleanValue());
-	}
-
-	public void testArrayAccess() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IArrayBeanProxy array = proxyFactory.createBeanProxyWith(proxyTypeFactory.getBeanTypeProxy("short"), 1);
-		array.set(proxyFactory.createBeanProxyWith((short) 3), 0);
-		
-		IExpression exp = proxyFactory.createExpression();
-		exp.createArrayAccess(ForExpression.ROOTEXPRESSION, 1);
-		exp.createProxyExpression(ForExpression.ARRAYACCESS_ARRAY, array);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 0);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("short", result.getTypeProxy().getTypeName());
-		assertEquals(((INumberBeanProxy) result).shortValue(), (short) 3);
-	}
-	
-	public void testArrayAccessSet() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IArrayBeanProxy array = proxyFactory.createBeanProxyWith(proxyTypeFactory.getBeanTypeProxy("short"), 1);
-		array.set(proxyFactory.createBeanProxyWith((short) 3), 0);
-		
-		IExpression exp = proxyFactory.createExpression();
-		exp.createAssignmentExpression(ForExpression.ROOTEXPRESSION);
-		exp.createArrayAccess(ForExpression.ASSIGNMENT_LEFT, 1);
-		exp.createProxyExpression(ForExpression.ARRAYACCESS_ARRAY, array);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 0);
-		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, (short) 33);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("short", result.getTypeProxy().getTypeName());
-		assertEquals(((INumberBeanProxy) result).shortValue(), (short) 33);
-	}
-	
-	
-	public void testMultiArrayAccess() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IArrayBeanProxy array = proxyFactory.createBeanProxyWith(proxyTypeFactory.getBeanTypeProxy("short"), new int[] {2,1});
-		array.set(proxyFactory.createBeanProxyWith((short) 3), new int[]{1,0});
-		
-		IExpression exp = proxyFactory.createExpression();
-		exp.createArrayAccess(ForExpression.ROOTEXPRESSION, 1);
-		exp.createProxyExpression(ForExpression.ARRAYACCESS_ARRAY, array);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 1);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("short[]", result.getTypeProxy().getFormalTypeName());
-	}
-
-	public void testMultiArrayAccessSet() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IArrayBeanProxy array = proxyFactory.createBeanProxyWith(proxyTypeFactory.getBeanTypeProxy("short"), new int[] {2,1});
-		array.set(proxyFactory.createBeanProxyWith((short) 3), new int[]{1,0});
-		
-		IExpression exp = proxyFactory.createExpression();
-		exp.createAssignmentExpression(ForExpression.ROOTEXPRESSION);
-		exp.createArrayAccess(ForExpression.ASSIGNMENT_LEFT, 1);
-		exp.createProxyExpression(ForExpression.ARRAYACCESS_ARRAY, array);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 1);
-		IArrayBeanProxy newArray = proxyFactory.createBeanProxyWith(proxyTypeFactory.getBeanTypeProxy("short"), new int[] {3});
-		exp.createProxyExpression(ForExpression.ASSIGNMENT_RIGHT, newArray);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("short[]", result.getTypeProxy().getFormalTypeName());
-		assertEquals(3, ((IArrayBeanProxy) result).getLength());
-	}
-
-	public void testMultiArrayAccess1() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IArrayBeanProxy array = proxyFactory.createBeanProxyWith(proxyTypeFactory.getBeanTypeProxy("short"), new int[] {2,1});
-		array.set(proxyFactory.createBeanProxyWith((short) 3), new int[]{1,0});
-		
-		IExpression exp = proxyFactory.createExpression();
-		exp.createArrayAccess(ForExpression.ROOTEXPRESSION, 2);
-		exp.createProxyExpression(ForExpression.ARRAYACCESS_ARRAY, array);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 1);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 0);		
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("short", result.getTypeProxy().getFormalTypeName());
-		assertEquals((short) 3, ((INumberBeanProxy) result).shortValue());
-	}
-	
-	public void testArrayCreation() throws IllegalStateException, IllegalArgumentException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[]", 1);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYCREATION_DIMENSION, 2);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int[]", result.getTypeProxy().getFormalTypeName());
-		assertEquals(2, ((IArrayBeanProxy) result).getLength());
-	}
-	
-	public void testMultiArrayCreation() throws IllegalStateException, IllegalArgumentException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[][]", 2);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYCREATION_DIMENSION, 2);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYCREATION_DIMENSION, 4);		
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int[][]", result.getTypeProxy().getFormalTypeName());
-		assertEquals(2, ((IArrayBeanProxy) result).getLength());
-		assertEquals(4, ((IArrayBeanProxy)((IArrayBeanProxy) result).get(0)).getLength());
-	}	
-
-	public void testMultiPartialArrayCreation() throws IllegalStateException, IllegalArgumentException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[][][]", 2);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYCREATION_DIMENSION, 2);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYCREATION_DIMENSION, 4);		
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int[][][]", result.getTypeProxy().getFormalTypeName());
-		assertEquals(2, ((IArrayBeanProxy) result).getLength());
-		assertEquals(4, ((IArrayBeanProxy)((IArrayBeanProxy) result).get(0)).getLength());
-		assertNull(((IArrayBeanProxy)((IArrayBeanProxy) result).get(0)).get(0));
-	}
-	
-	public void testArrayInitializerEmpty() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[]", 0);
-		exp.createArrayInitializer(0);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int[]", result.getTypeProxy().getFormalTypeName());
-		assertEquals(0, ((IArrayBeanProxy) result).getLength());
-	}
-	
-	public void testArrayInitializerOneDim() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[]", 0);
-		exp.createArrayInitializer(1);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYINITIALIZER_EXPRESSION, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int[]", result.getTypeProxy().getFormalTypeName());
-		assertEquals(1, ((IArrayBeanProxy) result).getLength());
-		assertEquals(3, ((INumberBeanProxy) ((IArrayBeanProxy) result).get(0)).intValue());
-	}
-	
-	public void testArrayInitializerTwoDimEmpty() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[][]", 0);
-		exp.createArrayInitializer(0);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int[][]", result.getTypeProxy().getFormalTypeName());
-		assertEquals(0, ((IArrayBeanProxy) result).getLength());
-	}
-	
-	public void testArrayInitializerTwoDim() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[][]", 0);
-		exp.createArrayInitializer(1);
-		exp.createArrayInitializer(0);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int[][]", result.getTypeProxy().getFormalTypeName());
-		assertEquals(1, ((IArrayBeanProxy) result).getLength());
-		assertEquals(0, ((IArrayBeanProxy) ((IArrayBeanProxy) result).get(0)).getLength());
-	}	
-
-	public void testArrayInitializerTwoDimNotEmpty() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[][]", 0);
-		exp.createArrayInitializer(2);
-		exp.createNull(ForExpression.ARRAYINITIALIZER_EXPRESSION);
-		exp.createArrayInitializer(2);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYINITIALIZER_EXPRESSION, 3);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYINITIALIZER_EXPRESSION, 4);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int[][]", result.getTypeProxy().getFormalTypeName());
-		assertEquals(2, ((IArrayBeanProxy) result).getLength());
-		assertNull(((IArrayBeanProxy) result).get(0));
-		assertEquals(2, ((IArrayBeanProxy) ((IArrayBeanProxy) result).get(1)).getLength());
-		assertEquals(4, ((INumberBeanProxy)((IArrayBeanProxy) ((IArrayBeanProxy) result).get(1)).get(1)).intValue());		
-	}
-	
-	public void testArrayInitializerShortInt() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "short[]", 0);
-		exp.createArrayInitializer(1);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYINITIALIZER_EXPRESSION, 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("short[]", result.getTypeProxy().getFormalTypeName());
-		assertEquals(1, ((IArrayBeanProxy) result).getLength());
-		assertEquals(3, ((INumberBeanProxy) ((IArrayBeanProxy) result).get(0)).intValue());
-	}
-	
-	public void testClassInstanceCreationDefault() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createClassInstanceCreation(ForExpression.ROOTEXPRESSION, "java.lang.Object", 0);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("java.lang.Object", result.getTypeProxy().getFormalTypeName());
-	}
-	
-	public void testClassInstanceCreationDefaultWithBeanTypeProxy() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createClassInstanceCreation(ForExpression.ROOTEXPRESSION, proxyTypeFactory.getBeanTypeProxy("java.lang.Object"), 0);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("java.lang.Object", result.getTypeProxy().getFormalTypeName());
-	}	
-	
-	public void testClassInstanceCreationOneArg() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createClassInstanceCreation(ForExpression.ROOTEXPRESSION, "java.lang.Integer", 1);
-		exp.createStringLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, "3");
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("java.lang.Integer", result.getTypeProxy().getFormalTypeName());
-		assertEquals(3, ((INumberBeanProxy) result).intValue());
-	}
-	
-	public void testClassInstanceCreationOneArgWithPrimWidening() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createClassInstanceCreation(ForExpression.ROOTEXPRESSION, "java.lang.Short", 1);
-		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, (byte)3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("java.lang.Short", result.getTypeProxy().getFormalTypeName());
-		assertEquals((short)3, ((INumberBeanProxy) result).shortValue());
-	}	
-	
-	public void testClassInstanceCreationNullArg() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createClassInstanceCreation(ForExpression.ROOTEXPRESSION, "testPackage.TestCtorWithNull", 1);
-		exp.createNull(ForExpression.CLASSINSTANCECREATION_ARGUMENT);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("testPackage.TestCtorWithNull", result.getTypeProxy().getFormalTypeName());
-	}	
-	
-	public void testClassInstanceCreationMismatchArg() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createClassInstanceCreation(ForExpression.ROOTEXPRESSION, "testPackage.TestCtorWithNull", 1);
-		try {
-			exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 1);
-			exp.getExpressionValue();
-			fail("Exception should of been thrown.");
-		} catch (ThrowableProxy e) {
-			assertEquals("java.lang.NoSuchMethodException", e.getTypeProxy().getFormalTypeName());
-		}
-	}	
-	
-	public void testFieldAccessStatic() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createFieldAccess(ForExpression.ROOTEXPRESSION, "RED", true);
-		exp.createTypeReceiver("java.awt.Color");
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("java.awt.Color", result.getTypeProxy().getFormalTypeName());
-		IBeanTypeProxy colorType = result.getTypeProxy();
-		IMethodProxy red = colorType.getMethodProxy("getRed");
-		IMethodProxy green = colorType.getMethodProxy("getGreen");
-		IMethodProxy blue = colorType.getMethodProxy("getBlue");
-		assertEquals(255, ((INumberBeanProxy) red.invoke(result)).intValue());
-		assertEquals(0, ((INumberBeanProxy) green.invoke(result)).intValue());
-		assertEquals(0, ((INumberBeanProxy) blue.invoke(result)).intValue());
-	}
-	
-	public void testFieldAccessSetStatic() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createAssignmentExpression(ForExpression.ROOTEXPRESSION);
-		exp.createFieldAccess(ForExpression.ASSIGNMENT_LEFT, "STATIC_FIELD", true);
-		exp.createTypeReceiver("testPackage.TestAccess");
-		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, 23);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getFormalTypeName());
-		assertEquals(23, ((INumberBeanProxy) result).intValue());
-	}
-	
-	
-	public void testFieldAccessNonStatic() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createFieldAccess(ForExpression.ROOTEXPRESSION, "x", true);
-		exp.createClassInstanceCreation(ForExpression.FIELD_RECEIVER, "java.awt.Point", 2);
-		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 1);
-		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 2);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getFormalTypeName());
-		assertEquals(1, ((INumberBeanProxy) result).intValue());
-	}
-	
-	public void testFieldAccessSetNonStatic() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createAssignmentExpression(ForExpression.ROOTEXPRESSION);
-		exp.createFieldAccess(ForExpression.ASSIGNMENT_LEFT, "x", true);
-		exp.createClassInstanceCreation(ForExpression.FIELD_RECEIVER, "java.awt.Point", 2);
-		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 1);
-		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 2);
-		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, 23);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getFormalTypeName());
-		assertEquals(23, ((INumberBeanProxy) result).intValue());
-	}	
-
-	public void testFieldAccessSetNonStaticSimple() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		// First create using normal proxy stuff, then test the expression processor.
-		IBeanTypeProxy pointType = proxyTypeFactory.getBeanTypeProxy("java.awt.Point");
-		IFieldProxy xFieldProxy = pointType.getFieldProxy("x");
-		IBeanProxy pointProxy = pointType.getConstructorProxy(new String[] {"int", "int"}).newInstance(new IBeanProxy[] {proxyFactory.createBeanProxyWith(1), proxyFactory.createBeanProxyWith(2)});
-		
-		IExpression exp = proxyFactory.createExpression();
-		ExpressionProxy ep = exp.createSimpleFieldSet(xFieldProxy, pointProxy, proxyFactory.createBeanProxyWith(23), true);
-		ep.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy result = event.getProxy();
-				assertNotNull(result);
-				assertEquals("int", result.getTypeProxy().getFormalTypeName());
-				assertEquals(23, ((INumberBeanProxy) result).intValue());
-			}
-		});
-		exp.invokeExpression();
-	}
-
-	public void testFieldAccessNonStaticSimple() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		// First create using normal proxy stuff, then test the expression processor.
-		IBeanTypeProxy pointType = proxyTypeFactory.getBeanTypeProxy("java.awt.Point");
-		IFieldProxy xFieldProxy = pointType.getFieldProxy("x");
-		IBeanProxy pointProxy = pointType.getConstructorProxy(new String[] {"int", "int"}).newInstance(new IBeanProxy[] {proxyFactory.createBeanProxyWith(1), proxyFactory.createBeanProxyWith(2)});
-		
-		IExpression exp = proxyFactory.createExpression();
-		ExpressionProxy ep = exp.createSimpleFieldAccess(xFieldProxy, pointProxy);
-		ep.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy result = event.getProxy();
-				assertNotNull(result);
-				assertEquals("int", result.getTypeProxy().getFormalTypeName());
-				assertEquals(1, ((INumberBeanProxy) result).intValue());
-			}
-		});
-		exp.invokeExpression();
-	}
-
-	public void testFieldAccessNonStaticWithProxy() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IBeanTypeProxy pointType = proxyTypeFactory.getBeanTypeProxy("java.awt.Point");
-		IExpression exp = proxyFactory.createExpression();
-		exp.createFieldAccess(ForExpression.ROOTEXPRESSION, pointType.getFieldProxy("x"), true);
-		exp.createClassInstanceCreation(ForExpression.FIELD_RECEIVER, "java.awt.Point", 2);
-		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 1);
-		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 2);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getFormalTypeName());
-		assertEquals(1, ((INumberBeanProxy) result).intValue());
-	}	
-	
-	public void testFieldAccessFailWithExpressionProxy() throws IllegalStateException, NoExpressionValueException {
-		IBeanTypeProxy pointType = proxyTypeFactory.getBeanTypeProxy("java.awt.Point");
-		IExpression exp = proxyFactory.createExpression();
-		try {
-			exp.createFieldAccess(ForExpression.ROOTEXPRESSION, pointType.getFieldProxy(exp, "z"), true);
-			exp.createClassInstanceCreation(ForExpression.FIELD_RECEIVER, "java.awt.Point", 2);
-			exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 1);
-			exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 2);
-			exp.getExpressionValue();
-			fail("Should of had exception");
-		} catch (ThrowableProxy e) {
-			assertEquals("java.lang.NoSuchFieldException", e.getTypeProxy().getFormalTypeName());
-		}
-	}
-
-	public void testMethodInvokeStatic() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, "valueOf", true, 1);
-		exp.createTypeReceiver("java.lang.String");
-		exp.createPrimitiveLiteral(ForExpression.METHOD_ARGUMENT, true);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("java.lang.String", result.getTypeProxy().getFormalTypeName());
-		assertEquals("true", ((IStringBeanProxy) result).stringValue());
-	}
-	
-	public void testMethodInvokeProxyFail() throws IllegalStateException, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		IBeanTypeProxy intType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer");
-		try {
-			exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, intType.getMethodProxy(exp, "goobldy-gook"), true, 1);
-			exp.createClassInstanceCreation(ForExpression.METHOD_RECEIVER, intType, 1);
-			exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 3);
-			exp.createClassInstanceCreation(ForExpression.METHOD_ARGUMENT, "java.lang.Integer", 1);
-			exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 4);
-			exp.getExpressionValue();
-			fail("Should of gotten exception");
-		} catch (ThrowableProxy e) {
-			assertEquals("java.lang.NoSuchMethodException", e.getTypeProxy().getFormalTypeName());
-		}
-	}
-
-	public void testMethodInvokeNonStatic() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, "compareTo", true, 1);
-		exp.createClassInstanceCreation(ForExpression.METHOD_RECEIVER, "java.lang.Integer", 1);
-		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 3);
-		exp.createClassInstanceCreation(ForExpression.METHOD_ARGUMENT, "java.lang.Integer", 1);
-		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 4);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getFormalTypeName());
-		assertTrue("CompareTo wasn't less than 0.", ((INumberBeanProxy) result).intValue() < 0);
-	}
-	
-	public void testMethodInvokeNonStaticWithProxy() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IBeanTypeProxy integerType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer");
-		IExpression exp = proxyFactory.createExpression();
-		exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, integerType.getMethodProxy("compareTo", new IBeanTypeProxy[] {integerType}), true, 1);
-		exp.createClassInstanceCreation(ForExpression.METHOD_RECEIVER, "java.lang.Integer", 1);
-		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 3);
-		exp.createClassInstanceCreation(ForExpression.METHOD_ARGUMENT, "java.lang.Integer", 1);
-		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 4);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getFormalTypeName());
-		assertTrue("CompareTo wasn't less than 0.", ((INumberBeanProxy) result).intValue() < 0);
-	}
-	
-	public void testConditionalTrue() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createConditionalExpression(ForExpression.ROOTEXPRESSION);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_CONDITION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_TRUE, InfixOperator.IN_PLUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_FALSE, InfixOperator.IN_MINUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getFormalTypeName());
-		assertEquals(6, ((INumberBeanProxy) result).intValue());
-	}
-	
-	public void testConditionalFalse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createConditionalExpression(ForExpression.ROOTEXPRESSION);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_CONDITION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_TRUE, InfixOperator.IN_PLUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_FALSE, InfixOperator.IN_MINUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getFormalTypeName());
-		assertEquals(0, ((INumberBeanProxy) result).intValue());
-	}
-	
-	public void testNestedConditionalTrueTrue() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createConditionalExpression(ForExpression.ROOTEXPRESSION);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_CONDITION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createConditionalExpression(ForExpression.CONDITIONAL_TRUE);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_CONDITION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_TRUE, InfixOperator.IN_PLUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 4);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_FALSE, InfixOperator.IN_MINUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_FALSE, InfixOperator.IN_MINUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 5);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getFormalTypeName());
-		assertEquals(8, ((INumberBeanProxy) result).intValue());
-	}
-	
-	public void testNestedConditionalFalseFalse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createConditionalExpression(ForExpression.ROOTEXPRESSION);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_CONDITION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 2);
-		exp.createConditionalExpression(ForExpression.CONDITIONAL_TRUE);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_CONDITION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 2);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_TRUE, InfixOperator.IN_PLUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 4);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_FALSE, InfixOperator.IN_MINUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createInfixExpression(ForExpression.CONDITIONAL_FALSE, InfixOperator.IN_MINUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 5);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int", result.getTypeProxy().getFormalTypeName());
-		assertEquals(2, ((INumberBeanProxy) result).intValue());
-	}	
-	
-	public void testVoidReturnType() throws IllegalStateException, ThrowableProxy {
-		IExpression exp = proxyFactory.createExpression();
-		try {
-			exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
-			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
-			exp.createMethodInvocation(ForExpression.INFIX_RIGHT, "gc", true, 0);
-			exp.createTypeReceiver("java.lang.System");
-			exp.getExpressionValue();
-			fail("Should of received no expression value exception.");
-		} catch (NoExpressionValueException e) {
-			if (e.getLocalizedMessage() != null)
-				System.out.println("Test was successful: "+e.getLocalizedMessage());
-		}
-	}
-	
-	public void testWrongReturnType() throws ThrowableProxy, IllegalStateException, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		try {
-			exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
-			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
-			exp.createMethodInvocation(ForExpression.INFIX_RIGHT, "getSecurityManager", true, 0);
-			exp.createTypeReceiver("java.lang.System");
-			exp.getExpressionValue();
-			fail("Should of received class cast proxy exception.");
-		} catch (ThrowableProxy e) {
-			if (!e.getTypeProxy().getFormalTypeName().equals("java.lang.IllegalArgumentException"))
-				throw e;	// Some other exception, rethrow it.
-		}
-	}
-	
-	public void testInvoke() throws ThrowableProxy, IllegalStateException, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, "getSecurityManager", true, 0);
-		exp.createTypeReceiver("java.lang.System");
-		exp.invokeExpression();
-	}
-	
-	public void testInvokeFail() throws ThrowableProxy, IllegalStateException, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		try {
-			exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, "getenv", true, 1);
-			exp.createTypeReceiver("java.lang.System");
-			exp.createStringLiteral(ForExpression.METHOD_ARGUMENT, "xyz");
-			exp.invokeExpression();
-		} catch (ThrowableProxy e) {
-			if (!e.getTypeProxy().getFormalTypeName().equals("java.lang.Error"))
-				throw e;	// Some other exception, rethrow it.
-		}
-	}
-	
-	public void testAssignment() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		ExpressionProxy ep = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-		final long[] time = new long[1];
-		ep.addProxyListener(new ExpressionResolved() {
-			
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyAdapter#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				time[0] = ((INumberBeanProxy) event.getProxy()).longValue();
-			}
-		});
-		exp.createMethodInvocation(ForExpression.ASSIGNMENT_RIGHT, "currentTimeMillis", true, 0);
-		exp.createTypeReceiver("java.lang.System");
-		exp.invokeExpression();
-		assertTrue(0L != time[0]);
-	}
-	
-	public void testReassignment() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		ExpressionProxy ep = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-		final long[] time = new long[1];
-		ep.addProxyListener(new ExpressionResolved() {
-			
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyAdapter#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				time[0] = ((INumberBeanProxy) event.getProxy()).longValue();
-			}
-		});
-		exp.createMethodInvocation(ForExpression.ASSIGNMENT_RIGHT, "currentTimeMillis", true, 0);
-		exp.createTypeReceiver("java.lang.System");
-		exp.createProxyReassignmentExpression(ForExpression.ROOTEXPRESSION, ep);
-		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, -23L);
-		exp.invokeExpression();
-		assertEquals(-23L, time[0]);
-	}
-	
-	public void testAssignmentVoid() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		ExpressionProxy ep = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-		ExpressionVoid epl = new ExpressionVoid();
-		ep.addProxyListener(epl);
-		exp.createMethodInvocation(ForExpression.ASSIGNMENT_RIGHT, "testVoid", true, 0);
-		exp.createTypeReceiver("testPackage.TestAccess");
-		exp.invokeExpression();
-		assertTrue(epl.voidCalled);
-	}
-	
-	public void testAssignmentNot() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createConditionalExpression(ForExpression.ROOTEXPRESSION);
-		exp.createPrimitiveLiteral(ForExpression.CONDITIONAL_CONDITION, true);
-		exp.createPrimitiveLiteral(ForExpression.CONDITIONAL_TRUE, true);
-		ExpressionProxy ep = exp.createProxyAssignmentExpression(ForExpression.CONDITIONAL_FALSE);
-		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, false);
-		ExpressionNotResolved epl = new ExpressionNotResolved();
-		ep.addProxyListener(epl);
-		exp.invokeExpression();
-		assertTrue(epl.notResolvedCalled);
-	}
-
-	public void testAssignmentLaterUsage() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		// eparg = 3;
-		// epInteger = new Integer(eparg+1);
-		IExpression exp = proxyFactory.createExpression();
-		ExpressionProxy epArg = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION); 
-		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, 3);
-		ExpressionProxy epInteger = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-		exp.createClassInstanceCreation(ForExpression.ASSIGNMENT_RIGHT, proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"), 1);
-		exp.createInfixExpression(ForExpression.CLASSINSTANCECREATION_ARGUMENT, InfixOperator.IN_PLUS, 0);
-		exp.createProxyExpression(ForExpression.INFIX_LEFT, epArg);	// Use literal 3+1 as the argument to this.
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 1); 
-		epInteger.addProxyListener(new ExpressionResolved() {
-			
-			
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyAdapter#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				assertEquals(((INumberBeanProxy) event.getProxy()).intValue(), 4);
-			}			
-		});
-		exp.invokeExpression();
-	}
-	
-	// TODO - for some unknown reason this test continues to fail in the build on the jvelinux machine. It seems to have
-	// very very poor performance on jvelinux.
-	// If we can get it working, put "test" on the front of the method name again to get it running as a test.
-	public void ExpressionPerformanceSmall() throws IllegalStateException, NoExpressionValueException, ThrowableProxy, AmbiguousMethodException, NoSuchMethodException {
-		// Small performance test. We are testing a small batch of expressions on each run. We then avg. the runs. This tests many small
-		// expression processing performance.
-		 
-		// Prime the proxies so they don't become part of the timings.
-		IBeanTypeProxy pointType = proxyTypeFactory.getBeanTypeProxy("java.awt.Point");
-		IMethodProxy setLocation = pointType.getMethodProxy("setLocation", new String[] {"int", "int"});
-		IMethodProxy getLocation = pointType.getMethodProxy("getLocation");
-		//
-		// Now for just a simple one method invocation using method proxies (and not method lookup each time) the standard proxy calls
-		// will beat out expression processing for Remote. Note that is not true of IDE vm. In that case the standard proxy calls
-		// will ALWAYS out perform greatly the expression processer because there is no latency in the communications. It is basically
-		// straight direct calls. While expression processing is also direct calls, the call path is much larger because it needs to 
-		// build/maintain/execute the processing stack, rather than just execute the command. 
-		//
-		
-		// Try to prime the communication pump. This sends about 36,000 bytes of data.
-		// Doing it here means later when needed the communications costs are drastically reduced.
-		IExpression exp = proxyFactory.createExpression();
-		int i =1000;
-		while (i-->0) {
-			exp.createArrayCreation(ForExpression.ROOTEXPRESSION, registry.getBeanTypeProxyFactory()
-					.getBeanTypeProxy(exp, "java.lang.Object", 1), 0);
-			exp.createArrayInitializer(0);
-		}
-		exp.invokeExpression();
-		
-		int times = 100;	// Number of times to run the test.
-		int batchSize = 10;	// Size of batch for each test.		
-		// Now do the actual test.
-		long start = System.currentTimeMillis();
-		i = times;
-		while(i-->0) {
-			expressionSetting(pointType, setLocation, getLocation, batchSize);
-		}
-		
-		long expressionTime = System.currentTimeMillis()-start;
-		long startNormal = System.currentTimeMillis();
-		i = times;
-		while(i-->0) {
-			normalSetting(pointType, setLocation, getLocation, batchSize);
-		}
-		long normalTime = System.currentTimeMillis()-startNormal;
-		System.out.println("Small Batch results: Batch size="+batchSize+" Number of runs="+times);
-		System.out.println("Expression Time: " + expressionTime + " Avg: " + (expressionTime/((double) times)));
-		System.out.println("Normal Time: " + normalTime+ " Avg: " + (normalTime/((double) times)));
-		if (normalTime == 0)
-			normalTime = 1;	// So no divide by zero.
-		int improvement = (int) ((1-((double) expressionTime)/normalTime)*100);
-		System.out.println("Improvement of expression over normal time: "+improvement+'%');
-		// Note that this test is not valid for IDE because the IDE will always be other way around because
-		// there is no latency delay there.
-
-		if (!(proxyFactory instanceof IDEStandardBeanProxyFactory))
-			assertTrue("Less than 30% improvement: "+improvement+'%', improvement>=30);	// We like this %.
-	}
-
-	// TODO - for some unknown reason this test continues to fail in the build on the jvelinux machine. It seems to have
-	// very very poor performance on jvelinux.
-	// If we can get it working, put "test" on the front of the method name again to get it running as a test.
-	public void ExpressionPerformanceLarge() throws IllegalStateException, NoExpressionValueException, ThrowableProxy, AmbiguousMethodException, NoSuchMethodException {
-		// Small performance test. We are testing a large batch of expressions on each run. We then avg. the runs. This tests many large
-		// expression processing performance.
-		 
-		// Prime the proxies so they don't become part of the timings.
-		IBeanTypeProxy pointType = proxyTypeFactory.getBeanTypeProxy("java.awt.Point");
-		IMethodProxy setLocation = pointType.getMethodProxy("setLocation", new String[] {"int", "int"});
-		IMethodProxy getLocation = pointType.getMethodProxy("getLocation");
-		//
-		// Now for just a simple one method invocation using method proxies (and not method lookup each time) the standard proxy calls
-		// will beat out expression processing for Remote. Note that is not true of IDE vm. In that case the standard proxy calls
-		// will ALWAYS out perform greatly the expression processer because there is no latency in the communications. It is basically
-		// straight direct calls. While expression processing is also direct calls, the call path is much larger because it needs to 
-		// build/maintain/execute the processing stack, rather than just execute the command. 
-		//
-		
-		// Try to prime the communication pump. This sends about 36,000 bytes of data.
-		// Doing it here means later when needed the communications costs are drastically reduced.
-		IExpression exp = proxyFactory.createExpression();
-		int i =1000;
-		while (i-->0) {
-			exp.createArrayCreation(ForExpression.ROOTEXPRESSION, registry.getBeanTypeProxyFactory()
-					.getBeanTypeProxy(exp, "java.lang.Object", 1), 0);
-			exp.createArrayInitializer(0);
-		}
-		exp.invokeExpression();
-		
-		int times = 25;	// Number of times to run the test.
-		int batchSize = 100;	// Size of batch for each test.
-		
-		// Now do the actual test.
-		long start = System.currentTimeMillis();
-		i = times;
-		while(i-->0) {
-			expressionSetting(pointType, setLocation, getLocation, batchSize);
-		}
-		long expressionTime = System.currentTimeMillis()-start;
-		long startNormal = System.currentTimeMillis();
-		i = times;
-		while(i-->0) {
-			normalSetting(pointType, setLocation, getLocation, batchSize);
-		}
-		long normalTime = System.currentTimeMillis()-startNormal;
-		System.out.println("Large Batch results: Batch size="+batchSize+" Number of runs="+times);
-		System.out.println("Expression Time: " + expressionTime + " Avg: " + (expressionTime/((double) times)));
-		System.out.println("Normal Time: " + normalTime+ " Avg: " + (normalTime/((double) times)));
-		if (normalTime == 0)
-			normalTime = 1;	// So no divide by zero.
-		int improvement = (int) ((1-((double) expressionTime)/normalTime)*100);
-		System.out.println("Improvement of expression over normal time: "+improvement+'%');
-		// Note that this test is not valid for IDE because the IDE will always be other way around because
-		// there is no latency delay there.
-		if (!(proxyFactory instanceof IDEStandardBeanProxyFactory))
-			assertTrue("Less than 75% improvement: "+improvement+'%', improvement>=75);	// We like this %.
-	}
-	
-	private void expressionSetting(IBeanTypeProxy pointType, IMethodProxy setLocation, IMethodProxy getLocation, int times) throws ThrowableProxy, NoExpressionValueException {
-		// This is the same as expressionSetting except it uses regular proxy access instead of expressions. It should be
-		// slower because it requires a round trip for each access. For remote only.
-		// To factor out the overhead of the initialization of the expression processing, we will do the create/set/get 10 times.
-		// Point p = new Point();
-		// p.setLocation(3,4);
-		// p.getLocation();
-		IExpression exp = proxyFactory.createExpression();
-		for (int i = 0; i < times; i++) {
-			ExpressionProxy epPoint = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-			exp.createClassInstanceCreation(ForExpression.ASSIGNMENT_RIGHT, pointType, 0);
-			exp.createSimpleMethodInvoke(setLocation, epPoint, new IProxy[] {proxyFactory.createBeanProxyWith(3), proxyFactory.createBeanProxyWith(4)}, false);
-			ExpressionProxy epLoc = exp.createSimpleMethodInvoke(getLocation, epPoint, null, true);
-			epLoc.addProxyListener(new ExpressionProxy.ProxyAdapter()); // Just have a listener, we want the callback overhead added in.
-		}
-		exp.invokeExpression();
-	}
-
-	private void normalSetting(IBeanTypeProxy pointType, IMethodProxy setLocation, IMethodProxy getLocation, int times) throws ThrowableProxy, AmbiguousMethodException, NoSuchMethodException {
-		// This is the same as expressionSetting except it uses regular proxy access instead of expressions. It should be
-		// slower because it requires a round trip for each access.
-		// To factor out the overhead of the initialization of the expression processing, we will do the create/set/get 10 times. This here matches that.
-		// Point p = new Point();
-		// p.setLocation(3,4);
-		for (int i = 0; i < times; i++) {
-			IBeanProxy epPoint = pointType.newInstance();
-			setLocation.invokeCatchThrowableExceptions(epPoint,	new IBeanProxy[] {proxyFactory.createBeanProxyWith(3), proxyFactory.createBeanProxyWith(4)});
-			getLocation.invokeCatchThrowableExceptions(epPoint);
-		}
-	}
-	
-	public void testBlock() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		int blocknum = exp.createBlockBegin();
-		ExpressionProxy epArg = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION); 
-		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, true);
-		exp.createBlockBreak(blocknum);
-		ExpressionProxy epBoolean = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-		exp.createClassInstanceCreation(ForExpression.ASSIGNMENT_RIGHT, proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), 1);
-		exp.createInfixExpression(ForExpression.CLASSINSTANCECREATION_ARGUMENT, InfixOperator.IN_CONDITIONAL_AND, 0);
-		exp.createProxyExpression(ForExpression.INFIX_LEFT, epArg);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, true);
-		exp.createBlockEnd();
-		ExpressionNotResolved epBooleanl = new ExpressionNotResolved();
-		epBoolean.addProxyListener(epBooleanl);
-		exp.invokeExpression();
-		assertTrue(epBooleanl.notResolvedCalled);
-	}
-
-	/*
-	 * A proxy listener class for test purposes that requires resolved but
-	 * won't allow not resolved or void resolution. Impliment the resolved
-	 * method to test for valid values.
-	 * 
-	 * @since 1.1.0
-	 */
-	protected abstract class ExpressionResolved implements ExpressionProxy.ProxyListener {
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyNotResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-		 */
-		public void proxyNotResolved(ProxyEvent event) {
-			fail("Proxy must not be unresolved.");
-		}
-		
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyVoid(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-		 */
-		public void proxyVoid(ProxyEvent event) {
-			fail("Proxy must not be void assignment.");
-		}
-	}
-	
-	protected class ExpressionNotResolved implements ExpressionProxy.ProxyListener {
-		public boolean notResolvedCalled = false;
-		
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyNotResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-		 */
-		public void proxyNotResolved(ProxyEvent event) {
-			notResolvedCalled = true;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-		 */
-		public void proxyResolved(ProxyEvent event) {
-			fail("Proxy should not of been resolved. It should be unresolved.");
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyVoid(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-		 */
-		public void proxyVoid(ProxyEvent event) {
-			fail("Proxy must not be void assignment. It should be unresolved.");
-		}
-	};
-
-	protected class ExpressionVoid implements ExpressionProxy.ProxyListener {
-		public boolean voidCalled = false;
-		
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyNotResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-		 */
-		public void proxyNotResolved(ProxyEvent event) {
-			fail("Proxy should of been void and not unresolved.");
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-		 */
-		public void proxyResolved(ProxyEvent event) {
-			fail("Proxy should not of been resolved, it should of been void..");
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyVoid(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-		 */
-		public void proxyVoid(ProxyEvent event) {
-			voidCalled = true;
-		}
-	};
-
-	public void testTryCatchNoThrow() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   x = Boolean.valueOf(true);
-		 * } catch (RuntimeException e) {
-		 *   y = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);
-		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-		xProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertTrue(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-
-		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
-		yProxy.addProxyListener(yProxyResolver);
-		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
-		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
-		exp.invokeExpression();
-		
-		assertTrue(yProxyResolver.notResolvedCalled);
-		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
-		
-	}
-
-	public void testTry2CatchNoThrow() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   try {
-		 *     x = Boolean.valueOf(true);
-		 *   } catch (RuntimeException e) {
-		 *     y = Boolean.valueOf(false);
-		 *   }
-		 * } catch (RuntimeException e) {
-		 *   z = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);
-		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-		ExpressionProxy runtimeCatchExceptionProxy2 = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-
-		xProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertTrue(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-
-		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
-		yProxy.addProxyListener(yProxyResolver);
-		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
-		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
-		ExpressionNotResolved zProxyResolver = new ExpressionNotResolved();
-		zProxy.addProxyListener(zProxyResolver);
-		ExpressionNotResolved runtimeCatchExceptionProxyResolver2 = new ExpressionNotResolved();
-		runtimeCatchExceptionProxy2.addProxyListener(runtimeCatchExceptionProxyResolver2);
-		
-		exp.invokeExpression();
-		
-		assertTrue(yProxyResolver.notResolvedCalled);
-		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
-		assertTrue(zProxyResolver.notResolvedCalled);
-		assertTrue(runtimeCatchExceptionProxyResolver2.notResolvedCalled);
-		
-	}
-
-	public void testTry2CatchThrowTry1() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   w = (null).booleanValue();
-		 *   try {
-		 *     x = Boolean.valueOf(true);
-		 *   } catch (RuntimeException e) {
-		 *     y = Boolean.valueOf(false);
-		 *   }
-		 * } catch (RuntimeException e) {
-		 *   z = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		ExpressionProxy wProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);		
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);
-		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-		ExpressionProxy runtimeCatchExceptionProxy2 = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-
-		ExpressionNotResolved wProxyResolver = new ExpressionNotResolved();
-		wProxy.addProxyListener(wProxyResolver);
-
-		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
-		xProxy.addProxyListener(xProxyResolver);
-
-		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
-		yProxy.addProxyListener(yProxyResolver);
-		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
-		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
-		zProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-		runtimeCatchExceptionProxy2.addProxyListener(new ExpressionResolved() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
-			}
-		});
-		
-		exp.invokeExpression();
-		
-		assertTrue(wProxyResolver.notResolvedCalled);
-		assertTrue(xProxyResolver.notResolvedCalled);
-		assertTrue(yProxyResolver.notResolvedCalled);
-		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
-		
-	}
-
-	public void testTry2CatchThrowTry2Catch() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   try {
-		 *     x = (null).booleanValue();
-		 *   } catch (RuntimeException e) {
-		 *     y = Boolean.valueOf(false);
-		 *   }
-		 *   w = Boolean.valueOf(true);
-		 * } catch (RuntimeException e) {
-		 *   z = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
-		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-		ExpressionProxy wProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);		
-		ExpressionProxy runtimeCatchExceptionProxy2 = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-
-		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
-		xProxy.addProxyListener(xProxyResolver);
-		runtimeCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
-			}
-		});
-
-		yProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});		
-		wProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertTrue(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-		
-		ExpressionNotResolved runtimeCatchExceptionProxyResolver2 = new ExpressionNotResolved();
-		runtimeCatchExceptionProxy2.addProxyListener(runtimeCatchExceptionProxyResolver2);
-		ExpressionNotResolved zProxyResolver = new ExpressionNotResolved();
-		zProxy.addProxyListener(zProxyResolver);
-		
-		exp.invokeExpression();
-		
-		assertTrue(xProxyResolver.notResolvedCalled);
-		assertTrue(runtimeCatchExceptionProxyResolver2.notResolvedCalled);
-		assertTrue(zProxyResolver.notResolvedCalled);
-		
-	}
-
-	public void testTry2CatchThrowTry2Catch1() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   try {
-		 *     x = (null).booleanValue();
-		 *   } catch (IllegalArgumentException e) {
-		 *     y = Boolean.valueOf(false);
-		 *   }
-		 *   w = Boolean.valueOf(true);
-		 * } catch (RuntimeException e) {
-		 *   z = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
-		ExpressionProxy illegalArgumentCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-		ExpressionProxy wProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);		
-		ExpressionProxy runtimeCatchExceptionProxy2 = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-
-		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
-		xProxy.addProxyListener(xProxyResolver);
-		ExpressionNotResolved illegalArgumentCatchProxyResolver = new ExpressionNotResolved();
-		illegalArgumentCatchExceptionProxy.addProxyListener(illegalArgumentCatchProxyResolver);
-
-		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
-		yProxy.addProxyListener(yProxyResolver);
-		ExpressionNotResolved wProxyResolver = new ExpressionNotResolved();
-		wProxy.addProxyListener(wProxyResolver);
-		
-		runtimeCatchExceptionProxy2.addProxyListener(new ExpressionResolved() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
-			}
-		});
-		zProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-		
-		exp.invokeExpression();
-		
-		assertTrue(xProxyResolver.notResolvedCalled);
-		assertTrue(illegalArgumentCatchProxyResolver.notResolvedCalled);
-		assertTrue(yProxyResolver.notResolvedCalled);
-		assertTrue(wProxyResolver.notResolvedCalled);
-		
-	}
-
-	public void testTry2CatchThrowTry2Finally2Catch1() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   try {
-		 *     x = (null).booleanValue();
-		 *   } catch (IllegalArgumentException e) {
-		 *     y = Boolean.valueOf(false);
-		 *   } finally {
-		 *     v = Boolean.valueOf(false);
-		 *   }
-		 *   w = Boolean.valueOf(true);
-		 * } catch (RuntimeException e) {
-		 *   z = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
-		ExpressionProxy illegalArgumentCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryFinallyClause();
-		ExpressionProxy vProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-		ExpressionProxy wProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);		
-		ExpressionProxy runtimeCatchExceptionProxy2 = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-
-		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
-		xProxy.addProxyListener(xProxyResolver);
-		ExpressionNotResolved illegalArgumentCatchProxyResolver = new ExpressionNotResolved();
-		illegalArgumentCatchExceptionProxy.addProxyListener(illegalArgumentCatchProxyResolver);
-
-		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
-		yProxy.addProxyListener(yProxyResolver);
-		vProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-
-		ExpressionNotResolved wProxyResolver = new ExpressionNotResolved();
-		wProxy.addProxyListener(wProxyResolver);
-		
-		runtimeCatchExceptionProxy2.addProxyListener(new ExpressionResolved() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
-			}
-		});
-		zProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-		
-		exp.invokeExpression();
-		
-		assertTrue(xProxyResolver.notResolvedCalled);
-		assertTrue(illegalArgumentCatchProxyResolver.notResolvedCalled);
-		assertTrue(yProxyResolver.notResolvedCalled);
-		assertTrue(wProxyResolver.notResolvedCalled);
-		
-	}
-
-	public void testTry2CatchThrowTry2Finally2NoCatch() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   try {
-		 *     x = (null).booleanValue();
-		 *   } catch (IllegalArgumentException e) {
-		 *     y = Boolean.valueOf(false);
-		 *   } finally {
-		 *     v = Boolean.valueOf(false);
-		 *   }
-		 *   w = Boolean.valueOf(true);
-		 * } catch (IllegalArgumentException e) {
-		 *   z = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
-		ExpressionProxy illegalArgumentCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryFinallyClause();
-		ExpressionProxy vProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-		ExpressionProxy wProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);		
-		ExpressionProxy illegalArgumentCatchExceptionProxy2 = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
-		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-
-		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
-		xProxy.addProxyListener(xProxyResolver);
-		ExpressionNotResolved illegalArgumentCatchProxyResolver = new ExpressionNotResolved();
-		illegalArgumentCatchExceptionProxy.addProxyListener(illegalArgumentCatchProxyResolver);
-
-		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
-		yProxy.addProxyListener(yProxyResolver);
-		vProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-
-		ExpressionNotResolved wProxyResolver = new ExpressionNotResolved();
-		wProxy.addProxyListener(wProxyResolver);
-		
-		ExpressionNotResolved illegalArgumentCatchExceptionProxyResolver2 = new ExpressionNotResolved();
-		illegalArgumentCatchExceptionProxy2.addProxyListener(illegalArgumentCatchExceptionProxyResolver2);
-		ExpressionNotResolved zProxyResolver = new ExpressionNotResolved();
-		zProxy.addProxyListener(zProxyResolver);
-		
-		boolean didit = false;
-		try {
-			exp.invokeExpression();
-		} catch (ThrowableProxy e) {
-			assertEquals(proxyTypeFactory.getBeanTypeProxy("java.lang.NullPointerException"), e.getTypeProxy());
-			didit = true;
-		}
-		
-		assertTrue(didit);
-		assertTrue(xProxyResolver.notResolvedCalled);
-		assertTrue(illegalArgumentCatchProxyResolver.notResolvedCalled);
-		assertTrue(yProxyResolver.notResolvedCalled);
-		assertTrue(wProxyResolver.notResolvedCalled);
-		assertTrue(illegalArgumentCatchExceptionProxyResolver2.notResolvedCalled);
-		assertTrue(zProxyResolver.notResolvedCalled);
-		
-	}
-	
-	public void testTryCatchThrow() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   x = (null).booleanValue();
-		 * } catch (NullPointerException e) {
-		 *   y = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
-		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
-		xProxy.addProxyListener(xProxyResolver);		
-		yProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-
-		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
-			}
-		});
-		exp.invokeExpression();
-		assertTrue(xProxyResolver.notResolvedCalled);
-	}
-
-	public void testTryCatchRethrow() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   x = (null).booleanValue();
-		 * } catch (NullPointerException e) {
-		 *   y = Boolean.valueOf(false);
-		 *   throw e; // As a rethrow.
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
-		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createRethrow();
-		exp.createTryEnd();
-		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
-		xProxy.addProxyListener(xProxyResolver);		
-		yProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-
-		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
-			}
-		});
-		try {
-			exp.invokeExpression();
-			fail("Should of thrown NPE.");
-		} catch (ThrowableProxy e) {
-			assertEquals("java.lang.NullPointerException", e.getTypeProxy().getTypeName());
-		}
-		assertTrue(xProxyResolver.notResolvedCalled);
-	}
-
-	
-	public void testTryCatchExplicitThrow() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   x = Boolean.valueOf(true);
-		 *   throw new NullPointerException();
-		 *   y = Boolean.valueOf(false);
-		 * } catch (NullPointerException e) {
-		 *   z = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);
-		exp.createThrow();
-		exp.createClassInstanceCreation(ForExpression.THROW_OPERAND, proxyTypeFactory.getBeanTypeProxy("java.lang.NullPointerException"), 0);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.NullPointerException"), true);
-		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-		xProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertTrue(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
-		yProxy.addProxyListener(yProxyResolver);
-
-		zProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-
-		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
-			}
-		});
-		exp.invokeExpression();
-		assertTrue(yProxyResolver.notResolvedCalled);
-	}
-
-	public void testTryCatch2NoThrow() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   x = Boolean.valueOf(true);
-		 * } catch (IllegalArgumentException e) {
-		 *   y = Boolean.valueOf(false);
-		 * } catch (RuntimeException e) {
-		 *   z = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);
-		ExpressionProxy illegalCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
-		exp.createTryEnd();
-		xProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertTrue(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-
-		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
-		yProxy.addProxyListener(yProxyResolver);
-		ExpressionNotResolved illegalCatchExceptionProxyResolver = new ExpressionNotResolved();
-		illegalCatchExceptionProxy.addProxyListener(illegalCatchExceptionProxyResolver);
-		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
-		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
-		ExpressionNotResolved zProxyResolver = new ExpressionNotResolved();
-		zProxy.addProxyListener(zProxyResolver);
-		
-		exp.invokeExpression();
-		
-		assertTrue(yProxyResolver.notResolvedCalled);
-		assertTrue(illegalCatchExceptionProxyResolver.notResolvedCalled);
-		assertTrue(zProxyResolver.notResolvedCalled);
-		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
-		
-	}
-
-	public void testTryCatch2Throw1() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   x = (null).booleanValue();
-		 * } catch (NullPointerException e) {
-		 *   y = Boolean.valueOf(false);
-		 * } catch (RuntimeException e) {
-		 *   z = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
-		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.NullPointerException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
-		exp.createTryEnd();
-		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
-		xProxy.addProxyListener(xProxyResolver);		
-
-		yProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
-			}
-		});
-		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
-		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
-		ExpressionNotResolved zProxyResolver = new ExpressionNotResolved();
-		zProxy.addProxyListener(zProxyResolver);
-		
-		exp.invokeExpression();
-		
-		assertTrue(xProxyResolver.notResolvedCalled);
-		assertTrue(zProxyResolver.notResolvedCalled);
-		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
-		
-	}
-
-	public void testTryCatch2Throw2() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   x = (null).booleanValue();
-		 * } catch (IllegalArgumentException e) {
-		 *   y = Boolean.valueOf(false);
-		 * } catch (NullPointerException e) {
-		 *   z = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
-		ExpressionProxy illegalCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.NullPointerException"), true);
-		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
-		exp.createTryEnd();
-		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
-		xProxy.addProxyListener(xProxyResolver);		
-		ExpressionNotResolved illegalCatchExceptionProxyResolver = new ExpressionNotResolved();
-		illegalCatchExceptionProxy.addProxyListener(illegalCatchExceptionProxyResolver);
-		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
-		yProxy.addProxyListener(yProxyResolver);
-
-		zProxy.addProxyListener(new ExpressionResolved() { 
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
-			}
-		});		
-		exp.invokeExpression();
-		
-		assertTrue(xProxyResolver.notResolvedCalled);
-		assertTrue(yProxyResolver.notResolvedCalled);
-		assertTrue(illegalCatchExceptionProxyResolver.notResolvedCalled);
-		
-	}
-
-	public void testTryCatchThrowFinally() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   x = (null).booleanValue();
-		 * } catch (NullPointerException e) {
-		 *   y = Boolean.valueOf(false);
-		 * } finally {
-		 *   f = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
-		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryFinallyClause();
-		ExpressionProxy fProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
-		
-		exp.createTryEnd();
-		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
-		xProxy.addProxyListener(xProxyResolver);		
-		yProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-
-		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
-			}
-		});
-		
-		fProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-		
-		exp.invokeExpression();
-		assertTrue(xProxyResolver.notResolvedCalled);
-	}
-	
-	public void testTryCatch2Throw1Finally() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   x = (null).booleanValue();
-		 * } catch (NullPointerException e) {
-		 *   y = Boolean.valueOf(false);
-		 * } catch (RuntimeException e) {
-		 *   z = Boolean.valueOf(false);
-		 * } finally {
-		 *   f = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
-		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.NullPointerException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
-		exp.createTryFinallyClause();
-		ExpressionProxy fProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
-		exp.createTryEnd();
-		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
-		xProxy.addProxyListener(xProxyResolver);		
-
-		yProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
-			}
-		});
-		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
-		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
-		ExpressionNotResolved zProxyResolver = new ExpressionNotResolved();
-		zProxy.addProxyListener(zProxyResolver);
-		fProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-
-		exp.invokeExpression();
-		
-		
-		assertTrue(xProxyResolver.notResolvedCalled);
-		assertTrue(zProxyResolver.notResolvedCalled);
-		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
-		
-	}
-	
-	public void testTryCatch2Throw2Finally() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   x = (null).booleanValue();
-		 * } catch (IllegalArgumentException e) {
-		 *   y = Boolean.valueOf(false);
-		 * } catch (NullPointerException e) {
-		 *   z = Boolean.valueOf(false);
-		 * }  finally {
-		 *   f = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
-		ExpressionProxy illegalCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.NullPointerException"), true);
-		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
-		exp.createTryFinallyClause();
-		ExpressionProxy fProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
-		exp.createTryEnd();
-		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
-		xProxy.addProxyListener(xProxyResolver);		
-		ExpressionNotResolved illegalCatchExceptionProxyResolver = new ExpressionNotResolved();
-		illegalCatchExceptionProxy.addProxyListener(illegalCatchExceptionProxyResolver);
-		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
-		yProxy.addProxyListener(yProxyResolver);
-
-		zProxy.addProxyListener(new ExpressionResolved() { 
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
-			}
-		});	
-		
-		fProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});		
-		exp.invokeExpression();
-		
-		assertTrue(xProxyResolver.notResolvedCalled);
-		assertTrue(yProxyResolver.notResolvedCalled);
-		assertTrue(illegalCatchExceptionProxyResolver.notResolvedCalled);
-		
-	}
-	
-
-	public void testTryCatchNoThrowFinally() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   x = Boolean.valueOf(true);
-		 * } catch (RuntimeException e) {
-		 *   y = Boolean.valueOf(false);
-		 * } finally {
-		 *   f = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);
-		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryFinallyClause();
-		ExpressionProxy fProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		exp.createTryEnd();
-		xProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertTrue(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-
-		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
-		yProxy.addProxyListener(yProxyResolver);
-		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
-		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
-		fProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-		
-		exp.invokeExpression();
-		
-		assertTrue(yProxyResolver.notResolvedCalled);
-		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
-		
-	}
-
-	public void testTryCatch2NoThrowFinally() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		/*
-		 * try {
-		 *   x = Boolean.valueOf(true);
-		 * } catch (IllegalArgumentException e) {
-		 *   y = Boolean.valueOf(false);
-		 * } catch (RuntimeException e) {
-		 *   z = Boolean.valueOf(false);
-		 * } finally {
-		 *   f = Boolean.valueOf(false);
-		 * }
-		 */
-		IExpression exp = proxyFactory.createExpression();
-		exp.createTry();
-		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);
-		ExpressionProxy illegalCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
-		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
-		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
-		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
-		exp.createTryFinallyClause();
-		ExpressionProxy fProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
-		exp.createTryEnd();
-		xProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertTrue(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-
-		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
-		yProxy.addProxyListener(yProxyResolver);
-		ExpressionNotResolved illegalCatchExceptionProxyResolver = new ExpressionNotResolved();
-		illegalCatchExceptionProxy.addProxyListener(illegalCatchExceptionProxyResolver);
-		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
-		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
-		ExpressionNotResolved zProxyResolver = new ExpressionNotResolved();
-		zProxy.addProxyListener(zProxyResolver);
-		fProxy.addProxyListener(new ExpressionResolved() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
-			 */
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy proxy = event.getProxy();
-				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
-				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
-			}
-		});
-
-		exp.invokeExpression();
-		
-		assertTrue(yProxyResolver.notResolvedCalled);
-		assertTrue(illegalCatchExceptionProxyResolver.notResolvedCalled);
-		assertTrue(zProxyResolver.notResolvedCalled);
-		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
-		
-	}
-	
-
-	public void testIfElseTrueWithElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createIfElse(true);
-		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.IF_TRUE);
-		exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		ExpressionProxy falseProxy = exp.createProxyAssignmentExpression(ForExpression.IF_ELSE);		
-		exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_MINUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		
-		trueProxy.addProxyListener(new ExpressionResolved() {
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy value = event.getProxy();
-				assertNotNull(value);
-				assertEquals("int", value.getTypeProxy().getFormalTypeName());
-				assertEquals(6, ((INumberBeanProxy) value).intValue());
-			}
-		});
-
-		falseProxy.addProxyListener(new ExpressionNotResolved());
-		exp.invokeExpression();
-	}
-
-	public void testIfElseFalseWithElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createIfElse(true);
-		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.IF_TRUE);
-		exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		ExpressionProxy falseProxy = exp.createProxyAssignmentExpression(ForExpression.IF_ELSE);		
-		exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_MINUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-
-		trueProxy.addProxyListener(new ExpressionNotResolved());
-		
-		falseProxy.addProxyListener(new ExpressionResolved() {
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy value = event.getProxy();
-				assertNotNull(value);
-				assertEquals("int", value.getTypeProxy().getFormalTypeName());
-				assertEquals(0, ((INumberBeanProxy) value).intValue());
-			}
-		});
-
-		exp.invokeExpression();
-	}
-
-	public void testIfElseTrueWithoutElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createIfElse(false);
-		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.IF_TRUE);
-		exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		
-		trueProxy.addProxyListener(new ExpressionResolved() {
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy value = event.getProxy();
-				assertNotNull(value);
-				assertEquals("int", value.getTypeProxy().getFormalTypeName());
-				assertEquals(6, ((INumberBeanProxy) value).intValue());
-			}
-		});
-
-		exp.invokeExpression();
-	}
-	
-	public void testIfElseFalseWithoutElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createIfElse(false);
-		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.IF_TRUE);
-		exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		
-		trueProxy.addProxyListener(new ExpressionNotResolved());
-
-		exp.invokeExpression();
-	}
-
-	public void testIfElseBlocksTrueWithElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createIfElse(true);
-		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createBlockBegin();
-			ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-			exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
-			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-			exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createBlockEnd();
-		exp.createBlockBegin();
-			ExpressionProxy falseProxy = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);		
-			exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_MINUS, 0);
-			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-			exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createBlockEnd();
-		
-		trueProxy.addProxyListener(new ExpressionResolved() {
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy value = event.getProxy();
-				assertNotNull(value);
-				assertEquals("int", value.getTypeProxy().getFormalTypeName());
-				assertEquals(6, ((INumberBeanProxy) value).intValue());
-			}
-		});
-
-		falseProxy.addProxyListener(new ExpressionNotResolved());
-		exp.invokeExpression();
-	}
-
-	public void testIfElseBlocksFalseWithElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createIfElse(true);
-		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createBlockBegin();
-			ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-			exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
-			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-			exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createBlockEnd();
-		exp.createBlockBegin();
-			ExpressionProxy falseProxy = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);		
-			exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_MINUS, 0);
-			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-			exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createBlockEnd();
-
-		trueProxy.addProxyListener(new ExpressionNotResolved());
-		
-		falseProxy.addProxyListener(new ExpressionResolved() {
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy value = event.getProxy();
-				assertNotNull(value);
-				assertEquals("int", value.getTypeProxy().getFormalTypeName());
-				assertEquals(0, ((INumberBeanProxy) value).intValue());
-			}
-		});
-
-		exp.invokeExpression();
-	}
-
-	public void testIfElseBlockTrueWithoutElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createIfElse(false);
-		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createBlockBegin();
-			ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-			exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
-			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-			exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createBlockEnd();
-		
-		trueProxy.addProxyListener(new ExpressionResolved() {
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy value = event.getProxy();
-				assertNotNull(value);
-				assertEquals("int", value.getTypeProxy().getFormalTypeName());
-				assertEquals(6, ((INumberBeanProxy) value).intValue());
-			}
-		});
-
-		exp.invokeExpression();
-	}
-	
-	public void testIfElseBlockFalseWithoutElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createIfElse(false);
-		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createBlockBegin();
-			ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-			exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
-			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
-			exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
-		exp.createBlockEnd();
-		
-		trueProxy.addProxyListener(new ExpressionNotResolved());
-
-		exp.invokeExpression();
-	}	
-
-	public void testNewInitStringPrimitive() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		// Use internal expression class so we can test the special method.
-		Expression exp = (Expression) proxyFactory.createExpression();
-		ExpressionProxy result = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-		exp.createNewInstance(ForExpression.ASSIGNMENT_RIGHT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
-		result.addProxyListener(new ExpressionResolved(){
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy value = event.getProxy();
-				assertNotNull(value);
-				assertEquals("boolean", value.getTypeProxy().getFormalTypeName());
-				assertEquals(false, ((IBooleanBeanProxy) value).booleanValue());
-			}
-			
-		});
-		
-		exp.invokeExpression();
-	}
-	
-	public void testMark() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		// Just test having a mark and no errors.
-		Expression exp = (Expression) proxyFactory.createExpression();
-		int mark = exp.mark();
-		try {
-			ExpressionProxy result = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-			exp.createNewInstance(ForExpression.ASSIGNMENT_RIGHT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
-			result.addProxyListener(new ExpressionResolved(){
-				public void proxyResolved(ProxyEvent event) {
-					IBeanProxy value = event.getProxy();
-					assertNotNull(value);
-					assertEquals("boolean", value.getTypeProxy().getFormalTypeName());
-					assertEquals(false, ((IBooleanBeanProxy) value).booleanValue());
-				}
-				
-			});			
-		} finally {
-			exp.endMark(mark);
-		}
-		exp.invokeExpression();
-		
-	}
-	
-	public void testMark2() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		// Just test having a mark errors, but expressions before the mark and after the mark are successful.
-		Expression exp = (Expression) proxyFactory.createExpression();
-		int mark0 = exp.mark();
-		final boolean[] resultResolved = new boolean[1];
-		ExpressionNotResolved ep1 = null;
-		final boolean[] resultResolved2 = new boolean[1];
-		try {
-			ExpressionProxy result = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-			result.addProxyListener(new ExpressionResolved() {
-
-				public void proxyResolved(ProxyEvent event) {
-					IBeanProxy value = event.getProxy();
-					assertNotNull(value);
-					assertEquals("boolean", value.getTypeProxy().getFormalTypeName());
-					assertEquals(false, ((IBooleanBeanProxy) value).booleanValue());
-					resultResolved[0] = true;
-				}
-
-			});
-			exp.createNewInstance(ForExpression.ASSIGNMENT_RIGHT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
-			exp.createTry();
-			int mark = exp.mark();
-			try {
-				ExpressionProxy result1 = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-				result1.addProxyListener(ep1 = new ExpressionNotResolved());
-				exp.createNewInstance(ForExpression.ASSIGNMENT_LEFT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
-			} catch (IllegalStateException e) {
-				// This is ok, should of got this.
-			} finally {
-				exp.endMark(mark);
-			}
-			exp.createTryEnd();
-			ExpressionProxy result2 = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-			result2.addProxyListener(new ExpressionResolved() {
-
-				public void proxyResolved(ProxyEvent event) {
-					IBeanProxy value = event.getProxy();
-					assertNotNull(value);
-					assertEquals("boolean", value.getTypeProxy().getFormalTypeName());
-					assertEquals(false, ((IBooleanBeanProxy) value).booleanValue());
-					resultResolved2[0] = true;
-				}
-
-			});
-			exp.createNewInstance(ForExpression.ASSIGNMENT_RIGHT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
-		} finally {
-			exp.endMark(mark0);
-		}
-		
-		exp.invokeExpression();
-		
-		assertNotNull(ep1);
-		assertTrue(ep1.notResolvedCalled);
-		assertTrue(resultResolved[0]);
-		assertTrue(resultResolved2[0]);
-		
-	}
-	
-	
-	public void testMarkError() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
-		// Test with one error and see if it restores correctly.
-		Expression exp = (Expression) proxyFactory.createExpression();
-		int mark = exp.mark();
-		ExpressionNotResolved epl = null;
-		try {
-			ExpressionProxy result = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-			result.addProxyListener(epl = new ExpressionNotResolved());
-			exp.createNewInstance(ForExpression.ASSIGNMENT_LEFT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
-		} catch (IllegalStateException e) {
-			// This is good. We should get here.
-		} finally {
-			exp.endMark(mark);
-		}
-		
-		// Now we should be able to continue and get good answer.
-		ExpressionProxy result = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-		exp.createNewInstance(ForExpression.ASSIGNMENT_RIGHT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
-		result.addProxyListener(new ExpressionResolved(){
-			public void proxyResolved(ProxyEvent event) {
-				IBeanProxy value = event.getProxy();
-				assertNotNull(value);
-				assertEquals("boolean", value.getTypeProxy().getFormalTypeName());
-				assertEquals(false, ((IBooleanBeanProxy) value).booleanValue());
-			}
-			
-		});
-		
-		exp.invokeExpression();
-		assertNotNull(epl);
-		assertTrue(epl.notResolvedCalled);
-	}
-	
-	public void testMarkNestError() {
-		// Test mark nest error.
-		// mark
-		// try {
-		//   endmark
-		// } finally <-- this should cause an exception.
-		Expression exp = (Expression) proxyFactory.createExpression();
-		int mark = exp.mark();
-		ExpressionNotResolved epl = null;
-		try {
-			exp.createTry();
-			ExpressionProxy result = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-			result.addProxyListener(epl = new ExpressionNotResolved());
-			exp.createNewInstance(ForExpression.ASSIGNMENT_RIGHT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
-			exp.endMark(mark);
-			exp.createTryFinallyClause();
-			exp.createTryEnd();
-		} catch (IllegalStateException e) {
-			// This is good. We should get here.
-			exp.close();
-			assertNotNull(epl);
-			assertTrue(epl.notResolvedCalled);			
-			return;
-		}
-		
-		exp.close();
-		fail("Should not of gotten here.");
-	}
-	
-	public void testMarkNestError2() {
-		// Test mark nest error.
-		// try {
-		//   mark
-		// } finally <-- this should cause an exception.
-		// endmark
-		Expression exp = (Expression) proxyFactory.createExpression();
-		ExpressionNotResolved epl = null;
-		try {
-			exp.createTry();
-			int mark = exp.mark();
-			ExpressionProxy result = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-			result.addProxyListener(epl = new ExpressionNotResolved());
-			exp.createNewInstance(ForExpression.ASSIGNMENT_RIGHT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
-			exp.createTryFinallyClause();
-			exp.createTryEnd();
-			exp.endMark(mark);
-		} catch (IllegalStateException e) {
-			// This is good. We should get here.
-			exp.close();
-			assertNotNull(epl);
-			assertTrue(epl.notResolvedCalled);			
-			return;
-		}
-		
-		exp.close();
-		fail("Should not of gotten here.");
-	}
-
-	public void testExpressionTransfer() throws Throwable {
-		// Test that thread transfer works. We will do part of the expression in one thread, more in the next, and
-		// then come back and complete it.
-		IExpression exp = proxyFactory.createExpression();
-		ExpressionProxy epInfix = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-		exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_LESS, 0);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, -10000000);
-		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
-		
-		// Now transfer to another thread.
-		Expression expression = (Expression) exp;
-		expression.beginTransferThread();	// Begin the transfer.
-		
-		IBeanTypeProxy callbackType = proxyTypeFactory.getBeanTypeProxy("org.eclipse.jem.tests.proxy.vm.TestExpressionThreadTransfer"); //$NON-NLS-1$
-		assertNotNull(callbackType);
-		IBeanProxy callbackProxy = callbackType.newInstance();
-		
-		ExpressionThreadTransferCallBack cb = new ExpressionThreadTransferCallBack(expression);
-		registry.getCallbackRegistry().registerCallback(callbackProxy, cb);
-		IInvokable start = callbackType.getInvokable("start");	//$NON-NLS-1$
-		start.invokeCatchThrowableExceptions(callbackProxy);	// Start the thread on the remote vm and wait for it to finish.
-		
-		epInfix.addProxyListener(new ExpressionResolved() {
-			public void proxyResolved(ExpressionProxy.ProxyEvent event) {
-				IBeanProxy result = event.getProxy();
-				assertNotNull(result);
-				assertEquals("boolean", result.getTypeProxy().getTypeName());
-				assertEquals(-10000000<3, ((IBooleanBeanProxy) result).booleanValue());		
-			}
-		});
-		
-		if (cb.error != null) {
-			throw cb.error;
-		}
-		
-		cb.ep.addProxyListener(new ExpressionResolved(){
-			public void proxyResolved(ExpressionProxy.ProxyEvent event) {
-				IBeanProxy result = event.getProxy();
-				assertNotNull(result);
-				assertEquals("boolean", result.getTypeProxy().getTypeName());
-				assertEquals(String.class == String.class, ((IBooleanBeanProxy) result).booleanValue());
-			}
-		});
-
-		expression.transferThread();
-		exp.invokeExpression();
-	}
-	
-	public void testSubexpression() throws IllegalStateException, IllegalArgumentException, ThrowableProxy, NoExpressionValueException {
-		IExpression exp = proxyFactory.createExpression();
-		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[][][]", 2);
-		exp.createPrimitiveLiteral(ForExpression.ARRAYCREATION_DIMENSION, 2);
-		ExpressionProxy secondDimensionProxy = null;
-		// This tests that we can put an expression right in the middle of another expression and 
-		// pick it where it left off.
-		exp.createSubexpression();
-		exp.createTry();
-		secondDimensionProxy = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
-		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, 4);
-		exp.createTryEnd();
-		exp.createSubexpressionEnd();
-		exp.createProxyExpression(ForExpression.ARRAYCREATION_DIMENSION, secondDimensionProxy);		
-		IBeanProxy result = exp.getExpressionValue();
-		assertNotNull(result);
-		assertEquals("int[][][]", result.getTypeProxy().getFormalTypeName());
-		assertEquals(2, ((IArrayBeanProxy) result).getLength());
-		assertEquals(4, ((IArrayBeanProxy)((IArrayBeanProxy) result).get(0)).getLength());
-		assertNull(((IArrayBeanProxy)((IArrayBeanProxy) result).get(0)).get(0));
-	}
-}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ExpressionThreadTransferCallBack.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ExpressionThreadTransferCallBack.java
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 2652689..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.5 $  $Date: 2005/07/08 17:51:46 $ 
- */
-
-import org.eclipse.jem.internal.proxy.common.*;
-/**
- * This is a test for testing callbacks.
- */
-public class TestCallback implements ICallback {
-	
-	IVMCallbackServer vmServer;
-	int callbackID;
-	boolean stop = false;
-
-	/**
-	 * When told to start, it will send a callback
-	 * once every half second until told to stop.
-	 */
-	public void start() {
-		new Thread(new Runnable() {
-			public void run() {
-				// First send back test for IDE calling back on same thread. We do this by sending the thread id
-				// as a constant and the other side will then call back to remote, ask for the thread id, and
-				// see if it matches.
-				try {
-					vmServer.doCallback(new ICallbackRunnable() {
-						public Object run(ICallbackHandler handler) throws CommandException {
-							return handler.callbackAsConstants(callbackID, 1, new Integer(Thread.currentThread().hashCode()));
-						}
-					});
-					
-				} catch (CommandException e) {
-				}
-				
-				// Now do the regular testing.
-				final Integer[] p = new Integer[] {new Integer(0)};
-				while(!stop) {
-					try {
-						Thread.sleep(500);
-					} catch (InterruptedException e) {
-						continue;
-					}
-					if (stop)
-						break;
-					// Now signal the callback.
-					p[0] = new Integer(p[0].intValue()+1);
-					try {
-						vmServer.doCallback(new ICallbackRunnable() {
-							public Object run(ICallbackHandler handler) throws CommandException {
-								return handler.callbackWithParms(callbackID, 0, p);								
-							}
-						});
-					} catch (CommandException e) {
-					}						
-				}
-			}
-		}).start();
-	}
-	
-	/**
-	 * Tell it stop.
-	 */
-	public void stop() {
-		stop = true;
-	}
-	
-	/**
-	 * It is being initialized.
-	 */
-	public void initializeCallback(IVMCallbackServer server, int id) {
-		vmServer = server;
-		callbackID = id;
-	}
-
-}
diff --git a/tests/org.eclipse.jem.tests/vm_tests/org/eclipse/jem/tests/proxy/vm/TestCallbackStream.java b/tests/org.eclipse.jem.tests/vm_tests/org/eclipse/jem/tests/proxy/vm/TestCallbackStream.java
deleted file mode 100644
index d1e982a..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.3 $  $Date: 2005/07/08 17:51:46 $ 
- */
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.eclipse.jem.internal.proxy.common.ICallback;
-import org.eclipse.jem.internal.proxy.common.IVMCallbackServer;
-/**
- * This is a test for testing callback streams.
- */
-public class TestCallbackStream implements ICallback {
-	
-	IVMCallbackServer vmServer;
-	int callbackID;
-	boolean stop = false;
-
-	/**
-	 * When told to start, it will send a stream of 30000 bytes of incrementing
-	 * value (i.e. 0, 1, 2, ..., 127, -127, ...)
-	 */
-	public void start() {
-		new Thread(new Runnable() {
-			public void run() {
-				OutputStream os = null;
-				try {
-					os = vmServer.requestStream(callbackID, 0);
-					if (os != null)
-						for (int i=0; i<30000; i++)
-							os.write(i);
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-				try {
-					if (os != null)
-						os.close();
-				} catch (IOException e) {
-				}
-		}}).start();
-	}
-	
-	/**
-	 * It is being initialized.
-	 */
-	public void initializeCallback(IVMCallbackServer server, int id) {
-		vmServer = server;
-		callbackID = id;
-	}
-
-}
\ 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 39bdd86..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.2 $  $Date: 2005/07/08 17:51:46 $ 
- */
-
-import org.eclipse.jem.internal.proxy.common.*;
-/**
- * This is a test for testing callbacks.
- */
-public class TestExpressionThreadTransfer implements ICallback {
-	
-	IVMCallbackServer vmServer;
-	int callbackID;
-	boolean stop = false;
-
-	/**
-	 * When told to start, it will send a callback
-	 * once every half second until told to stop.
-	 */
-	public void start() {
-		// Need to put it into a new thread.
-		// Then we'll just wait until the thread is done.
-		// This will cause callback onto a different thread in IDE.
-		Thread t = new Thread(new Runnable() {
-			public void run() {
-				// Calback to IDE on this thread. It won't return until complete on the other side.
-				try {
-					vmServer.doCallback(new ICallbackRunnable() {
-						public Object run(ICallbackHandler handler) throws CommandException {
-							return handler.callbackAsConstants(callbackID, 0, null);
-						}
-					});
-					
-				} catch (CommandException e) {
-				}
-			}
-		});
-		t.start();
-		while (true) {
-			try {
-				t.join();
-				break;
-			} catch (InterruptedException e) {
-			}
-		}
-		// Now we return and original thread on IDE resumes processing.
-	}
-		
-	/**
-	 * It is being initialized.
-	 */
-	public void initializeCallback(IVMCallbackServer server, int id) {
-		vmServer = server;
-		callbackID = id;
-	}
-
-}
diff --git a/tests/org.eclipse.jem.tests/vm_tests/testPackage/TestAccess.java b/tests/org.eclipse.jem.tests/vm_tests/testPackage/TestAccess.java
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 751c8f2..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.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests.performance/.cvsignore b/tests/org.eclipse.jst.j2ee.core.tests.performance/.cvsignore
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/about.html b/tests/org.eclipse.jst.j2ee.core.tests.performance/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests.performance/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.jst.j2ee.core.tests.performance/build.properties b/tests/org.eclipse.jst.j2ee.core.tests.performance/build.properties
deleted file mode 100644
index 80a90d3..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests.performance/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-source.core-performance.jar = src/
-output.core-performance.jar = bin/
-bin.includes = plugin.xml,\
-               core-performance.jar,\
-               test.xml,\
-               testcase.xml,\
-               about.html
diff --git a/tests/org.eclipse.jst.j2ee.core.tests.performance/plugin.xml b/tests/org.eclipse.jst.j2ee.core.tests.performance/plugin.xml
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 755d9b3..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.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/.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/about.html b/tests/org.eclipse.jst.j2ee.core.tests/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/tests/org.eclipse.jst.j2ee.core.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.jst.j2ee.core.tests/build.properties b/tests/org.eclipse.jst.j2ee.core.tests/build.properties
deleted file mode 100644
index a69d3c8..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/build.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-bin.includes = tests.jar,\
-               plugin.xml,\
-               my/,\
-               my.bar,\
-               test.xml,\
-               commonArchiveResources/,\
-               testData/,\
-               about.html
-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 8bf670e..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.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/.cvsignore b/tests/org.eclipse.jst.j2ee.tests.performance/.cvsignore
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/about.html b/tests/org.eclipse.jst.j2ee.tests.performance/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/tests/org.eclipse.jst.j2ee.tests.performance/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.jst.j2ee.tests.performance/build.properties b/tests/org.eclipse.jst.j2ee.tests.performance/build.properties
deleted file mode 100644
index 6e0cd71..0000000
--- a/tests/org.eclipse.jst.j2ee.tests.performance/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-source.performance.jar = common/
-output.performance.jar = bin/
-bin.includes = plugin.xml,\
-               performance.jar,\
-               test.xml,\
-               testcase.xml,\
-               about.html
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/BasePerformanceTestCase.java b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/BasePerformanceTestCase.java
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.servlet.tests/.classpath b/tests/org.eclipse.jst.servlet.tests/.classpath
deleted file mode 100644
index 113081a..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.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.jst.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/about.html b/tests/org.eclipse.jst.servlet.tests/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/tests/org.eclipse.jst.servlet.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.jst.servlet.tests/build.properties b/tests/org.eclipse.jst.servlet.tests/build.properties
deleted file mode 100644
index ca62597..0000000
--- a/tests/org.eclipse.jst.servlet.tests/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-source.tests.jar = webmodule-tomcat-tests/
-output.tests.jar = bin/
-bin.includes = plugin.xml,\
-               tests.jar,\
-               WARImportTests/,\
-               test.xml,\
-               about.html
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 3bf5350..0000000
--- a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/WebExportOperationTomcatTest.java
+++ /dev/null
@@ -1,96 +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.ArrayList;
-import java.util.List;
-
-import junit.framework.Test;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentExportDataModelProvider;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IFlexibleProject;
-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.headless.tests.savestrategy.ModuleImportOperationTestCase;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase;
-
-/**
- * @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() {
-		return DataModelFactory.createDataModel(new WebComponentExportDataModelProvider());
-	}
-	protected IProject[] getExportableProjects() throws Exception {
-		IProject[] projs = super.getExportableProjects();
-		List filteredProjs = new ArrayList();
-		for (int i = 0; i < projs.length; i++) {
-			IProject project = projs[i];
-			IFlexibleProject flex = ComponentCore.createFlexibleProject(project);
-			if (flex.getComponentsOfType(WebArtifactEdit.TYPE_ID).length > 0)
-				filteredProjs.add(project);
-		}
-		return (IProject[]) filteredProjs.toArray(new IProject[filteredProjs.size()]);
-		
-	}
-
-
-	/*
-	 * (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 c837633..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.headless.tests.savestrategy.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 1d59484..0000000
--- a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/WebProjectCreationTomcatTest.java
+++ /dev/null
@@ -1,211 +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.application.internal.operations.IAnnotationsDataModel;
-import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.web.operations.AddServletOperation;
-import org.eclipse.jst.j2ee.internal.web.operations.INewServletClassDataModelProperties;
-import org.eclipse.jst.j2ee.internal.web.operations.NewServletClassDataModelProvider;
-import org.eclipse.jst.j2ee.project.datamodel.properties.IFlexibleJavaProjectCreationDataModelProperties;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IComponentCreationDataModelProperties;
-import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.properties.IFlexibleProjectCreationDataModelProperties;
-import org.eclipse.wst.common.tests.LogUtility;
-import org.eclipse.wst.common.tests.ProjectUtility;
-import org.eclipse.wst.common.tests.SimpleTestSuite;
-import org.eclipse.wst.common.tests.TaskViewUtility;
-
-/** 
- * @author blancett
- * 
- * To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Generation - Code and Comments
- */
-public class WebProjectCreationTomcatTest extends TestCase {
-    
-    public void createSimpleProject(String projectName) throws Exception {
-        IDataModel dataModel = DataModelFactory.createDataModel(new FlexibleProjectCreationDataModelProvider());
-        dataModel.setProperty(IFlexibleProjectCreationDataModelProperties.PROJECT_NAME, projectName);
-        setServerTargetProperty(dataModel);
-        dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
-    }
-
-    /**
-     * @param dataModel
-     */
-    public void setServerTargetProperty(IDataModel dataModel) {
-        dataModel.setProperty(IFlexibleJavaProjectCreationDataModelProperties.RUNTIME_TARGET_ID, AllTomcatTests.TOMCAT_RUNTIME.getId());
-    }
-
-    public static void createServlet(IDataModel model) throws Exception {
-         AddServletOperation op = new AddServletOperation(model);
-         op.execute(null,null);
-         ProjectUtility.verifyProject(op.getTargetProject().getName(), true); 
-         TaskViewUtility.verifyNoErrors();
-    }
-
-    public IDataModel setupStandaloneWebProject(String projectName, int j2eeVersion) throws Exception {
-        createSimpleProject(projectName);
-        IDataModel model = getWebComponentCreationDataModel(projectName, j2eeVersion);
-        createStandaloneWebProject(model);
-        createServlet(projectName);
-        return model;
-    }
-
-    public IDataModel setupStandaloneAnnotatedWebProject(String projectName, int j2eeVersion) throws Exception {
-        createSimpleProject(projectName);
-
-        IDataModel model = getWebComponentCreationDataModel(projectName, j2eeVersion);
-        createStandaloneWebProject(model);
-        createAnnotatedServlet(projectName);
-        return model;
-    }
-    
-    public static void createStandaloneWebProject(IDataModel model) throws Exception {
-        IDataModelOperation webOp = model.getDefaultOperation();
-        webOp.execute(new NullProgressMonitor(), null);
-        // ProjectUtility.verifyProject(model.getTargetProject().getName(),
-        // true);
-        TaskViewUtility.verifyNoErrors();
-    }
-    
-    private IDataModel getWebComponentCreationDataModel(String projectName, int j2eeVersion) {
-        IProject javaProject = ProjectUtility.getProject(projectName);
-        String moduleName = projectName + "WebModule"; //$NON-NLS-1$
-        String moduleDeployName = moduleName + ".war"; //$NON-NLS-1$
-        IDataModel model = DataModelFactory.createDataModel(new WebComponentCreationDataModelProvider());
-        model.setProperty(IComponentCreationDataModelProperties.PROJECT_NAME, javaProject.getName());
-        model.setIntProperty(IJ2EEComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-        model.setProperty(IComponentCreationDataModelProperties.COMPONENT_NAME, moduleName);
-        model.setProperty(IComponentCreationDataModelProperties.COMPONENT_DEPLOY_NAME, moduleDeployName);
-        return model;
-    }
-
-    /**
-     * @throws Exception
-     */
-    private void createServlet(String projectName) throws Exception {
-        IDataModel servletModel = setupServletCreationDataModel(projectName, false);
-        createServlet(servletModel);
-    }
-
-    /**
-     * @throws Exception
-     */
-    private void createAnnotatedServlet(String projectName) throws Exception {
-        IDataModel servletModel = setupServletCreationDataModel(projectName, true);
-        createServlet(servletModel);
-    }
-
-    public IDataModel setupServletCreationDataModel(String projectName, boolean isAnnotated) {
-    	IDataModel servletDataModel = DataModelFactory.createDataModel(NewServletClassDataModelProvider.class);
-        servletDataModel.setProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME, projectName);
-        servletDataModel.setProperty(IArtifactEditOperationDataModelProperties.COMPONENT_NAME, projectName);
-        servletDataModel.setProperty(INewJavaClassDataModelProperties.CLASS_NAME, "FooServlet"); //$NON-NLS-1$
-        servletDataModel.setProperty(INewServletClassDataModelProperties.DISPLAY_NAME, "FooServlet"); //$NON-NLS-1$
-        servletDataModel.setBooleanProperty(IAnnotationsDataModel.USE_ANNOTATIONS, isAnnotated);
-        return servletDataModel;
-    }
-
-    public void createVaildProjectAndServletCreation(String projectName, int j2eeVersion) throws Exception {
-        LogUtility.getInstance().resetLogging();
-        IDataModel model = null;
-        model = setupStandaloneWebProject(projectName, j2eeVersion);
-        LogUtility.getInstance().verifyNoWarnings();
-        checkValidDataModel(model);
-    }
-
-    public void createVaildAnnotatedProjectAndServletCreation(String projectName, int j2eeVersion) throws Exception {
-        LogUtility.getInstance().resetLogging();
-        IDataModel model = null;
-        model = setupStandaloneAnnotatedWebProject(projectName, j2eeVersion);
-        LogUtility.getInstance().verifyNoWarnings();
-        checkValidDataModel(model);
-    }
-
-    /**
-     * @param model
-     */
-    protected void checkValidDataModel(IDataModel model) {
-        // DataModelVerifier verifier =
-        // DataModelVerifierFactory.getInstance().createVerifier(model);
-        // try {
-        // verifier.verify(model);
-        // } catch (Exception e) {
-        // // TODO Auto-generated catch block
-        // e.printStackTrace();
-        // }
-
-    }
-
-    public void testVaild12WebProjectNameCreation() throws Exception {
-        ProjectUtility.deleteAllProjects();
-        createVaildProjectAndServletCreation("FooTomcatWebProject12", J2EEVersionConstants.WEB_2_2_ID); //$NON-NLS-1$
-    }
-
-    /*
-     * TODO Uncomment this method when Annotation support for servlets is
-     * enabled public void testVaild12AnnotatedWebProjectNameCreation() throws
-     * Exception { ProjectUtility.deleteAllProjects();
-     * createVaildAnnotatedProjectAndServletCreation("FooAnnotatedTomcatWebProject12",
-     * J2EEVersionConstants.WEB_2_2_ID); }
-     */
-
-    public void testVaild13WebProjectNameCreation() throws Exception {
-        ProjectUtility.deleteAllProjects();
-        createVaildProjectAndServletCreation("Foo1TomcatWebProject13", J2EEVersionConstants.WEB_2_3_ID); //$NON-NLS-1$
-    }
-
-    /*
-     * TODO Uncomment this method when Annotation support for servlets is
-     * enabled public void testVaild13AnnotatedWebProjectNameCreation() throws
-     * Exception { ProjectUtility.deleteAllProjects();
-     * createVaildAnnotatedProjectAndServletCreation("Foo1TomcatWebProject13",
-     * J2EEVersionConstants.WEB_2_3_ID); }
-     */
-
-    public void testVaild14WebProjectNameCreation() throws Exception {
-        ProjectUtility.deleteAllProjects();
-        createVaildProjectAndServletCreation("Foo1TomcatWebProject14", J2EEVersionConstants.WEB_2_4_ID); //$NON-NLS-1$
-    }
-
-    /*
-     * TODO Uncomment this method when Annotation support for servlets is
-     * enabled public void testVaild14AnnotatedWebProjectNameCreation() throws
-     * Exception { ProjectUtility.deleteAllProjects();
-     * createVaildAnnotatedProjectAndServletCreation("Foo1TomcatWebProject14",
-     * J2EEVersionConstants.WEB_2_4_ID); }
-     */
-
-    public static Test suite() {
-        return new SimpleTestSuite(WebProjectCreationTomcatTest.class);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleProjectCreationOperationTest#getProjectCreationDataModel()
-     */
-    public IDataModel getProjectCreationDataModel() {
-        // 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 f562172..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.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.jst.validation.sample/.cvsignore b/tests/org.eclipse.jst.validation.sample/.cvsignore
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/about.html b/tests/org.eclipse.jst.validation.sample/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/tests/org.eclipse.jst.validation.sample/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.jst.validation.sample/build.properties b/tests/org.eclipse.jst.validation.sample/build.properties
deleted file mode 100644
index 7f7f80e..0000000
--- a/tests/org.eclipse.jst.validation.sample/build.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-source.runtime/propertiesValidator.jar = propertiesValidator/,\
-                                         propertiesValFS/,\
-                                         propertiesValWB/,\
-                                         filesystemFWK/
-bin.includes = runtime/propertiesValidator.jar,\
-               plugin.xml,\
-               filesystem.bat,\
-               prop.bat,\
-               about.html
-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 f3fa8aa..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(!"properties".equals(res.getFileExtension())) { //$NON-NLS-1$
-			return false; 		
-		}
-		
-		if(res.isDerived()) {
-			// Created by eclipse
-			return false;
-		}
-		
-		return true;
-	}
-	
-	public IFileDelta[] filter(IFileDelta[] changedFiles) {
-		IFileDelta[] temp = new IFileDelta[changedFiles.length];
-		int count = 0;
-		for(int i=0; i<changedFiles.length; i++) {
-			IFileDelta fd = changedFiles[i];
-			IResource resource = ((WorkbenchFileDelta)fd).getResource();
-			if(isSrcFile(resource)) {
-				temp[count++] = fd;
-			}
-		}
-		
-		if(count == changedFiles.length) {
-			return changedFiles;
-		}
-		
-		IFileDelta[] result = new IFileDelta[count];
-		System.arraycopy(temp, 0, result, 0, count);
-		return result;
-	}
-
-}
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValWB/org/eclipse/jst/validation/sample/workbenchimpl/PropertiesValidatorPlugin.java b/tests/org.eclipse.jst.validation.sample/propertiesValWB/org/eclipse/jst/validation/sample/workbenchimpl/PropertiesValidatorPlugin.java
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>
diff --git a/tests/org.eclipse.jst.validation.test/.classpath b/tests/org.eclipse.jst.validation.test/.classpath
deleted file mode 100644
index a0c75a5..0000000
--- a/tests/org.eclipse.jst.validation.test/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="jUnitWrapper/"/>
-	<classpathentry kind="src" path="test/"/>
-	<classpathentry kind="src" path="testFwk/"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.jst.validation.test/.cvsignore b/tests/org.eclipse.jst.validation.test/.cvsignore
deleted file mode 100644
index 60463af..0000000
--- a/tests/org.eclipse.jst.validation.test/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-build.xml
diff --git a/tests/org.eclipse.jst.validation.test/.project b/tests/org.eclipse.jst.validation.test/.project
deleted file mode 100644
index 19e3ccc..0000000
--- a/tests/org.eclipse.jst.validation.test/.project
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.validation.test</name>
-	<comment></comment>
-	<projects>
-		<project>com.ibm.etools.validation</project>
-		<project>com.ibm.etools.validation.prop</project>
-		<project>com.ibm.wtp.common</project>
-		<project>org.eclipse.jem.workbench</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.test/about.html b/tests/org.eclipse.jst.validation.test/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/tests/org.eclipse.jst.validation.test/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.jst.validation.test/build.properties b/tests/org.eclipse.jst.validation.test/build.properties
deleted file mode 100644
index 1aff869..0000000
--- a/tests/org.eclipse.jst.validation.test/build.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-source.validationtest.jar = jUnitWrapper/,\
-                            test/,\
-                            testFwk/
-bin.includes = plugin.xml,\
-               testInput/,\
-               test.xml,\
-               validationtest.jar,\
-               about.html
-output.validationtest.jar = bin/
-jars.compile.order = validationtest.jar
-              
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.test/build/buildcontrol.properties b/tests/org.eclipse.jst.validation.test/build/buildcontrol.properties
deleted file mode 100644
index 94147de..0000000
--- a/tests/org.eclipse.jst.validation.test/build/buildcontrol.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-CONTACT=ruthdaly@ca.ibm.com
-ComponentShortName=ValTest
-ComponentFullName=Validation BVT Plugin
-ComponentCompetency=BVT
-JavaCompile.1=srcjar
-BuildVerification.1=dir
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.test/build/package.xml b/tests/org.eclipse.jst.validation.test/build/package.xml
deleted file mode 100644
index a590d8b..0000000
--- a/tests/org.eclipse.jst.validation.test/build/package.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<project name="com.ibm.etools.validation.test" default="packagingPlugin" basedir="./..">
-    <target name="init">
-        <property name="packageDir" value=""/>
-        <property name="plugin.directory"  value="${basedir}"/>
-        <property name="plugin.id" value="com.ibm.etools.validation.test"/>
-        <property name="plugin.version"  value=""/>
-    </target>
-    <target name="packagingPlugin" depends="init">
-        <echo message="${plugin.id}"/>
-        <copy todir="${packageDir}/plugins/${plugin.id}_${plugin.version}">
-            <fileset dir="${plugin.directory}">
-                <include name="plugin.xml"/>
-                <include name="testvalidation.bat"/>
-                <include name="testvalidation.sh"/>
-                <include name="runtime/test.jar"/>
-                <include name="runtime/jUnitWrapper.jar"/>
-            </fileset>
-        </copy>
-    </target>
-</project>
diff --git a/tests/org.eclipse.jst.validation.test/build/sourcejar.txt b/tests/org.eclipse.jst.validation.test/build/sourcejar.txt
deleted file mode 100644
index 69bd473..0000000
--- a/tests/org.eclipse.jst.validation.test/build/sourcejar.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-test
-jUnitWrapper
-
-
-
-
diff --git a/tests/org.eclipse.jst.validation.test/build/wsBuild.xml b/tests/org.eclipse.jst.validation.test/build/wsBuild.xml
deleted file mode 100644
index dedb95a..0000000
--- a/tests/org.eclipse.jst.validation.test/build/wsBuild.xml
+++ /dev/null
@@ -1,25 +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;
-
-<!-- customize the jar creation here for multi-jar builds -->
-<target name="build" depends="prepare" if="plugin.id">
-    <antcall target="buildjar">
-        <param name="jarname" value="test"/>
-        <param name="jarclasspath" value="${plugin.classpath}"/>
-    </antcall>
-
-    <antcall target="buildjar">
-        <param name="jarname" value="jUnitWrapper"/>
-        <param name="jarclasspath" value="${plugin.classpath};${plugin.directory}/${plugin.library.directory}/test.jar"/>
-    </antcall>
-
-</target>
-
-</project>
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/AutomatedValidationBVT.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/AutomatedValidationBVT.java
deleted file mode 100644
index 7cbc350..0000000
--- a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/AutomatedValidationBVT.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Created on Feb 9, 2005
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-package org.eclipse.jst.validation.test.junit;
-
-/**
- * @author jialin
- *
- * TODO To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-
-import java.io.File;
-import java.net.URL;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import junit.textui.TestRunner;
-
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.validation.api.test.ApiTestsSuite;
-
-
-/**
- * @author jsholl
- *
- * To change this generated comment go to 
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-public class AutomatedValidationBVT extends TestSuite {
-
-    public static String baseDirectory = null;
-    
-    static {
-        try {
-            IPluginDescriptor pluginDescriptor = Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.jst.validation.test");
-            URL url = pluginDescriptor.getInstallURL(); 
-        	AutomatedValidationBVT.baseDirectory = Platform.asLocalURL(url).getFile() + "validationResources" + File.separatorChar;
-		} catch (Exception e) { 
-			System.err.println("Using working directory since a workspace URL could not be located.");
-		} 
-    }
-
-    public static int unimplementedMethods;
-
-    public static void main(String[] args) {
-        unimplementedMethods = 0;
-        TestRunner.run(suite());
-        if (unimplementedMethods > 0) {
-            System.out.println("\nCalls to warnUnimpl: " + unimplementedMethods);
-        }
-    }
-
-    public AutomatedValidationBVT() {
-        super();
-        TestSuite suite = (TestSuite) AutomatedValidationBVT.suite();
-        for (int i = 0; i < suite.testCount(); i++) {
-            addTest(suite.testAt(i));
-        }
-    }
-
-    public static Test suite() {
-        TestSuite suite = new TestSuite("Test for org.eclipse.jst.validation.test");
-        //suite.addTest(BVTSuite.suite());
-		suite.addTest(ApiTestsSuite.suite());
-        return suite;
-    }
-}
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/BVTSuite.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/BVTSuite.java
deleted file mode 100644
index 510c90a..0000000
--- a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/BVTSuite.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.eclipse.jst.validation.test.junit;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.logging.Level;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.internal.registry.OperationTestcase;
-import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
-import org.eclipse.jst.validation.test.internal.util.BVTValidationUtility;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-
-/**
- * Wraps the existing validation bvt code in a JUnit artifact
- * so that the tests can be run within JUnit. Instances of this
- * class wrap all of the ValidatorSuite instances that must be run.
- */
-public class BVTSuite extends TestSuite {
-	private Map _validatorSuites = null;
-	
-	public BVTSuite() {
-		_validatorSuites = new HashMap();
-		loadValidatorSuites();
-		loadOperationSuites();
-	}
-	
-	private void loadValidatorSuites() {
-		IProgressMonitor monitor = new NullProgressMonitor();
-		
-		ValidatorTestcase[] tmds = BVTValidationUtility.getValidatorTests(monitor);
-		for(int i=0; i<tmds.length; i++) {
-			ValidatorTestcase tmd = tmds[i];
-
-			if(tmd.isVisible()) {
-				ValidatorMetaData vmd = tmd.getValidatorMetaData();
-				ValidatorSuite vs = (ValidatorSuite)_validatorSuites.get(vmd);
-				if(vs == null) {
-					vs = new ValidatorSuite(vmd);
-				}
-				ValidatorTest vt = new ValidatorTest(tmd, vs);
-				vs.addTest(vt);
-				_validatorSuites.put(vmd, vs);
-			}
-		}
-		
-		Iterator iterator = _validatorSuites.values().iterator();
-		while(iterator.hasNext()) {
-			ValidatorSuite vs = (ValidatorSuite)iterator.next();
-			addTest(vs);
-		}
-	}
-	
-	private void loadOperationSuites() {
-		IProgressMonitor monitor = new NullProgressMonitor();
-		
-		OperationTestcase[] tmds = BVTValidationUtility.getOperationTests(monitor);
-		OperationSuite os = new OperationSuite();
-		for(int i=0; i<tmds.length; i++) {
-			OperationTestcase tmd = tmds[i];
-
-			if(tmd.isVisible()) {
-				OperationTest ot = new OperationTest(tmd, os);
-				os.addTest(ot);
-			}
-		}
-		
-		addTest(os);
-	}
-
-	public static Test suite() {
-		// Turn logging to SEVERE
-		BVTValidationPlugin.getPlugin().getMsgLogger().setLevel(Level.SEVERE);
-		return new BVTSuite();
-	}
-
-	public String toString() {
-		return "Validation BVT Suite"; //$NON-NLS-1$
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/BuildInfo.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/BuildInfo.java
deleted file mode 100644
index aef06d1..0000000
--- a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/BuildInfo.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.eclipse.jst.validation.test.junit;
-public class BuildInfo {
-  public static final String copyright = "Licensed Materials -- Property of IBM\n(c) Copyright International Business Machines Corporation, 2001,2003\nUS Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.";
-  public static final String fgBuildLevel = "20031112_1915-WB212-AD-V511D-W5";
-  public static String level() { return fgBuildLevel; }
-  public static String getWSABuildLevel() { return fgBuildLevel; }
-}
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/JUnitBuffer.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/JUnitBuffer.java
deleted file mode 100644
index ae9fe60..0000000
--- a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/JUnitBuffer.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Created on Apr 16, 2003
- *
- * To change this generated comment go to 
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.jst.validation.test.junit;
-
-import java.io.File;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.BufferedTaskStatus;
-import org.eclipse.jst.validation.test.setup.IBuffer;
-
-
-/**
- * When the tests are run as part of JUnit, redirect the output
- * to the JUnit test case.
- */
-public class JUnitBuffer implements IBuffer {
-	private String _logFileName = null;
-	private BufferedTaskStatus _status = null;
-	
-	JUnitBuffer(String logFileName) {
-		_status = new BufferedTaskStatus(getLogFileName(logFileName), new NullProgressMonitor());
-	}
-	
-	public void setProgressMonitor(IProgressMonitor monitor) {
-		_status.setProgressMonitor(monitor);
-	}
-	
-	private String getLogFileName(String logFileName) {
-		if(_logFileName == null) {
-			logFileName = logFileName.replace(' ', '_');
-			IPath stateLocation = BVTValidationPlugin.getPlugin().getStateLocation();
-			File log = new File(stateLocation.toOSString(), logFileName); //$NON-NLS-1$
-			_logFileName = log.getAbsolutePath();
-		}
-		return _logFileName;
-	}
-	
-	public String getLogFileName() {
-		return _status.getLogFileName();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#clear()
-	 */
-	public void clear() {
-		_status.clear();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.IBuffer#delineate(java.lang.String)
-	 */
-	public void delineate(String taskName) {
-		_status.delineate(taskName);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.IBuffer#getProgressMonitor()
-	 */
-	public IProgressMonitor getProgressMonitor() {
-		return _status.getProgressMonitor();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.IBuffer#report()
-	 */
-	public void report() {
-		_status.report();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.IBuffer#write(java.lang.String)
-	 */
-	public void write(String message) {
-		_status.write(message);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#addElapsedTime(java.lang.String, long)
-	 */
-	public void addElapsedTime(String taskName, long elapsedTime) {
-		_status.addElapsedTime(taskName, elapsedTime);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#addExecutionStatus(java.lang.String, int, org.eclipse.jst.validation.test.setup.IBuffer, java.lang.String)
-	 */
-	public void addExecutionStatus(String testcaseName, String subTaskName, int passOrFail, IBuffer buffer, String message) {
-		_status.addExecutionStatus(testcaseName, subTaskName, passOrFail, buffer, message);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#addGlobalExecutionStatus(java.lang.String, int)
-	 */
-	public void addExecutionStatus(String testPassName, boolean pass) {
-		_status.addExecutionStatus(testPassName, pass);
-	}
-
-	public void addExecutionStatus(String testPassName, String subTaskName, boolean pass) {
-		_status.addExecutionStatus(testPassName, subTaskName, pass);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#isSuccessful()
-	 */
-	public boolean isSuccessful() {
-		return _status.isSuccessful();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#isSuccessful()
-	 */
-	public boolean isSuccessful(String testName) {
-		return _status.isSuccessful(testName);
-	}
-
-}
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/OperationSuite.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/OperationSuite.java
deleted file mode 100644
index cff7d0b..0000000
--- a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/OperationSuite.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.eclipse.jst.validation.test.junit;
-
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-/**
- * Instances of this class wrap all of the operations, in plugin.xml,
- * for the validation framework.
- */
-public class OperationSuite extends TestSuite {
-	private JUnitBuffer _buffer = null;
-
-	public OperationSuite() {
-	}
-	
-	public String toString() {
-		return "Validation Framework Tests"; //$NON-NLS-1$
-	}
-
-	public JUnitBuffer getBuffer() {
-		if(_buffer == null) {
-			_buffer = new JUnitBuffer(toString() + System.currentTimeMillis() + ".log"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return _buffer;
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.Test#run(junit.framework.TestResult)
-	 */
-	public void run(TestResult result) {
-		super.run(result);
-		getBuffer().report(); // report only after all of the tests in this suite have finished
-		getBuffer().clear();
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/OperationTest.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/OperationTest.java
deleted file mode 100644
index 6c0b76b..0000000
--- a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/OperationTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.jst.validation.test.junit;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.validation.test.internal.registry.OperationTestcase;
-import org.eclipse.jst.validation.test.internal.registry.TestcaseUtility;
-import org.eclipse.jst.validation.test.internal.util.BVTRunner;
-
-
-/**
- * Instances of this class run an IWorkspaceRunnable that tests the
- * validation framework.
- */
-public class OperationTest extends TestCase {
-	private OperationSuite _suite = null;
-	private OperationTestcase _tmd = null;
-
-	public OperationTest(OperationTestcase tmd, OperationSuite suite) {
-		super(tmd.getName()); // the method named "test" runs the test.
-		_tmd = tmd;
-		_suite = suite;
-	}
-	
-	public JUnitBuffer getBuffer() {
-		return _suite.getBuffer();
-	}
-	
-	public String toString() {
-		return _tmd.getName();
-	}
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#runTest()
-	 */
-	protected void runTest() throws Throwable {
-		try {
-			IProject project = TestcaseUtility.findProject(_tmd);
-			if((project == null) || !project.exists()) {
-				// File needs to be imported (i.e., set up the test).
-				if(!BVTRunner.singleton().setupTests(getBuffer(), _tmd, false)) {
-					fail("Could not import input from directory " + TestcaseUtility.getInputDir(_tmd)); //$NON-NLS-1$
-				}
-			}
-			
-			if(!project.isAccessible()) {
-				fail("Project " + project.getName() + " is not accessible."); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			
-			_tmd.run(getBuffer(), project);
-			if(!getBuffer().isSuccessful(_tmd.getName())) {
-				fail(_tmd.getName() + " failed. Read the log for details. " + getBuffer().getLogFileName()); //$NON-NLS-1$
-			}
-		}
-		finally {
-			// Whether this test case fails or not, send its results to the log.
-			getBuffer().delineate(_tmd.getName());
-		}
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/ValidatorSuite.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/ValidatorSuite.java
deleted file mode 100644
index b6fea36..0000000
--- a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/ValidatorSuite.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.eclipse.jst.validation.test.junit;
-
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-
-/**
- * Instances of this class wrap all of the <test> instances,
- * contributed in plugin.xml, for one validator.
- */
-public class ValidatorSuite extends TestSuite {
-	private ValidatorMetaData _vmd = null;
-	private JUnitBuffer _buffer = null;
-
-	public ValidatorSuite(ValidatorMetaData vmd) {
-		_vmd = vmd;
-	}
-	
-	public String toString() {
-		return _vmd.getValidatorDisplayName();
-	}
-	
-	public JUnitBuffer getBuffer() {
-		if(_buffer == null) {
-			_buffer = new JUnitBuffer(toString() + System.currentTimeMillis() + ".log"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return _buffer;
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.Test#run(junit.framework.TestResult)
-	 */
-	public void run(TestResult result) {
-		super.run(result);
-		getBuffer().report(); // report only after all of the tests in this suite have finished
-		getBuffer().clear();
-	}
-}
-
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/ValidatorTest.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/ValidatorTest.java
deleted file mode 100644
index 839b222..0000000
--- a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/ValidatorTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.jst.validation.test.junit;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.validation.test.internal.registry.TestcaseUtility;
-import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
-import org.eclipse.jst.validation.test.internal.util.BVTRunner;
-
-
-/**
- * Instances of this class represent one <test>, contributed in
- * plugin.xml, for one validator.
- */
-public class ValidatorTest extends TestCase {
-	private ValidatorTestcase _tmd = null;
-	private ValidatorSuite _suite = null;
-
-	public ValidatorTest(ValidatorTestcase tmd, ValidatorSuite suite) {
-		super(tmd.getName()); // the method named "test" runs the test.
-		_tmd = tmd;
-		_suite = suite;
-	}
-	
-	public JUnitBuffer getBuffer() {
-		return _suite.getBuffer();
-	}
-	
-	public String toString() {
-		return _tmd.getProjectName();
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#runTest()
-	 */
-	protected void runTest() throws Throwable {
-		try {
-			IProject project = TestcaseUtility.findProject(_tmd);
-			if((project == null) || !project.exists()) {
-				// File needs to be imported (i.e., set up the test).
-				if(!BVTRunner.singleton().setupTests(getBuffer(), _tmd, false)) {
-					fail("Could not import input from directory " + TestcaseUtility.getInputDir(_tmd)); //$NON-NLS-1$
-				}
-			}
-
-			if(!project.isAccessible()) {
-				fail("Project " + project.getName() + " is not accessible."); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			
-			_tmd.run(getBuffer(), project);
-			if(!getBuffer().isSuccessful(_tmd.getName())) {
-				fail(_tmd.getName() + " failed. Read the log for details. " + getBuffer().getLogFileName()); //$NON-NLS-1$
-			}
-		}
-		finally {
-			// Whether this test case fails or not, send its results to the log.
-			getBuffer().delineate(_tmd.getName());
-		}
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/plugin.xml b/tests/org.eclipse.jst.validation.test/plugin.xml
deleted file mode 100644
index 5ea4f72..0000000
--- a/tests/org.eclipse.jst.validation.test/plugin.xml
+++ /dev/null
@@ -1,443 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   id="org.eclipse.jst.validation.test"
-   name="Validation Testing Component"
-   version="0.7.0"
-   class="org.eclipse.jst.validation.test.BVTValidationPlugin">
-
-   <runtime>
-      <library name="validationtest.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.wst.validation"/>
-      <import plugin="org.eclipse.jst.validation.sample"/>
-      <import plugin="org.junit"/>
-      <import plugin="org.eclipse.jem.workbench"/>
-      <import plugin="org.eclipse.jem.util"/>
-      <import plugin="org.eclipse.jdt.core"/>
-      <import plugin="org.eclipse.wst.common.frameworks"/>
-      <import plugin="org.eclipse.jem"/>
-      <import plugin="org.eclipse.emf.ecore"/>
-      <import plugin="org.eclipse.jst.j2ee"/>
-   </requires>
-
-
-<!--============================-->
-<!-- Validation Contributions   -->
-<!--============================-->
-<!-- Validation extension points -->
-   <extension-point id="test" name="validator test"/>
-   <extension-point id="testSetup" name="testSetup"/>
-   <extension-point id="opTest" name="operation test"/>
-
-<!-- ====================================================== -->
-<!--           JUnit BVT Test Suite                         -->
-<!-- ====================================================== -->
-   <extension
-         point="org.eclipse.wst.common.tests.collector.suites">
-      <suite
-            name="Validation BVT Suite"
-            class="org.eclipse.jst.validation.test.junit.BVTSuite">
-      </suite>
-   </extension>
-<!-- batch BVT -->
-  <!-- <extension
-         id="bvt_batch"
-         point="org.eclipse.core.runtime.applications">
-      <application>
-         <run
-               class="org.eclipse.jst.validation.test.BVTValidationBatch">
-         </run>
-      </application>
-   </extension> -->
-   
-<!--========================================-->
-<!-- Builder (used only for BVT test input) -->
-<!--========================================-->
-   <extension
-         id="bvtbuilder"
-         name="Validation BVT Test Builder"
-         point="org.eclipse.core.resources.builders">
-      <builder>
-         <run
-               class="org.eclipse.jst.validation.test.fwk.TestOpConstrBuilder">
-         </run>
-      </builder>
-   </extension>
-<!--=============================================================-->
-<!--                   FWK Test Validators                       -->
-<!--                                                             -->
-<!-- These validators must not be enabled by default or some     -->
-<!-- other BVT test cases (e.g. j2ee) will fail because          -->
-<!-- messages will exist in the task list.                       -->
-<!--=============================================================-->
-<!-- 
-       The FWKTestValidator supports full validation, and manual 
-       incremental build validation, but not automatic incremental 
-       build validation. 
-    -->
-   <extension
-         id="FwkTestValidator"
-         name="VF Test Validator"
-         point="org.eclipse.wst.validation.validator">
-      <validator>
-         <projectNature
-               id="org.eclipse.jdt.core.javanature">
-         </projectNature>
-         <filter
-               objectClass="org.eclipse.core.resources.IFile"
-               nameFilter="*.java">
-         </filter>
-         <helper
-               class="org.eclipse.jst.validation.test.fwk.validator.FwkTestHelper">
-         </helper>
-         <run
-               enabled="false"
-               class="org.eclipse.jst.validation.test.fwk.validator.FwkTestValidator"
-               incremental="false">
-         </run>
-      </validator>
-   </extension>
-<!-- 
-       The FWKNoBuildTestValidator supports full validation, and does not
-       support any build validation. 
-    -->
-   <extension
-         id="FwkNoBuildTestValidator"
-         name="VF NoBuild Test Validator"
-         point="org.eclipse.wst.validation.validator">
-      <validator>
-         <projectNature
-               id="org.eclipse.jdt.core.javanature">
-         </projectNature>
-         <filter
-               objectClass="org.eclipse.core.resources.IFile"
-               nameFilter="*.java">
-         </filter>
-         <helper
-               class="org.eclipse.jst.validation.test.fwk.validator.FwkNoBuildTestHelper">
-         </helper>
-         <run
-               fullBuild="false"
-               enabled="false"
-               class="org.eclipse.jst.validation.test.fwk.validator.FwkNoBuildTestValidator"
-               incremental="false">
-         </run>
-      </validator>
-   </extension>
-<!--=====================================-->
-<!-- Fwk Test Validator BVT test setup   -->
-<!--=====================================-->
-   <extension
-         id="FwkTestValidatorBVT_testSetup"
-         name="Fwk Test Validator BVT TestSetup"
-         point="org.eclipse.jst.validation.test.testSetup">
-      <import
-            input="FWK/BVT/opConstr.jar"
-            operation="org.eclipse.jst.validation.test.setup.JARImportOperation">
-      </import>
-   </extension>
-<!--=============================================================-->
-<!--               Visible Framework BVT tests                   -->
-<!--=============================================================-->
-   <extension
-         id="TestOpConstructors"
-         name="Test Operation Constructors"
-         point="org.eclipse.jst.validation.test.opTest">
-      <optest
-            input="FWK/BVT/opConstr.jar"
-            operation="org.eclipse.jst.validation.test.fwk.TestOpConstrOperation"
-            project="opConstr"
-            visible="false">
-      </optest>
-   </extension>
-   <!--<extension
-         id="VALFWK02"
-         name="VALFWK02"
-         point="org.eclipse.jst.validation.test.opTest">
-      <optest
-            input="FWK/BVT/opConstr.jar"
-            operation="org.eclipse.jst.validation.test.fwk.VALFWK02Operation"
-            project="opConstr"
-            visible="false">
-      </optest>
-   </extension>-->
-<!--=============================================================-->
-<!--               Fwk Test Validator BVT tests                  -->
-<!-- None of these tests are visible on the Test Collector menu  -->
-<!-- Instead, these are used as part of the VALFWK02 and         -->
-<!-- TestOpConstr tests.                                         -->
-<!--=============================================================-->
-   <extension
-         id="FwkTestValidatorBVT"
-         name="Fwk Test Validator BVT Tests"
-         point="org.eclipse.jst.validation.test.test">
-      <test
-            input="FWK/BVT/opConstr.jar"
-            validator="org.eclipse.jst.validation.test.fwk.validator.FwkTestValidator"
-            project="opConstr"
-            visible="false">
-         <message
-               location="1"
-               prefix=""
-               resource="ITest.java"
-               text="This is a test message for the validation framework, reported by VF Test Validator. Please ignore.">
-         </message>
-         <message
-               location="1"
-               prefix=""
-               resource="Test1.java"
-               text="This is a test message for the validation framework, reported by VF Test Validator. Please ignore.">
-         </message>
-         <message
-               location="1"
-               prefix=""
-               resource="test2/ITest2.java"
-               text="This is a test message for the validation framework, reported by VF Test Validator. Please ignore.">
-         </message>
-         <message
-               location="1"
-               prefix=""
-               resource="test2/Test2.java"
-               text="This is a test message for the validation framework, reported by VF Test Validator. Please ignore.">
-         </message>
-      </test>
-   </extension>
-   <extension
-         id="FwkNoBuildTestValidatorBVT"
-         name="Fwk NoBuild Test Validator BVT Tests"
-         point="org.eclipse.jst.validation.test.test">
-      <test
-            input="FWK/BVT/opConstr.jar"
-            validator="org.eclipse.jst.validation.test.fwk.validator.FwkNoBuildTestValidator"
-            project="opConstr"
-            visible="false">
-         <message
-               location="1"
-               prefix=""
-               resource="ITest.java"
-               text="This is a test message for the validation framework, reported by VF NoBuild Test Validator. Please ignore.">
-         </message>
-         <message
-               location="1"
-               prefix=""
-               resource="Test1.java"
-               text="This is a test message for the validation framework, reported by VF NoBuild Test Validator. Please ignore.">
-         </message>
-         <message
-               location="1"
-               prefix=""
-               resource="test2/ITest2.java"
-               text="This is a test message for the validation framework, reported by VF NoBuild Test Validator. Please ignore.">
-         </message>
-         <message
-               location="1"
-               prefix=""
-               resource="test2/Test2.java"
-               text="This is a test message for the validation framework, reported by VF NoBuild Test Validator. Please ignore.">
-         </message>
-      </test>
-   </extension>
-   <extension
-         id="PropertiesValidatorBVT"
-         name="Properties Validator BVT Tests"
-         point="org.eclipse.jst.validation.test.test">
-      <test
-            input="FWK/BVT/opConstr.jar"
-            validator="org.eclipse.jst.validation.sample.PropertiesValidator"
-            project="opConstr"
-            visible="false">
-         <message
-               location="3"
-               prefix="ABCD0000"
-               resource="resources/test.properties"
-               text="ABCD0000E: Match the braces in the message. There are 0 { and 1 }. MessageFormat will throw a NullPointerException when there are mismatching braces.">
-         </message>
-         <message
-               location="2"
-               prefix="ABCD0000"
-               resource="resources/test.properties"
-               text="ABCD0000E: Match the braces in the message. There are 1 { and 0 }. MessageFormat will throw a NullPointerException when there are mismatching braces.">
-         </message>
-         <message
-               location="1"
-               prefix="ABCD0000"
-               resource="resources/test.properties"
-               text="ABCD0000E: Match the braces in the message. There are 0 { and 1 }. MessageFormat will throw a NullPointerException when there are mismatching braces.">
-         </message>
-         <message
-               location="10"
-               prefix="ABCD0010"
-               resource="resources/test.properties"
-               text="ABCD0010E: Change argument ({-1}) to an integer between 0 and 9 inclusive in the message. MessageFormat cannot process an integer parameter that is less than 0.">
-         </message>
-         <message
-               location="8"
-               prefix="ABCD0010"
-               resource="resources/test.properties"
-               text="ABCD0010W: Change argument ({10}) to an integer between 0 and 9 inclusive in the message. MessageFormat ignores any parameters larger than 9.">
-         </message>
-         <message
-               location="7"
-               prefix="ABCD0010"
-               resource="resources/test.properties"
-               text="ABCD0010W: Change argument ({10}) to an integer between 0 and 9 inclusive in the message. MessageFormat ignores any parameters larger than 9.">
-         </message>
-         <message
-               location="12"
-               prefix="ABCD0020"
-               resource="resources/test.properties"
-               text="ABCD0020I: Remove redundant parameter {0} from the message. Make messages succinct.">
-         </message>
-         <message
-               location="13"
-               prefix="ABCD0030"
-               resource="resources/test.properties"
-               text="ABCD0030I: Check that argument {1} was omitted from the message deliberately. If it was omitted accidentally, and the code does not provide enough parameters, MessageFormat will throw a NullPointerException.">
-         </message>
-         <message
-               location="8"
-               prefix="ABCD0030"
-               resource="resources/test.properties"
-               text="ABCD0030I: Check that argument {0} was omitted from the message deliberately. If it was omitted accidentally, and the code does not provide enough parameters, MessageFormat will throw a NullPointerException.">
-         </message>
-         <message
-               location="14"
-               prefix="ABCD0040"
-               resource="resources/test.properties"
-               text="ABCD0040I: Use two apostrophes in the message at column 57. MessageFormat removes single apostrophes; for the message to display an apostrophe, two apostrophes must exist in the string. (An apostrophe is a reserved character of MessageFormat.)">
-         </message>
-         <message
-               location="15"
-               prefix="ABCD0050"
-               resource="resources/test.properties"
-               text="ABCD0050I: Use one apostrophe in the message at column 57. MessageFormat processes only messages with parameters; without MessageFormat, the extra apostrophe will not be removed.">
-         </message>
-         <message
-               location="25"
-               prefix="ABCD0060"
-               resource="resources/test.properties"
-               text="ABCD0060W: Make Z_DUPLICATE unique. When an id is used more than once in a file, ResourceBundle will use the value of the last message id.">
-         </message>
-         <message
-               location="24"
-               prefix="ABCD0060"
-               resource="resources/test.properties"
-               text="ABCD0060W: Make Z_DUPLICATE unique. When an id is used more than once in a file, ResourceBundle will use the value of the last message id.">
-         </message>
-         <message
-               location="19"
-               prefix="ABCD0060"
-               resource="resources/test.properties"
-               text="ABCD0060W: Make DUPLICATE_ID unique. When an id is used more than once in a file, ResourceBundle will use the value of the last message id.">
-         </message>
-         <message
-               location="18"
-               prefix="ABCD0060"
-               resource="resources/test.properties"
-               text="ABCD0060W: Make DUPLICATE_ID unique. When an id is used more than once in a file, ResourceBundle will use the value of the last message id.">
-         </message>
-         <message
-               location="28"
-               prefix="ABCD0060"
-               resource="resources/test.properties"
-               text="ABCD0060W: Make Z_DUPLICATE unique. When an id is used more than once in a file, ResourceBundle will use the value of the last message id.">
-         </message>
-         <message
-               location="43"
-               prefix="ABCD0070"
-               resource="resources/test.properties"
-               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
-         </message>
-         <message
-               location="42"
-               prefix="ABCD0070"
-               resource="resources/test.properties"
-               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
-         </message>
-         <message
-               location="41"
-               prefix="ABCD0070"
-               resource="resources/test.properties"
-               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
-         </message>
-         <message
-               location="39"
-               prefix="ABCD0070"
-               resource="resources/test.properties"
-               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
-         </message>
-         <message
-               location="38"
-               prefix="ABCD0070"
-               resource="resources/test.properties"
-               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
-         </message>
-         <message
-               location="37"
-               prefix="ABCD0070"
-               resource="resources/test.properties"
-               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
-         </message>
-         <message
-               location="36"
-               prefix="ABCD0070"
-               resource="resources/test.properties"
-               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
-         </message>
-         <message
-               location="45"
-               prefix="ABCD0070"
-               resource="resources/test.properties"
-               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
-         </message>
-         <message
-               location="44"
-               prefix="ABCD0070"
-               resource="resources/test.properties"
-               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
-         </message>
-         <message
-               location="35"
-               prefix="ABCD0070"
-               resource="resources/test.properties"
-               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
-         </message>
-         <message
-               location="23"
-               prefix="ABCD0070"
-               resource="resources/test.properties"
-               text="ABCD0070W: AAAA0000W may need to be unique. Conventionally, a message prefix applies to only one error condition.">
-         </message>
-         <message
-               location="20"
-               prefix="ABCD0070"
-               resource="resources/test.properties"
-               text="ABCD0070W: AAAA0000W may need to be unique. Conventionally, a message prefix applies to only one error condition.">
-         </message>
-         <message
-               location="21"
-               prefix="ABCD0080"
-               resource="resources/test.properties"
-               text="ABCD0080E: Fix the syntax error; each line must form MESSAGE_ID = MESSAGE.">
-         </message>
-         <message
-               location="17"
-               prefix="ABCD0080"
-               resource="resources/test.properties"
-               text="ABCD0080E: Fix the syntax error; each line must form MESSAGE_ID = MESSAGE.">
-         </message>
-         <message
-               location="1"
-               prefix="ABCD0110"
-               resource="resources/test.properties"
-               text="ABCD0110I: Add a terminating apostrophe at column 36. The { and } characters must be enclosed in apostrophes.">
-         </message>
-      </test>
-   </extension>
-   
-</plugin>
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.test/test.xml b/tests/org.eclipse.jst.validation.test/test.xml
deleted file mode 100644
index cdcaa7b..0000000
--- a/tests/org.eclipse.jst.validation.test/test.xml
+++ /dev/null
@@ -1,65 +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}\.."/> -->
-
-  <!--==============================================================-->
-  <!-- Set the environment properties.                              -->
-  <!--==============================================================-->
-  <property name="plugin-name" value="org.eclipse.jst.validation.test"/>
-  <property name="library-file"
-            value="${eclipse-home}/plugins/org.eclipse.test_3.1.0/library.xml"/>
-  <property name="extraVMargs" value="-DXmx700M"/>
-
-  <!--===============================================================-->
-  <!-- This target initializes all of the tests that will run.       -->
-  <!-- Initialization for individual tests should be done within the --> 
-  <!-- body of the suite target.                                     -->
-  <!--===============================================================-->
-  <target name="init">
-      <tstamp/>
-      <delete>
-         <fileset dir="${eclipse-home}" includes="org.*.xml"/>
-      </delete>
-  </target>
-
-  <!--==============================================================-->
-  <!-- This target defines the tests that need to run.              -->
-  <!--==============================================================-->
-  <target name="suite">
-      <property name="workspace" value="${eclipse-home}/jst_folder"/>
-      <delete dir="${workspace}" quiet="true"/>
-      <ant target="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.validation.test.junit.AutomatedValidationBVT"/>
-   	  <property name="plugin-path" value="${eclipse-home}/plugins/${plugin-name}"/>
-   	  <property name="extraVMargs" value="${extraVMargs}"/>
-    </ant>
-  </target>
-
-  <!--==================================================================-->
-  <!-- This target holds code to cleanup the testing environment after  -->
-  <!-- all of the tests have been run. You can use this target to       -->
-  <!-- delete temporary files that have been created.                   -->
-  <!--==================================================================-->
-  <target name="cleanup">
-  </target>
-
-  <!--==================================================================-->
-  <!-- This target runs the test suite. Any actions that need to happen -->
-  <!-- after all the tests have been run should go here.                -->
-  <!--==================================================================-->
-  <target name="run" depends="init,suite,cleanup">
-    <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="includes" value="org.*.xml"/>
-      <property name="output-file" value="${plugin-name}.xml"/>
-    </ant>
-  </target>
-
-</project>
-
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/api/test/ApiTestsSuite.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/api/test/ApiTestsSuite.java
deleted file mode 100644
index 95067e0..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/api/test/ApiTestsSuite.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.eclipse.jst.validation.api.test;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class ApiTestsSuite extends TestSuite {
-	
-	 public static Test suite(){
-	        return new ApiTestsSuite();
-	    }
-
-	public ApiTestsSuite() {
-		super();
-		addTest(ValidationRegistryApiTest.suite());
-	}
-
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/api/test/ValidationRegistryApiTest.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/api/test/ValidationRegistryApiTest.java
deleted file mode 100644
index ee197f9..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/api/test/ValidationRegistryApiTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.eclipse.jst.validation.api.test;
-
-import junit.framework.Assert;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.wst.validation.internal.provisional.ValidationFactory;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-
-public class ValidationRegistryApiTest extends TestCase {
-	
-	public static Test suite() {
-		return new TestSuite(ValidationRegistryApiTest.class);
-	} 
-
-	public ValidationRegistryApiTest() {
-		super();
-	}
-
-	public ValidationRegistryApiTest(String name) {
-		super(name);
-	}
-	
-	public void test_getValidator() {
-	try {
-		ValidationFactory valFactory = ValidationFactory.instance;
-		IValidator validator = valFactory.getValidator("org.eclipse.jst.j2ee.internal.ejb.workbench.validation.UIEjbValidator");
-		Assert.assertNotNull(validator);
-	 } catch (Exception e) {
-		e.printStackTrace();
-	  }
-	}
-
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationBatch.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationBatch.java
deleted file mode 100644
index 3dfa3ee..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationBatch.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.eclipse.jst.validation.test;
-
-import java.util.logging.Level;
-
-import org.eclipse.core.boot.IPlatformRunnable;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.internal.util.BVTRunner;
-import org.eclipse.jst.validation.test.internal.util.BVTValidationUtility;
-/**
- */
-public class BVTValidationBatch implements IPlatformRunnable {
-	private String _dir = null; // The test cases (.ear, .jar) are identified through a relative directory, and this is the parent of that relative directory.
-	private boolean _verbose = false;
-	static Boolean _passed = null;
-	
-	boolean isVerbose() {
-		return _verbose;
-	}
-	
-	void setVerbose(boolean v) {
-		_verbose = v;
-	}
-	
-	String getDir() {
-		return _dir;
-	}
-	
-	void setDir(String dir) {
-		_dir = dir;
-	}
-	
-	private void parseUserSettings(Object args) {
-		if(args == null) {
-			// nothing to set
-			return;
-		}
-		
-		if(args instanceof String[]) {
-			String[] userSettings = (String[])args;
-			if(userSettings.length == 0) {
-				return;
-			}
-			
-			for(int i=0; i<userSettings.length; i++) {
-				if(userSettings[i].equals("-dir")) { //$NON-NLS-1$
-					setDir(userSettings[i+1]);
-				}
-				
-				if(userSettings[i].equals("-trace")) { //$NON-NLS-1$
-					setVerbose(true);
-				}
-			}
-
-			// turn on framework validation logging
-			if(isVerbose()) {
-				BVTValidationPlugin.getPlugin().getMsgLogger().setLevel(Level.FINEST);
-			}
-		}
-	}
-
-
-	/**
-	 * Parse the user's settings, import the test cases, and run the test cases.
-	 */
-	public Object run(Object args) throws BVTValidationException {
-		parseUserSettings(args);
-
-		IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) {		
-				try {
-					monitor.subTask("Workspace is located at: " + BVTValidationPlugin.getPlugin().getStateLocation().toOSString()); //$NON-NLS-1$
-			
-					ConsoleBuffer buffer = new ConsoleBuffer();
-					BVTRunner.singleton().setupTests(buffer, isVerbose());
-					
-					int numTests = BVTValidationUtility.numValidatorTests(monitor, ResourcesPlugin.getWorkspace().getRoot().getProjects());
-					int numPassed = BVTRunner.singleton().test(buffer, ResourcesPlugin.getWorkspace().getRoot().getProjects());
-					_passed = ((numPassed == numTests) ? Boolean.TRUE : Boolean.FALSE);
-				}
-				catch(BVTValidationException exc) {
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if(logger.isLoggingLevel(Level.SEVERE)) {
-						logger.write(Level.SEVERE, exc.getMessage());
-						logger.write(Level.SEVERE, exc);
-						if(exc.getTargetException() != null) {
-							logger.write(Level.SEVERE, exc.getTargetException());
-						}
-					}
-				}
-			}
-		};
-		
-		try {
-			ConsoleProgressMonitor monitor = new ConsoleProgressMonitor();
-			ResourcesPlugin.getWorkspace().run(runnable, monitor);
-		}
-		catch(CoreException exc) {
-			throw new BVTValidationException(exc);
-		}
-		return _passed;
-	}
-	
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationException.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationException.java
deleted file mode 100644
index ed809d9..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.eclipse.jst.validation.test;
-
-public class BVTValidationException extends Exception {
-	private Throwable _target = null;
-	
-	public BVTValidationException(Throwable t) {
-		setTargetException(t);
-	}
-	
-	public BVTValidationException(String s) {
-		super(s);
-	}
-	
-	public BVTValidationException(String s, Throwable target) {
-		super(s);
-		setTargetException(target);
-	}
-	
-	public Throwable getTargetException() {
-		return _target;
-	}
-	
-	public void setTargetException(Throwable target) {
-		_target = target;
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationPlugin.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationPlugin.java
deleted file mode 100644
index 1105f57..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationPlugin.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package org.eclipse.jst.validation.test;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jem.util.logger.proxyrender.DefaultPluginTraceRenderer;
-import org.osgi.framework.BundleContext;
-
-
-/**
- * Plugin for TVT testing.
- */
-public class BVTValidationPlugin extends Plugin {
-	private static BVTValidationPlugin inst = null;
-	public static final String PLUGIN_ID = "org.eclipse.jst.validation.test"; //$NON-NLS-1$
-	private ResourceBundle resourceBundle;
-	protected static Logger logger = null;
-
-	/**
-	 * ValidationTVTPlugin constructor comment.
-	 * @param descriptor org.eclipse.core.runtime.IPluginDescriptor
-	 */
-	public BVTValidationPlugin() {
-		super();
-		inst = this;
-	}
-	public static BVTValidationPlugin getPlugin() {
-		return inst;
-	}
-	
-	public BVTValidationPlugin(IPluginDescriptor pd) {
-		this();
-	}
-	public String getPluginID() {
-	    return PLUGIN_ID;
-	}
-	
-	public Logger getMsgLogger() {
-		if (logger == null) {
-			logger = Logger.getLogger(getPluginID());
-			setRenderer(logger);
-		}
-		return logger;
-	}
-	
-	/**
-	 * @param aLogger
-	 */
-	protected void setRenderer(Logger aLogger) {
-		new DefaultPluginTraceRenderer(aLogger);
-	}
-	
-	/**
-	 * Returns the string from the plugin's resource bundle,
-	 * or 'key' if not found.
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle= getPlugin().getResourceBundle();
-		try {
-			return (bundle!=null ? bundle.getString(key) : key);
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-	
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		try {
-			if (resourceBundle == null)
-				resourceBundle = ResourceBundle.getBundle("org.eclipse.jst.validation.test.BVTValidationPluginResource");
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-		return resourceBundle;
-	}
-	
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		inst = null;
-		resourceBundle = null;
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BufferedTaskStatus.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BufferedTaskStatus.java
deleted file mode 100644
index 3254686..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BufferedTaskStatus.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package org.eclipse.jst.validation.test;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jst.validation.test.internal.registry.TestcaseUtility;
-import org.eclipse.jst.validation.test.setup.IBuffer;
-
-
-public class BufferedTaskStatus extends TaskStatus implements IBuffer {
-	public static final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$
-	private IProgressMonitor _monitor = null;
-	private StringBuffer _buffer = null;
-	private String _logFileName = null;
-	
-	public BufferedTaskStatus() {
-	}
-	
-	public BufferedTaskStatus(String logFileName) {
-		this(logFileName, null);
-	}
-	
-	public BufferedTaskStatus(String logFileName, IProgressMonitor monitor) {
-		_buffer = new StringBuffer();
-		setProgressMonitor(monitor);
-		setLogFileName(logFileName);
-	}
-	
-	public void clear() {
-		super.clear();
-		_buffer = null;
-		_buffer = new StringBuffer();
-		_monitor.done();
-		_monitor = null;
-	}
-
-	public String getLogFileName() {
-		return _logFileName;
-	}
-	
-	public void setLogFileName(String name) {
-		_logFileName = name;
-	}
-	
-	public StringBuffer getBuffer() {
-		return _buffer;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.IBuffer#getProgressMonitor()
-	 */
-	public IProgressMonitor getProgressMonitor() {
-		if(_monitor == null) {
-			_monitor = new NullProgressMonitor();
-		}
-		return _monitor;
-	}
-	
-	public void setProgressMonitor(IProgressMonitor m) {
-		_monitor = m;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.IBuffer#report()
-	 */
-	public void report() {
-		_buffer.append(NEWLINE);
-		_buffer.append(">>>>>>>>>>>>>>>>TEST SUITE RESULTS>>>>>>>>>>>>>>>>"); //$NON-NLS-1$
-		_buffer.append(NEWLINE);
-		_buffer.append(NEWLINE);
-
-		if(getElapsedTime().size() > 0) {
-			Iterator iterator = getElapsedTime().keySet().iterator();
-			long total = 0;
-			_buffer.append(">>>>>>>>>>>>>>>>ELAPSED TIME>>>>>>>>>>>>>>>>"); //$NON-NLS-1$
-			_buffer.append(NEWLINE);
-			while(iterator.hasNext()) {
-				String taskName = (String)iterator.next();
-				Long elapsedTime = (Long)getElapsedTime().get(taskName);
-				total += elapsedTime.longValue();
-				_buffer.append("Total elapsed time of task "); //$NON-NLS-1$
-				_buffer.append(taskName);
-				_buffer.append(" is "); //$NON-NLS-1$
-				_buffer.append(elapsedTime);
-				_buffer.append(NEWLINE);
-			}
-			_buffer.append("Total time of all tasks is " + total + ", which is " + (total/1000/60) + " minutes."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			_buffer.append(NEWLINE);
-		}
-
-		int totNumPass = 0;
-		Map taskStatus = getTaskStatus();
-		Iterator iterator = taskStatus.keySet().iterator();
-		_buffer.append(NEWLINE);
-		_buffer.append(">>>>>>>>>>>>>>>>PASS/FAIL SUMMARY>>>>>>>>>>>>>>>>"); //$NON-NLS-1$
-		_buffer.append(NEWLINE);
-		while(iterator.hasNext()) {
-			String taskName = (String)iterator.next();
-			TestStatus ts = (TestStatus)taskStatus.get(taskName);
-			_buffer.append(ts);
-			_buffer.append(NEWLINE);
-			if(ts.isSuccessful()) {
-				totNumPass++;
-			}
-		}
-		
-		_buffer.append(NEWLINE);
-		_buffer.append(NEWLINE);
-		_buffer.append("Total Number Of Tests: "); //$NON-NLS-1$
-		_buffer.append(numTests());
-		_buffer.append(NEWLINE);
-		_buffer.append("Number Passed: "); //$NON-NLS-1$
-		_buffer.append(totNumPass);
-		_buffer.append(NEWLINE);
-		
-		if(getLogFileName() != null) {
-			_buffer.append("This report is stored in the following log file: "); //$NON-NLS-1$
-			_buffer.append(getLogFileName());
-	
-			TestcaseUtility.flush(getLogFileName(), _buffer.toString(), true);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.IBuffer#delineate()
-	 */
-	public void delineate(String testcaseName) {
-		TaskStatus. TestStatus ts = getTestStatus(testcaseName);
-		if(ts == null) {
-			// nothing to report
-			return;
-		}
-		StringBuffer errorsBuffer = new StringBuffer();
-		errorsBuffer.append(ts.numFailure());
-		errorsBuffer.append(" errors were reported and "); //$NON-NLS-1$
-		errorsBuffer.append(ts.numWarnings());
-		errorsBuffer.append(" warnings were reported. Read "); //$NON-NLS-1$
-		errorsBuffer.append(getLogFileName());
-		errorsBuffer.append(" for details."); //$NON-NLS-1$
-		write(errorsBuffer.toString());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.IBuffer#write(java.lang.String)
-	 */
-	public void write(String message) {
-		// Can't write to the JUnit log. Can only write to the log by failing the
-		// test case with a message; instead, write to the buffer, and send this
-		// information to a log in the validation.test plugin's state location.
-		_buffer.append(message);
-		_buffer.append(NEWLINE);
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BuildInfo.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BuildInfo.java
deleted file mode 100644
index 532c6ef..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BuildInfo.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.eclipse.jst.validation.test;
-public class BuildInfo {
-  public static final String copyright = "Licensed Materials -- Property of IBM\n(c) Copyright International Business Machines Corporation, 2001,2003\nUS Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.";
-  public static final String fgBuildLevel = "20031112_1915-WB212-AD-V511D-W5";
-  public static String level() { return fgBuildLevel; }
-  public static String getWSABuildLevel() { return fgBuildLevel; }
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ConsoleBuffer.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ConsoleBuffer.java
deleted file mode 100644
index 8b8bdcb..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ConsoleBuffer.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.eclipse.jst.validation.test;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jst.validation.test.setup.IBuffer;
-
-
-/**
- * Sends the TestCaseGeneratorOperation output to System.out.
- */
-public class ConsoleBuffer implements IBuffer {
-	private BufferedTaskStatus _status = null;
-	
-	public ConsoleBuffer() {
-		_status = new BufferedTaskStatus(); // no log file
-	}
-
-	/**
-	 * @see org.eclipse.jst.validation.test.setup.IBuffer#report()
-	 */
-	public void report() {
-		_status.report();
-		System.out.println(_status.getBuffer().toString());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#clear()
-	 */
-	public void clear() {
-		_status.clear();
-	}
-	
-	public String getLogFileName() {
-		return _status.getLogFileName();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.IBuffer#delineate(java.lang.String)
-	 */
-	public void delineate(String taskName) {
-		_status.delineate(taskName);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.IBuffer#getProgressMonitor()
-	 */
-	public IProgressMonitor getProgressMonitor() {
-		return _status.getProgressMonitor();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.IBuffer#write(java.lang.String)
-	 */
-	public void write(String message) {
-		_status.write(message);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#addElapsedTime(java.lang.String, long)
-	 */
-	public void addElapsedTime(String taskName, long elapsedTime) {
-		_status.addElapsedTime(taskName, elapsedTime);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#addExecutionStatus(java.lang.String, int, org.eclipse.jst.validation.test.setup.IBuffer, java.lang.String)
-	 */
-	public void addExecutionStatus(String testcaseName, String subTaskName, int passOrFail, IBuffer buffer, String message) {
-		_status.addExecutionStatus(testcaseName, subTaskName, passOrFail, buffer, message);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#addGlobalExecutionStatus(java.lang.String, int)
-	 */
-	public void addExecutionStatus(String testPassName, boolean pass) {
-		_status.addExecutionStatus(testPassName, pass);
-	}
-
-	public void addExecutionStatus(String testPassName, String subTaskName, boolean pass) {
-		_status.addExecutionStatus(testPassName, subTaskName, pass);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#isSuccessful()
-	 */
-	public boolean isSuccessful() {
-		return _status.isSuccessful();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#isSuccessful()
-	 */
-	public boolean isSuccessful(String testName) {
-		return _status.isSuccessful(testName);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.IBuffer#setProgressMonitor(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void setProgressMonitor(IProgressMonitor monitor) {
-		_status.setProgressMonitor(monitor);
-	}
-
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ConsoleProgressMonitor.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ConsoleProgressMonitor.java
deleted file mode 100644
index a6d9f6f..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ConsoleProgressMonitor.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.eclipse.jst.validation.test;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * This progress monitor directs all task information to std.out.
- */
-public class ConsoleProgressMonitor implements IProgressMonitor {
-	private int _totalWork = 0;
-	private int _workDoneSoFar = 0;
-	private boolean _cancelRequested = false;
-	
-
-	/**
-	 * @see org.eclipse.core.runtime.IProgressMonitor#beginTask(String, int)
-	 */
-	public void beginTask(String name, int totalWork) {
-		_totalWork = totalWork;
-		report(name);
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.IProgressMonitor#done()
-	 */
-	public void done() {
-		int workRemaining = _totalWork - _workDoneSoFar;
-		worked(workRemaining);
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.IProgressMonitor#internalWorked(double)
-	 */
-	public void internalWorked(double work) {
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.IProgressMonitor#isCanceled()
-	 */
-	public boolean isCanceled() {
-		return _cancelRequested;
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.IProgressMonitor#setCanceled(boolean)
-	 */
-	public void setCanceled(boolean value) {
-		_cancelRequested = value;
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.IProgressMonitor#setTaskName(String)
-	 */
-	public void setTaskName(String name) {
-		report(name);
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.IProgressMonitor#subTask(String)
-	 */
-	public void subTask(String name) {
-		report(name);
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.IProgressMonitor#worked(int)
-	 */
-	public void worked(int work) {
-		_workDoneSoFar += work;
-	}
-
-	private void report(String message) {
-		System.out.println(message);
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/IOperationRunnable.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/IOperationRunnable.java
deleted file mode 100644
index cd7b66d..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/IOperationRunnable.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.eclipse.jst.validation.test;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.jst.validation.test.setup.IBuffer;
-
-
-/**
- * Instances of this interface are run as part of the Test Collector BVT.
- */
-public interface IOperationRunnable extends IWorkspaceRunnable {
-	public void setBuffer(IBuffer b);
-	public void setProject(IProject p);
-	public void setName(String testName);
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/TaskStatus.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/TaskStatus.java
deleted file mode 100644
index e2989d6..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/TaskStatus.java
+++ /dev/null
@@ -1,269 +0,0 @@
-package org.eclipse.jst.validation.test;
-
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jst.validation.test.setup.IBuffer;
-import org.eclipse.jst.validation.test.setup.ITestStatus;
-
-
-/**
- * All of the IBuffer instances need to be able to track elapsed time
- * and execution status. Each buffer can create an internal instance of
- * this class to perform those tasks.
- */
-public class TaskStatus implements ITestStatus {
-	private Map _elapsedTime = null;
-	private Map _taskStatus = null;
-
-	public TaskStatus() {
-		_elapsedTime = new HashMap();
-		_taskStatus = new HashMap();
-	}
-	
-	/**
-	 * @see org.eclipse.jst.validation.test.setup.IBuffer#addElapsedTime(String, long)
-	 */
-	public void addElapsedTime(String taskName, long elapsedTime) {
-		Long time = (Long)_elapsedTime.get(taskName);
-		if(time == null) {
-			time = new Long(elapsedTime);
-		}
-		else {
-			time = new Long(time.longValue() + elapsedTime);
-		}
-		_elapsedTime.put(taskName, time);
-	}
-	
-	public void addExecutionStatus(String taskName, boolean pass) {
-		addExecutionStatus(taskName, null, pass);
-	}
-	
-	public void addExecutionStatus(String taskName, String subTaskName, boolean pass) {
-		int success = (pass) ? ITestStatus.PASS : ITestStatus.FAIL;
-		addExecutionStatus(taskName, subTaskName, success, null, null);
-	}
-	
-	public int numTests() {
-		return _taskStatus.size();
-	}
-	
-	protected Map getElapsedTime() {
-		return _elapsedTime;
-	}
-	
-	protected Map getTaskStatus() {
-		return _taskStatus;
-	}
-	
-	public void addExecutionStatus(String testcaseName, String subTaskName, int severity, IBuffer buffer, String message) {
-		TestStatus ts = getTestStatus(testcaseName);
-		if(ts == null) {
-			ts = new TestStatus(testcaseName);
-			_taskStatus.put(testcaseName, ts);
-		}
-		if(subTaskName == null) {
-			ts.addExecutionStatus(severity);
-		}
-		else {
-			ts.addExecutionStatus(subTaskName, severity);
-		}
-
-		if(message != null) {
-			buffer.write(message);
-		}
-	}
-	
-	protected TestStatus getTestStatus(String testcaseName) {
-		return (TestStatus)_taskStatus.get(testcaseName);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#isSuccessful()
-	 */
-	public boolean isSuccessful() {
-		if(_taskStatus.size() == 0) {
-			return true;
-		}
-		
-		Iterator iterator = _taskStatus.keySet().iterator();
-		while(iterator.hasNext()) {
-			String tsName = (String)iterator.next();
-			TestStatus ts = (TestStatus)_taskStatus.get(tsName);
-			if(ts == null || !ts.isSuccessful()) {
-				return false;
-			}
-		}
-		
-		return true;
-	}
-	
-	public boolean isSuccessful(String testName) {
-		if(_taskStatus.size() == 0) {
-			return true;
-		}
-		
-		TestStatus ts = (TestStatus)_taskStatus.get(testName);
-		if(ts == null || !ts.isSuccessful()) {
-			return false;
-		}
-		
-		return true;
-	}
-
-	public void clear() {
-		_taskStatus.clear();
-		_elapsedTime.clear();
-	}
-	
-	protected class TestCount {
-		public int numRan = 0;
-		public int numWarn = 0; // Number of warning messages reported for a test case.
-		public int numFail = 0; // Number of failure messages reported for a test case.
-		public int numPass = 0; // Number of test cases that passed.
-	}
-
-	/**
-	 * Instances of this class track the number of test runs and the 
-	 * number of test cases that pass.
-	 */
-	protected class TestStatus implements Comparator {
-		private String _testcaseName = null;
-		private Map _testStatus = null;
-		
-		/**
-		 * Name must not be null.
-		 */
-		public TestStatus(String name) {
-			_testcaseName = name;
-			_testStatus = new HashMap();
-		}
-		
-		public void addExecutionStatus(String subTaskName, int severity) {
-			TestCount soFar = (TestCount)_testStatus.get(subTaskName);
-			if(soFar == null) {
-				soFar = new TestCount();
-			}
-			soFar.numRan++;
-			switch(severity) {
-				case(ITestStatus.WARN): {
-					soFar.numWarn++;
-					soFar.numPass++;
-					break;
-				}
-				
-				case(ITestStatus.FAIL): {
-					soFar.numFail++;
-					break;
-				}
-				
-				case(ITestStatus.PASS): {
-					soFar.numPass++;
-				}
-				
-				default: {
-					// change nothing
-					break;
-				}
-			}
-			
-			_testStatus.put(subTaskName, soFar);
-		}
-		
-		public void addExecutionStatus(int severity) {
-			addExecutionStatus(null, severity);
-		}
-		
-		public String getTestcaseName() {
-			return _testcaseName;
-		}
-		
-		public int numWarnings() {
-			int numWarnings = 0;
-			Iterator iterator = _testStatus.values().iterator();
-			while(iterator.hasNext()) {
-				TestCount tc = (TestCount)iterator.next();
-				numWarnings += tc.numWarn;
-			}
-			return numWarnings;
-		}
-		
-		public int numFailure() {
-			int numFail = 0;
-			Iterator iterator = _testStatus.values().iterator();
-			while(iterator.hasNext()) {
-				TestCount tc = (TestCount)iterator.next();
-				numFail += tc.numFail;
-			}
-			return numFail;
-		}
-		
-		public boolean isSuccessful() {
-			Iterator iterator = _testStatus.values().iterator();
-			while(iterator.hasNext()) {
-				TestCount tc = (TestCount)iterator.next();
-				if(tc.numFail != 0) {
-					return false;
-				}
-			}
-			return true;
-		}
-		
-		public String toString() {
-			int total = 0;
-			int pass = 0;
-			int fail = 0;
-			int warn = 0;
-			
-			Iterator iterator = _testStatus.values().iterator();
-			while(iterator.hasNext()) {
-				TestCount tc = (TestCount)iterator.next();
-				total++;
-				fail += tc.numFail;
-				warn += tc.numWarn;
-				pass += tc.numPass;
-			}
-			
-			StringBuffer buffer = new StringBuffer(getTestcaseName());
-			buffer.append(" Total:"); //$NON-NLS-1$
-			buffer.append(total);
-			buffer.append(" [Pass: "); //$NON-NLS-1$
-			buffer.append(pass);
-			buffer.append(" Fail: "); //$NON-NLS-1$
-			buffer.append(fail);
-			buffer.append(" Warn: "); //$NON-NLS-1$
-			buffer.append(warn);
-			buffer.append("]"); //$NON-NLS-1$
-			return buffer.toString();
-		}
-		
-		public boolean equals(Object o) {
-			if(o instanceof TestStatus) {
-				TestStatus s = (TestStatus)o;
-				return(_testcaseName.equals(s.getTestcaseName()));
-			}
-			
-			return false;
-		}
-		
-		public int hashCode() {
-			return getTestcaseName().hashCode();
-		}
-		
-		/* (non-Javadoc)
-		 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-		 */
-		public int compare(Object o1, Object o2) {
-			if(!(o1 instanceof TestStatus) && (o2 instanceof TestStatus)) {
-				// Should never happen, but if it does, say that these non-TestStatus objects are equal.
-				return 0;
-			}
-
-			TestStatus a = (TestStatus)o1;
-			TestStatus b = (TestStatus)o2;
-			return a.getTestcaseName().compareTo(b.getTestcaseName());			
-		}
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ValidationTypeEnum.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ValidationTypeEnum.java
deleted file mode 100644
index cfe10c3..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ValidationTypeEnum.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.eclipse.jst.validation.test;
-
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-
-/**
- * Enumeration of the types of validations that can be run.
- */
-public final class ValidationTypeEnum {
-	private ValidationTypeEnum() {
-		// Do not permit instances of this class to be created.
-	}
-	
-	public static final int RUN_VALIDATION = 0; // Manual full invocation of a validation by a user. All validators must support this type of validation.
-	public static final int FULL_VALIDATION = IncrementalProjectBuilder.FULL_BUILD; // Manual invocation of a full build by a user that triggers a full validation. Validators can, but are not required to, support this type of validation.
-	public static final int INCREMENTAL_VALIDATION = IncrementalProjectBuilder.INCREMENTAL_BUILD; // Manual invocation of an incremental build by a user that triggers an incremental validation. Validators can, but are not required to, support this type of validation.
-	public static final int AUTO_VALIDATION = IncrementalProjectBuilder.AUTO_BUILD; // Automatic invocation of an incremental build that triggers an incremental validation. Validators can, but are not required to, support this type of validation.
-	
-	public static final String RUN_VALIDATION_NAME = "RUN_VALIDATION"; //$NON-NLS-1$
-	public static final String ASYNC_NAME = "ASYNC"; //$NON-NLS-1$
-	public static final String INCREMENTAL_VALIDATION_NAME = "INCREMENTAL_BUILD"; //$NON-NLS-1$
-	public static final String FULL_VALIDATION_NAME = "FULL_BUILD"; //$NON-NLS-1$
-	public static final String AUTO_VALIDATION_NAME = "AUTO_BUILD"; //$NON-NLS-1$
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/BVTValidationRegistryReader.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/BVTValidationRegistryReader.java
deleted file mode 100644
index b1f3564..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/BVTValidationRegistryReader.java
+++ /dev/null
@@ -1,894 +0,0 @@
-package org.eclipse.jst.validation.test.internal.registry;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IPluginRegistry;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.IOperationRunnable;
-import org.eclipse.jst.validation.test.setup.IBuffer;
-import org.eclipse.jst.validation.test.setup.IImportOperation;
-import org.eclipse.wst.validation.internal.ValidationRegistryReader;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-
-/**
- * BVTValidationRegistryReader is a singleton who reads the plugin registry
- * for Validator extensions. The read is done once (in the constructor). 
- * 
- * 
- * <extension
- *		point = "com.ibm.etools.validation.fvt.test"
- *		id = "ValidatorFVT"
- *		name = "Validator FVT Test">
- *			<test project="projectName" 
- * 				  validator="com.ibm.etools.validation.ejb.EJBValidator"
- * 				  version="1.1">
- *				<message id="CHKJ2816" resource="ejb-jar.xml" location="216"/>
- *				<message id="CHKJ2816" resource="ejb-jar.xml" location="237"/>
- *				<message id="CHKJ2816" resource="ejb-jar.xml" location="258"/>
- *				<message id="CHKJ2816" resource="ejb-jar.xml" location="279"/>
- *				<message id="CHKJ2816" resource="ejb-jar.xml" location="300"/>
- *			</test>
- * 			... as many <test> as needed
- * </extension>
- */
-public final class BVTValidationRegistryReader implements RegistryConstants {
-	private static BVTValidationRegistryReader inst = null;
-	private static OperationTestReader _opReader = null;
-	private static TestSetupReader _setupReader = null;
-	private static ValidationTestReader _valReader = null;
-
-	/**
-	 * The registry is read once - when this class is instantiated.
-	 */
-	private BVTValidationRegistryReader() {
-		super();
-	}
-
-	/**
-	 * Return all visible test cases for all projects.
-	 */
-	public ITestcaseMetaData[] getTests(IProgressMonitor monitor) {
-		Set tests = new HashSet();
-		ValidatorTestcase[] vts = getValidatorTests(monitor, (String)null);
-		for(int j=0; j<vts.length; j++) {
-			tests.add(vts[j]);
-		}
-		
-		OperationTestcase[] ots = getOperationTests(monitor, (String)null);
-		for(int k=0; k<ots.length; k++) {
-			tests.add(ots[k]);
-		}
-
-		ITestcaseMetaData[] result = new ITestcaseMetaData[tests.size()];
-		tests.toArray(result);
-		return result;
-	}
-	
-	/**
-	 * Return all visible test cases for a project.
-	 */
-	public ITestcaseMetaData[] getTests(IProgressMonitor monitor, IProject[] projects) {
-		Set tests = new HashSet();
-		for(int i=0; i<projects.length; i++) {
-			IProject project = projects[i];
-			ValidatorTestcase[] vts = getValidatorTests(monitor, project);
-			for(int j=0; j<vts.length; j++) {
-				tests.add(vts[j]);
-			}
-			
-			OperationTestcase[] ots = getOperationTests(monitor, project);
-			for(int k=0; k<ots.length; k++) {
-				tests.add(ots[k]);
-			}
-		}
-		
-		ITestcaseMetaData[] result = new ITestcaseMetaData[tests.size()];
-		tests.toArray(result);
-		return result;
-	}
-	
-
-	/**
-	 * Return all validator tests for a project.
-	 */
-	public ValidatorTestcase[] getAllValidatorTests(IProgressMonitor monitor, IProject project) throws IllegalArgumentException {
-		ValidationTestReader reader = getValidationTestReader();
-		return reader.getValidatorTests(monitor, project.getName());
-	}
-
-	/**
-	 * Return all test cases of the named validators on the given project.
-	 */	
-	public ValidatorTestcase[] getAllValidatorTests(IProgressMonitor monitor, IProject project, String[] validatorNames) {
-		Set testSet = new HashSet();		
-		ValidatorTestcase[] tests = getAllValidatorTests(monitor, project);
-		for(int i=0; i<validatorNames.length; i++) {
-			String validator = validatorNames[i];
-			for(int j=0; j<tests.length; j++) {
-				ValidatorTestcase tmd = tests[j];
-				if(tmd.getValidatorClass().equals(validator)) {
-					testSet.add(tmd);
-					break;
-				}
-			}
-		}
-		
-		ValidatorTestcase[] result = new ValidatorTestcase[testSet.size()];
-		testSet.toArray(result);
-		return result;
-	}
-	
-	/**
-	 * Return all of the visible test cases that register messages against this project.
-	 */
-	public ValidatorTestcase[] getValidatorTests(IProgressMonitor monitor, IProject project) throws IllegalArgumentException {
-		return getValidatorTests(monitor, project.getName());
-	}
-
-	private ValidationTestReader getValidationTestReader() {
-		if(_valReader == null) {
-			_valReader = new ValidationTestReader();
-		}
-		return _valReader;
-	}
-	
-	private OperationTestReader getOperationTestReader() {
-		if(_opReader == null) {
-			_opReader = new OperationTestReader();
-		}
-		return _opReader;
-	}
-	
-	private TestSetupReader getTestSetupReader() {
-		if (_setupReader == null) {
-			_setupReader = new TestSetupReader();
-		}
-		return _setupReader;
-	}
-	
-	/**
-	 * Return the test cases named testName, or if testName is null, return all test cases.
-	 */
-	public ValidatorTestcase[] getValidatorTests(IProgressMonitor monitor, String testName) throws IllegalArgumentException {
-		return getValidationTestReader().getVisibleValidatorTests(monitor, testName);
-	}
-	
-	/**
-	 * Return the test cases that register messages against this project.
-	 */
-	public OperationTestcase[] getOperationTests(IProgressMonitor monitor, IProject project) throws IllegalArgumentException {
-		return getOperationTests(monitor, project.getName());
-	}
-
-	/**
-	 * Return the test cases named testName, or if testName is null, return all test cases.
-	 */
-	public OperationTestcase[] getOperationTests(IProgressMonitor monitor, String testName) throws IllegalArgumentException {
-		return getOperationTestReader().getOperationTests(monitor, testName);
-	}
-
-	/**
-	 * If files need to be imported, import them now (into projects that are named
-	 * the same as the files.)
-	 * 
-	 * If ITestcaseMetaData is not null, return the TestSetupImport for that particular test.
-	 * If ITestcaseMetaData is null, return all TestSetupImport.
-	 */
-	public TestSetupImport[] getTestSetup(IBuffer buffer, String dir, ITestcaseMetaData tmd, boolean verbose) {
-		return getTestSetupReader().getTestSetup(buffer, dir, tmd, verbose);
-	}
-
-	/**
-	 * Returns the singleton ValidationTVTRegistryReader.
-	 */
-	public static BVTValidationRegistryReader getReader() {
-		if (inst == null) {
-			inst = new BVTValidationRegistryReader();
-		}
-		return inst;
-	}
-
-	private class ValidationTestReader {
-		private Map _validatorTests = null;
-		
-		ValidationTestReader() {
-		}
-		
-		public ValidatorTestcase[] getVisibleValidatorTests(IProgressMonitor monitor, String testName) throws IllegalArgumentException {
-			ValidatorTestcase[] vts = getValidatorTests(monitor, testName);
-			ValidatorTestcase[] temp = new ValidatorTestcase[vts.length];
-			int count = 0;
-			for(int i=0; i<vts.length; i++) {
-				ValidatorTestcase vt = vts[i];
-				if(vt.isVisible()) {
-					temp[count++] = vt;
-				}
-			}
-			ValidatorTestcase[] result = new ValidatorTestcase[count];
-			System.arraycopy(temp, 0, result, 0, count);
-			return result;
-		}
-		
-		public ValidatorTestcase[] getValidatorTests(IProgressMonitor monitor, String testName) throws IllegalArgumentException {
-			if (_validatorTests == null) {
-				_validatorTests = new HashMap();
-				readTestcaseRegistry(monitor);
-			}
-	
-			Collection tmds = null;
-			if (testName == null) {
-				tmds = new HashSet();
-				Iterator iterator = _validatorTests.values().iterator();
-				while (iterator.hasNext()) {
-					tmds.addAll((Collection) iterator.next());
-				}
-			}
-			else {
-				tmds = (Collection) _validatorTests.get(testName);
-			}
-			if ((tmds == null) || (tmds.size() == 0)) {
-				return new ValidatorTestcase[0];
-			}
-			ValidatorTestcase[] result = new ValidatorTestcase[tmds.size()];
-			tmds.toArray(result);
-			return result;
-		}
-
-		/**
-		 * Return the name of the test case if it exists. Otherwise, return null.
-		 */
-		private String getProject(IConfigurationElement element) {
-			if (element == null) {
-				return null;
-			}
-
-			return element.getAttribute(ATT_PROJECT);
-		}
-
-		private MessageMetaData[] getMessages(ValidatorTestcase tmd, IConfigurationElement testElement) {
-			IConfigurationElement[] messages = testElement.getChildren(TAG_MESSAGE);
-			if ((messages == null) || (messages.length == 0)) {
-				// No messages are expected.
-				return null;
-			}
-
-			MessageMetaData[] mmdList = new MessageMetaData[messages.length];
-			int count = 0;
-			for (int i = 0; i < messages.length; i++) {
-				IConfigurationElement message = messages[i];
-				String prefix = message.getAttribute(ATT_PREFIX);
-				if (prefix == null) {
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						logger.write(Level.SEVERE, "Every <message> must have a prefix."); //$NON-NLS-1$
-					}
-					continue;
-				}
-
-				// The following attributes are optional.			
-				String resourceName = message.getAttribute(ATT_RESOURCE);
-				String location = message.getAttribute(ATT_LOCATION);
-				String text = message.getAttribute(ATT_TEXT);
-				int lineNumber = -1;
-				MessageMetaData mmd = null;
-				if ((location != null)) {
-					try {
-						lineNumber = Integer.parseInt(location);
-						mmd = new MessageMetaData(tmd, prefix, resourceName, lineNumber, text);
-					}
-					catch (NumberFormatException exc) {
-						// Don't need to log - the location just isn't a number.
-					}
-				}
-
-				if (mmd == null) {
-					mmd = new MessageMetaData(tmd, prefix, resourceName, location, text);
-				}
-
-				mmdList[count++] = mmd;
-			}
-
-			if (count == mmdList.length) {
-				return mmdList;
-			}
-			else {
-				MessageMetaData[] result = new MessageMetaData[count];
-				System.arraycopy(mmdList, 0, result, 0, count);
-				return result;
-			}
-		}
-
-		private void addTest(IProgressMonitor monitor, IExtension extension, IConfigurationElement[] testElements) {
-			monitor.subTask("Reading test cases; please wait..."); //$NON-NLS-1$
-			String pluginId = extension.getDeclaringPluginDescriptor().getUniqueIdentifier();
-			for (int i = 0; i < testElements.length; i++) {
-				monitor.subTask("Reading test case " + (i + 1) + " of " + testElements.length); //$NON-NLS-1$ //$NON-NLS-2$
-				IConfigurationElement test = testElements[i];
-
-				String projectName = getProject(test);
-				if (projectName == null) {
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						logger.write(Level.SEVERE, "Every test must name the project that it verifies. " + test.toString()); //$NON-NLS-1$
-					}
-					continue;
-				}
-
-				ValidatorMetaData vmd = getValidatorMetaData(test);
-				if (vmd == null) {
-					// already logged, so just read the next test case.
-					continue;
-				}
-
-				String inputFileName = getInputFileName(test);
-				if (inputFileName == null) {
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						logger.write(Level.SEVERE, "Every test must name the file to be imported and then tested." + test.toString()); //$NON-NLS-1$
-					}
-					continue;
-				}
-
-				boolean visible = getVisible(test);
-
-				ValidatorTestcase tmd = new ValidatorTestcase(pluginId, projectName, vmd, inputFileName, visible);
-				tmd.setMessages(getMessages(tmd, test));
-
-				// Now add the test case to the Map, with the project name as the key into 
-				// the map.
-				Set prjTmd = (Set) _validatorTests.get(projectName);
-				if (prjTmd == null) {
-					prjTmd = new HashSet();
-				}
-				prjTmd.add(tmd);
-				_validatorTests.put(projectName, prjTmd);
-			}
-		}
-
-		/**
-		 * Retrieve an instance of the class with the given fully-qualified name.
-		 * If no such class can be found, return null.
-		 */
-		private ValidatorMetaData getValidatorMetaData(IConfigurationElement element) {
-			if (element == null) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, "IConfigurationElement is null"); //$NON-NLS-1$
-				}
-				return null;
-			}
-
-			String validatorClass = element.getAttribute(ATT_VALIDATOR);
-			try {
-				if (validatorClass == null) {
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						logger.write(Level.SEVERE, "Cannot locate validator attribute"); //$NON-NLS-1$
-					}
-				}
-				ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validatorClass);
-				if (vmd == null) {
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						logger.write(Level.SEVERE, "Could not find validator " + validatorClass); //$NON-NLS-1$
-					}
-				}
-				return vmd;
-			}
-			catch (Throwable exc) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, "Throwable caught while retrieving IValidator " + validatorClass); //$NON-NLS-1$
-					logger.write(Level.SEVERE, exc);
-				}
-				return null;
-			}
-		}
-
-		/**
-		 * Reads the registry to find the test cases that have been implemented.
-		 */
-		private void readTestcaseRegistry(IProgressMonitor monitor) {
-			// Get the extensions that have been registered.
-			IExtensionPoint validatorEP = getTestcaseExtensionPoint();
-			if (validatorEP == null) {
-				// error logged in getValidatorTVTExtensionPoint
-				return;
-			}
-			IExtension[] extensions = validatorEP.getExtensions();
-
-			// find all runtime implementations
-			for (int i = 0; i < extensions.length; i++) {
-				readTestcaseExtension(monitor, extensions[i]);
-			}
-		}
-
-		/**
-		 * Reads one extension by looping through its configuration elements.
-		 */
-		private void readTestcaseExtension(IProgressMonitor monitor, IExtension extension) {
-			IConfigurationElement[] elements = extension.getConfigurationElements();
-			if ((elements == null) || (elements.length == 0)) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, "No tests found for " + extension.getLabel()); //$NON-NLS-1$
-				}
-				return;
-			}
-			addTest(monitor, extension, elements);
-		}
-
-		/**
-		 * Returns the operation extension point
-		 */
-		private IExtensionPoint getTestcaseExtensionPoint() {
-			IPluginRegistry registry = Platform.getPluginRegistry();
-			IExtensionPoint extensionPoint = registry.getExtensionPoint(PLUGIN_ID, VALIDATOR_TESTCASE_EXT_PT_ID);
-			if (extensionPoint == null) {
-				// If this happens it means that someone removed the "validator" extension point declaration 
-				// from our plugin.xml file.
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, PLUGIN_ID + "." + VALIDATOR_TESTCASE_EXT_PT_ID + " has been removed from the validation TVT plugin.xml file"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-			return extensionPoint;
-		}
-
-		/**
-		 * Retrieve the name of the input which must be imported before the test case can be run.
-		 * Return null if no input name is set.
-		 */
-		private boolean getVisible(IConfigurationElement element) {
-			if (element == null) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, "getVisible::IConfigurationElement is null"); //$NON-NLS-1$
-				}
-				return false;
-			}
-
-			String attrib = element.getAttribute(ATT_VISIBLE);
-			if (attrib == null) {
-				// default is visible
-				return true;
-			}
-
-			return Boolean.valueOf(attrib).booleanValue();
-		}
-
-		/**
-		 * Retrieve the name of the input which must be imported before the test case can be run.
-		 * Return null if no input name is set.
-		 */
-		private String getInputFileName(IConfigurationElement element) {
-			if (element == null) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, "getInputFileName::IConfigurationElement is null"); //$NON-NLS-1$
-				}
-				return null;
-			}
-
-			return element.getAttribute(ATT_INPUT);
-		}
-
-	}
-
-	private class OperationTestReader {
-		private Map _operationTests = null;
-
-		OperationTestReader() {
-		}
-		
-		/**
-		 * Return the test cases named testName, or if testName is null, return all test cases.
-		 */
-		public OperationTestcase[] getOperationTests(IProgressMonitor monitor, String testName) throws IllegalArgumentException {
-			if (_operationTests == null) {
-				_operationTests = new HashMap();
-				readOperationTestcaseRegistry(monitor);
-			}
-
-			Collection tmds = null;
-			if (testName == null) {
-				tmds = new HashSet();
-				Iterator iterator = _operationTests.values().iterator();
-				while (iterator.hasNext()) {
-					tmds.addAll((Collection) iterator.next());
-				}
-			}
-			else {
-				tmds = (Collection) _operationTests.get(testName);
-			}
-			if ((tmds == null) || (tmds.size() == 0)) {
-				return new OperationTestcase[0];
-			}
-			OperationTestcase[] result = new OperationTestcase[tmds.size()];
-			tmds.toArray(result);
-			return result;
-		}
-
-		/**
-		 * Retrieve the name of the input which must be imported before the test case can be run.
-		 * Return null if no input name is set.
-		 */
-		private String getInputFileName(IConfigurationElement element) {
-			if (element == null) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, "getInputFileName::IConfigurationElement is null"); //$NON-NLS-1$
-				}
-				return null;
-			}
-
-			return element.getAttribute(ATT_INPUT);
-		}
-
-		private void addOperationTest(IProgressMonitor monitor, IExtension extension, IConfigurationElement[] testElements) {
-			monitor.subTask("Reading test cases; please wait..."); //$NON-NLS-1$
-			String pluginId = extension.getDeclaringPluginDescriptor().getUniqueIdentifier();
-			for (int i = 0; i < testElements.length; i++) {
-				monitor.subTask("Reading test case " + (i + 1) + " of " + testElements.length); //$NON-NLS-1$ //$NON-NLS-2$
-				IConfigurationElement test = testElements[i];
-
-				String projectName = getProject(test);
-				if (projectName == null) {
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						logger.write(Level.SEVERE, "Every test must name the project that it verifies. " + test.toString()); //$NON-NLS-1$
-					}
-					continue;
-				}
-
-				IOperationRunnable op = getOperation(test);
-				if (op == null) {
-					// already logged, so just read the next test case.
-					continue;
-				}
-
-				String inputFileName = getInputFileName(test);
-				if (inputFileName == null) {
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						logger.write(Level.SEVERE, "Every test must name the file to be imported and then tested." + test.toString()); //$NON-NLS-1$
-					}
-					continue;
-				}
-
-				String id = extension.getLabel();
-
-				OperationTestcase tmd = new OperationTestcase(pluginId, projectName, id, inputFileName, op);
-
-				// Now add the test case to the Map, with the project name as the key into 
-				// the map.
-				Set prjTmd = (Set) _operationTests.get(projectName);
-				if (prjTmd == null) {
-					prjTmd = new HashSet();
-				}
-				prjTmd.add(tmd);
-				_operationTests.put(projectName, prjTmd);
-			}
-		}
-
-		/**
-		 * Reads one extension by looping through its configuration elements.
-		 */
-		private void readOperationTestcaseExtension(IProgressMonitor monitor, IExtension extension) {
-			IConfigurationElement[] elements = extension.getConfigurationElements();
-			if ((elements == null) || (elements.length == 0)) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, "No tests found for " + extension.getLabel()); //$NON-NLS-1$
-				}
-				return;
-			}
-			addOperationTest(monitor, extension, elements);
-		}
-
-		/**
-		 * Reads the registry to find the test cases that have been implemented.
-		 */
-		private void readOperationTestcaseRegistry(IProgressMonitor monitor) {
-			// Get the extensions that have been registered.
-			IExtensionPoint opEP = getOperationTestcaseExtensionPoint();
-			if (opEP == null) {
-				// error logged in getValidatorTVTExtensionPoint
-				return;
-			}
-			IExtension[] extensions = opEP.getExtensions();
-
-			// find all runtime implementations
-			for (int i = 0; i < extensions.length; i++) {
-				readOperationTestcaseExtension(monitor, extensions[i]);
-			}
-		}
-
-		/**
-		 * Return the name of the test case if it exists. Otherwise, return null.
-		 */
-		private String getProject(IConfigurationElement element) {
-			if (element == null) {
-				return null;
-			}
-
-			return element.getAttribute(ATT_PROJECT);
-		}
-
-		/**
-		 * Returns the TestCase extension point
-		 */
-		private IExtensionPoint getOperationTestcaseExtensionPoint() {
-			IPluginRegistry registry = Platform.getPluginRegistry();
-			IExtensionPoint extensionPoint = registry.getExtensionPoint(PLUGIN_ID, VALIDATOR_OPERATION_TESTCASE_EXT_PT_ID);
-			if (extensionPoint == null) {
-				// If this happens it means that someone removed the "optest" extension point declaration 
-				// from our plugin.xml file.
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, PLUGIN_ID + "." + VALIDATOR_OPERATION_TESTCASE_EXT_PT_ID + " has been removed from the validation TVT plugin.xml file"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-			return extensionPoint;
-		}
-
-		/**
-		 * Retrieve an instance of the class with the given fully-qualified name.
-		 * If no such class can be found, return null.
-		 */
-		private IOperationRunnable getOperation(IConfigurationElement element) {
-			if (element == null) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, "IConfigurationElement is null"); //$NON-NLS-1$
-				}
-				return null;
-			}
-
-			String opClass = element.getAttribute(ATT_OPERATION);
-			try {
-				if (opClass == null) {
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						logger.write(Level.SEVERE, "Cannot locate operation attribute"); //$NON-NLS-1$
-					}
-				}
-
-				IOperationRunnable op = (IOperationRunnable) element.createExecutableExtension(ATT_OPERATION);
-				if (op == null) {
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						logger.write(Level.SEVERE, "Could not find operation " + opClass); //$NON-NLS-1$
-					}
-				}
-				return op;
-			}
-			catch (Throwable exc) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, "Throwable caught while retrieving IValidator " + opClass); //$NON-NLS-1$
-					logger.write(Level.SEVERE, exc);
-				}
-				return null;
-			}
-		}
-
-	}
-
-	private class TestSetupReader {
-		private TestSetupImport[] _testSetup = null;
-
-		TestSetupReader() {
-		}
-		
-		/**
-		 * Retrieve the name of the input which must be imported before the test case can be run.
-		 * Return null if no input name is set.
-		 */
-		private String getInputFileName(IConfigurationElement element) {
-			if (element == null) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, "getInputFileName::IConfigurationElement is null"); //$NON-NLS-1$
-				}
-				return null;
-			}
-
-			return element.getAttribute(ATT_INPUT);
-		}
-
-		/**
-		 * If files need to be imported, import them now (into projects that are named
-		 * the same as the files.)
-		 * 
-		 * If ITestcaseMetaData is not null, return the TestSetupImport for that particular test.
-		 * If ITestcaseMetaData is null, return all TestSetupImport.
-		 */
-		public TestSetupImport[] getTestSetup(IBuffer buffer, String dir, ITestcaseMetaData tmd, boolean verbose) {
-			if (_testSetup == null) {
-				readSetupRegistry(buffer, verbose);
-			}
-			if (tmd != null) {
-				for (int j = 0; j < _testSetup.length; j++) {
-					TestSetupImport tsi = _testSetup[j];
-					if (tsi.getFileName().endsWith(tmd.getInputFileName())) {
-						return new TestSetupImport[] { tsi };
-					}
-				}
-				return new TestSetupImport[0];
-			}
-			return _testSetup;
-		}
-	
-		private void addSetup(IBuffer buffer, IConfigurationElement[] importElements, boolean verbose) {
-			if ((importElements == null) || (importElements.length == 0)) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					String message = "No test setup found"; //$NON-NLS-1$
-					logger.write(Level.SEVERE, message);
-					buffer.write(message);
-				}
-				return;
-			}
-
-			TestSetupImport[] temp = new TestSetupImport[importElements.length];
-			int count = 0;
-			for (int i = 0; i < importElements.length; i++) {
-				IConfigurationElement importElement = importElements[i];
-				String inputFileName = getInputFileName(importElement);
-				if (inputFileName == null) {
-					// Already logged in getInputFileName
-					continue;
-				}
-
-				IImportOperation op = getImportOperation(buffer, importElement);
-				if (op == null) {
-					buffer.write("Import operation cannot be found. Ignoring import."); //$NON-NLS-1$
-					continue;
-				}
-				TestSetupImport ts = new TestSetupImport(op, inputFileName);
-				temp[count++] = ts;
-			}
-
-			if (_testSetup == null) {
-				if (count == temp.length) {
-					_testSetup = temp;
-				}
-				else {
-					_testSetup = new TestSetupImport[count];
-					System.arraycopy(temp, 0, _testSetup, 0, count);
-				}
-			}
-			else {
-				TestSetupImport[] newTestSetup = new TestSetupImport[_testSetup.length + count];
-				System.arraycopy(_testSetup, 0, newTestSetup, 0, _testSetup.length);
-				System.arraycopy(temp, 0, newTestSetup, _testSetup.length, count);
-				_testSetup = newTestSetup;
-			}
-		}
-
-		/**
-		 * Reads one extension by looping through its configuration elements.
-		 */
-		private void readSetupExtension(IBuffer buffer, IExtension extension, boolean verbose) {
-			IConfigurationElement[] elements = extension.getConfigurationElements();
-			addSetup(buffer, elements, verbose);
-		}
-
-		/**
-		 * Returns the TestCaseSetup extension point
-		 */
-		private IExtensionPoint getSetupExtensionPoint() {
-			IPluginRegistry registry = Platform.getPluginRegistry();
-			IExtensionPoint extensionPoint = registry.getExtensionPoint(PLUGIN_ID, VALIDATOR_SETUP_EXT_PT_ID);
-			if (extensionPoint == null) {
-				// If this happens it means that someone removed the "validator" extension point declaration 
-				// from our plugin.xml file.
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, PLUGIN_ID + "." + VALIDATOR_SETUP_EXT_PT_ID + " has been removed from the validation TVT plugin.xml file"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-			return extensionPoint;
-		}
-
-		/**
-		 * Reads the registry to find the test setup that must be performed.
-		 */
-		private void readSetupRegistry(IBuffer buffer, boolean verbose) {
-			// Get the extensions that have been registered.
-			IExtensionPoint validatorEP = getSetupExtensionPoint();
-			if (validatorEP == null) {
-				// error logged in getValidatorTVTExtensionPoint
-				buffer.write("Extension point is missing. Cannot import test cases."); //$NON-NLS-1$
-				return;
-			}
-			IExtension[] extensions = validatorEP.getExtensions();
-			if (extensions.length == 0) {
-				buffer.write("No extensions found. Cannot import test cases."); //$NON-NLS-1$
-				return;
-			}
-
-			// find all runtime implementations
-			buffer.getProgressMonitor().subTask("Reading setup <import> extensions; please wait..."); //$NON-NLS-1$
-			for (int i = 0; i < extensions.length; i++) {
-				buffer.getProgressMonitor().subTask("Reading setup <import> " + (i + 1) + " of " + extensions.length); //$NON-NLS-1$ //$NON-NLS-2$
-				readSetupExtension(buffer, extensions[i], verbose);
-			}
-		}
-
-		/**
-		 * Return an instance of the operation which is used to import the input.
-		 */
-		private IImportOperation getImportOperation(IBuffer buffer, IConfigurationElement element) {
-			if (element == null) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					String message = "IConfigurationElement is null"; //$NON-NLS-1$
-					logger.write(Level.SEVERE, message);
-					buffer.write(message);
-				}
-			}
-
-			String opClass = element.getAttribute(ATT_OPERATION);
-			try {
-				if (opClass == null) {
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						String message = "Because there is no operation attribute, assuming that the input is a workspace."; //$NON-NLS-1$
-						logger.write(Level.SEVERE, message);
-						buffer.write(message);
-					}
-					return null;
-				}
-
-				Object temp = element.createExecutableExtension(ATT_OPERATION);
-				if (temp == null) {
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						String message = "operation " + opClass + " cannot be created. Ignoring the test case."; //$NON-NLS-1$ //$NON-NLS-2$
-						logger.write(Level.SEVERE, message);
-						buffer.write(message);
-					}
-					return null;
-				}
-				else if (temp instanceof IImportOperation) {
-					return (IImportOperation) temp;
-				}
-				else {
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						String message = "operation must be an instance of IImportOperation. Ignoring the test case."; //$NON-NLS-1$
-						logger.write(Level.SEVERE, message);
-						buffer.write(message);
-					}
-					return null;
-				}
-			}
-			catch (Throwable exc) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					String message = "Throwable caught while retrieving IImportOperation " + opClass + " Ignoring the test case."; //$NON-NLS-1$ //$NON-NLS-2$
-					logger.write(Level.SEVERE, message);
-					logger.write(Level.SEVERE, exc);
-					buffer.write(message);
-				}
-				return null;
-			}
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/BuildInfo.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/BuildInfo.java
deleted file mode 100644
index d14a7a6..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/BuildInfo.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.eclipse.jst.validation.test.internal.registry;
-public class BuildInfo {
-  public static final String copyright = "Licensed Materials -- Property of IBM\n(c) Copyright International Business Machines Corporation, 2001,2003\nUS Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.";
-  public static final String fgBuildLevel = "20031112_1915-WB212-AD-V511D-W5";
-  public static String level() { return fgBuildLevel; }
-  public static String getWSABuildLevel() { return fgBuildLevel; }
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/ITestcaseMetaData.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/ITestcaseMetaData.java
deleted file mode 100644
index 9458462..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/ITestcaseMetaData.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.eclipse.jst.validation.test.internal.registry;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.validation.test.setup.IBuffer;
-
-
-/**
- * This interface represents a test case that either should be run
- * as part of the Validation BVT Suite, or that is part of a test
- * case that is run by the Validation BVT Suite.
- */
-public interface ITestcaseMetaData {
-	/**
-	 * Return true if this test case should be shown as a test on 
-	 * the test collector menu.
-	 */
-	public boolean isVisible();
-	
-	/**
-	 * Return the project that this test case is designed to run on.
-	 */
-	public IProject getProject();
-	
-	/**
-	 * Return the name of the project that this test case is designed 
-	 * to run on.
-	 */
-	public String getProjectName();
-	
-	/**
-	 * Return the id of the plugin that declared this test case.
-	 */
-	public String getDeclaringPluginId();
-	
-	/**
-	 * Return the name of this test case.
-	 */
-	public String getName();
-	
-	/**
-	 * Return the name of the file that must be imported for this test case
-	 * to run on.
-	 */
-	public String getInputFileName();
-	
-	/**
-	 * Import the file, if necessary, and run this test. The test case
-	 * reports whether or not the test passes to the ITestBuffer.
-	 */
-	public void run(IBuffer buffer, IProject project);
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/MessageMetaData.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/MessageMetaData.java
deleted file mode 100644
index 663bbae..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/MessageMetaData.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.eclipse.jst.validation.test.internal.registry;
-
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-
-
-
-public class MessageMetaData {
-	public static final int LINENO_UNSET = -1;
-	private String _messagePrefix = null;
-	private String _resource = null;
-	private int _lineNumber = LINENO_UNSET;
-	private String _location = null;
-	private String _text = null; // When this test case was generated, what was the text of the marker? This information is needed when message prefixes change; the test case will fail because the prefix doesn't match, but it's easy to see that the old prefix tested the same thing as the new prefix.
-	private ValidatorTestcase _tmd = null; // pointer back to the testcase parent
-	
-	public MessageMetaData(ValidatorTestcase tmd, String prefix, String resource, int lineNumber, String text) {
-		this(tmd, prefix, resource, text);
-		_lineNumber = lineNumber;
-	}
-	
-	public MessageMetaData(ValidatorTestcase tmd, String prefix, String resource, String location, String text) {
-		this(tmd, prefix, resource, text);
-		_location = location;
-	}
-	
-	public MessageMetaData(ValidatorTestcase tmd, String prefix, String resource, String text) {
-		_tmd = tmd;
-		_messagePrefix = prefix;
-		_resource = resource;
-		_text = (text == null) ? "" : text; //$NON-NLS-1$
-	}
-	
-	public ValidatorTestcase getValidatorTestcase() {
-		return _tmd;
-	}
-	
-	public String getMessagePrefix() {
-		return _messagePrefix;
-	}
-	
-	public String getResource() {
-		return _resource;
-	}
-	
-	public int getLineNumber() {
-		return _lineNumber;
-	}
-	
-	public String getLocation() {
-		return _location;
-	}
-	
-	public ValidatorMetaData getValidator() {
-		return getValidatorTestcase().getValidatorMetaData();
-	}
-	
-	public String getText() {
-		return _text;
-	}
-	
-	public boolean isSetLineNumber() {
-		return (_lineNumber != LINENO_UNSET);
-	}
-	
-	public boolean isSetLocation() {
-		return isSet(_location);
-	}
-	
-	public boolean isSetResource() {
-		return isSet(_resource);
-	}
-	
-	private boolean isSet(String value) {
-		if(value == null) {
-			return false;
-		}
-		
-		if(value.trim().equals("")) { //$NON-NLS-1$
-			return false;
-		}
-		
-		return true;
-	}
-
-	public String toString() {
-		return MessageUtility.toString(this);
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/MessageUtility.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/MessageUtility.java
deleted file mode 100644
index 82eaeea..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/MessageUtility.java
+++ /dev/null
@@ -1,713 +0,0 @@
-package org.eclipse.jst.validation.test.internal.registry;
-
-import java.text.MessageFormat;
-import java.util.Comparator;
-import java.util.StringTokenizer;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.sample.parser.PropertyLine;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.setup.IBuffer;
-import org.eclipse.wst.validation.internal.ConfigurationConstants;
-import org.eclipse.wst.validation.internal.ConfigurationManager;
-import org.eclipse.wst.validation.internal.ValidationRegistryReader;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-
-public class MessageUtility {
-	private final static String _TESTCASE_MESSAGE_TEMPLATE_ = "<message prefix=\"{0}\" resource=\"{1}\" location=\"{2}\" text=\"{3}\"/>"; //$NON-NLS-1$
-	private final static String _TESTCASE_MARKER_TEMPLATE_ =  "<marker prefix=\"{0}\" resource=\"{1}\" location=\"{2}\" text=\"{3}\"/>"; //$NON-NLS-1$
-	private static MessageComparator _messageComparator = null;
-	private static MessageIdComparator _messageIdComparator = null;
-	private static MessagePrefixComparator _messagePrefixComparator = null;
-	
-	private MessageUtility() {
-	}
-	
-	public static String toString(MessageMetaData mmd) {
-		String location = (mmd.isSetLineNumber()) ? String.valueOf(mmd.getLineNumber()) : mmd.getLocation();
-		return toString(mmd.getMessagePrefix(), mmd.getResource(), location, mmd.getText(), _TESTCASE_MESSAGE_TEMPLATE_);
-	}
-	
-	public static String toString(IMarker marker) {
-		Integer lineNumber = MessageUtility.getLineNumber(marker);
-		String location = (lineNumber == null) ? (location = MessageUtility.getLocation(marker)) : (location = lineNumber.toString());
-		return toString(getMessagePrefix(marker), getResource(marker), location, getMessage(marker), _TESTCASE_MARKER_TEMPLATE_);
-	}
-	
-	private static String toString(String fmssgPrefix, String fresource, String flocation, String ftext, String template) {
-		String mssgPrefix = (fmssgPrefix == null) ? "" : fmssgPrefix; //$NON-NLS-1$
-		String resource = (fresource == null) ? "" : fresource; //$NON-NLS-1$
-		String location = (flocation == null) ? "" : flocation; //$NON-NLS-1$
-		String text = (ftext == null) ? "" : ftext; //$NON-NLS-1$
-		return MessageFormat.format(template, new String[]{mssgPrefix, resource, location, text});
-	}
-	
-	public static String getProject(IMarker marker) {
-		return marker.getResource().getProject().getName();
-	}
-	
-
-	public static String getResource(IMarker marker) {
-		return marker.getResource().getProjectRelativePath().toString();
-	}
-	
-
-	// Based on the last letter of the message prefix, what severity
-	// should this marker be?
-	public static Integer getSeverity(IMarker marker) throws CoreException {
-		String message = (String)marker.getAttribute(IMarker.MESSAGE);
-		if(message == null) {
-			return null;
-		}
-		
-		String[] tokens = parse(message);
-		String severity = tokens[1];
-		Integer result;
-		if(severity.equals("E")) { //$NON-NLS-1$
-			result = new Integer(IMarker.SEVERITY_ERROR);
-		}
-		else if(severity.equals("W")) { //$NON-NLS-1$
-			result = new Integer(IMarker.SEVERITY_WARNING);
-		}
-		else if(severity.equals("I")) { //$NON-NLS-1$
-			result = new Integer(IMarker.SEVERITY_INFO);
-		}
-		else {
-			result = null;
-		}
-		return result;
-	}
-	
-	public static String getMessage(IMarker marker) {
-		try {
-			return (String)marker.getAttribute(IMarker.MESSAGE);
-		}
-		catch(CoreException e) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, e);
-			}
-			return null;
-		}
-	}
-	
-	public static String getMessagePrefix(IMarker marker) {
-		String message = getMessage(marker);
-		if(message == null) {
-			return null;
-		}
-		
-		String[] tokens = parse(message);
-		return tokens[0];
-	}
-	
-	// This method is needed for the fuzzy compare. Need to 
-	// strip the ".java" or ".class" extension off of the resource
-	// name so that the class name can be searched for in the marker's
-	// location text.
-	public static String getResource(MessageMetaData mmd) {
-		String resource = mmd.getResource();
-		int index = resource.indexOf(".java"); //$NON-NLS-1$
-		if(index > -1) {
-			return resource.substring(0, index);
-		}
-		
-		index = resource.indexOf(".class"); //$NON-NLS-1$
-		if(index > -1) {
-			return resource.substring(0, index);
-		}
-		
-		return resource;
-	}
-	
-	public static ValidatorMetaData getValidator(IMarker marker) {
-		String validatorClass = ConfigurationManager.getManager().getValidator(marker);
-		ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validatorClass);
-		return vmd;
-	}
-	
-	/**
-	 * Parse the message value, to extract the unique error id, if any.
-	 * String[0] is the message prefix, String [1] is the error char, String[2] is the rest of the string after the ':'
-	 */
-	public static String[] parse(String message) {
-		if (message == null) {
-			return new String[]{"", "", ""}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-
-		StringTokenizer tokenizer = new StringTokenizer(message);
-		int numTokens = tokenizer.countTokens();
-		if (numTokens == 0) {
-			return new String[]{"", "", message}; //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		else {
-			String errorId = tokenizer.nextToken();
-			boolean isErrorIndex = false;
-
-			int errorIdIndex = errorId.indexOf(':');
-			if (errorIdIndex > 0) {
-				String tempString = errorId.substring(0, errorIdIndex);
-				char[] temp = tempString.toCharArray();
-				if (temp.length == 9) { // Must be of the form ABCD1234E, which is 9 char long
-
-					isErrorIndex = Character.isLetter(temp[0]);
-					isErrorIndex = isErrorIndex && Character.isLetter(temp[1]);
-					isErrorIndex = isErrorIndex && Character.isLetter(temp[2]);
-					isErrorIndex = isErrorIndex && Character.isLetter(temp[3]);
-					isErrorIndex = isErrorIndex && Character.isDigit(temp[4]);
-					isErrorIndex = isErrorIndex && Character.isDigit(temp[5]);
-					isErrorIndex = isErrorIndex && Character.isDigit(temp[6]);
-					isErrorIndex = isErrorIndex && Character.isDigit(temp[7]);
-					isErrorIndex = isErrorIndex && Character.isLetter(temp[8]);
-
-					if (isErrorIndex) {
-						String shortMessage;
-						if (numTokens > 1) {
-							shortMessage = message.substring(errorIdIndex + 1, message.length()).intern();
-						}
-						else {
-							shortMessage = ""; //$NON-NLS-1$
-						}
-						return new String[]{tempString.substring(0, 8), new String(new char[]{temp[8]}), shortMessage};
-					}
-				}
-			}
-
-			if (!isErrorIndex) {
-				return new String[]{"", "", message}; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		
-		return new String[]{"", "", message}; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	public static Integer getLineNumber(IMarker marker) {
-		try {
-			return (Integer)marker.getAttribute(IMarker.LINE_NUMBER);
-		}
-		catch(CoreException e) {
-			return null;
-		}
-	}
-	
-	public static String getTargetObject(IMarker marker) {
-		try {
-			String targetObject = (String)marker.getAttribute(ConfigurationConstants.VALIDATION_MARKER_TARGETOBJECT);
-			if((targetObject != null) && (targetObject.equals(""))) { //$NON-NLS-1$
-				// Empty string means that there was no target object.
-				return null;
-			}
-			return targetObject;
-		}
-		catch(CoreException e) {
-			return null;
-		}
-	}
-	
-	/**
-	 * Sort first on validator, 
-	 * then project, 
-	 * then message prefix,
-	 * then location,
-	 * then resource. (The resource may be different in batch and UI, so compare location & resource at the same time.)
-	 * 
-	 * @param verbose If true, verbose output while comparing lists.
-	 */	
-	public static Comparator getMessageComparator(final IBuffer buffer, final boolean verbose) {
-		if(_messageComparator == null) {
-			_messageComparator = new MessageUtility(). new MessageComparator();
-		}
-		_messageComparator.setVerbose(verbose);
-		_messageComparator.setBuffer(buffer);
-		return _messageComparator;
-	}
-	
-	/**
-	 * Sort first on the version, then on the message prefix.
-	 */	
-	public static Comparator getMessageIdComparator(final IBuffer buffer, final boolean verbose) {
-		if(_messageIdComparator == null) {
-			_messageIdComparator = new MessageUtility(). new MessageIdComparator();
-		}
-		_messageIdComparator.setVerbose(verbose);
-		_messageIdComparator.setBuffer(buffer);
-		return _messageIdComparator;
-	}
-
-	public static String getLocation(IMarker marker) {
-		try {
-			return (String)marker.getAttribute(IMarker.LOCATION);
-		}
-		catch(CoreException e) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, e);
-			}
-			return null;
-		}
-	}
-
-	private class MessageComparator implements Comparator {
-		private boolean _verbose = false;
-		private IBuffer _buffer = null;
-		
-		public boolean isVerbose() {
-			return _verbose;
-		}
-		
-		public void setVerbose(boolean v) {
-			_verbose = v;
-		}
-		
-		public IBuffer getBuffer() {
-			return _buffer;
-		}
-		
-		public void setBuffer(IBuffer b) {
-			_buffer = b;
-		}
-		
-		public int compare(Object a, Object b) {
-			if((a == null) && (b == null)) {
-				return 0;
-			}
-			else if(a == null) {
-				return 1;
-			}
-			else if(b == null) {
-				return -1;
-			}
-			
-			
-			// Sort first on the message prefix, then on the location, then project, then resource
-			if((a instanceof String) && (b instanceof String)) {
-				return compare((String)a, (String)b);
-			}
-			else if ((a instanceof IMarker) && (b instanceof IMarker)) {
-				IMarker aM = (IMarker)a;
-				IMarker bM = (IMarker)b;
-				int result = compare(aM, bM);
-				if(isVerbose()) {
-					getBuffer().write("compare(" + MessageUtility.toString(aM) + ", " + MessageUtility.toString(bM) + " = " + result); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-				return result;
-			}
-			else if ((a instanceof IMarker) && (b instanceof MessageMetaData)) {
-				IMarker aM = (IMarker)a;
-				MessageMetaData mmd = (MessageMetaData)b;
-				int result = compare(aM, mmd);
-				if(isVerbose()) {
-					getBuffer().write("compare(" + MessageUtility.toString(aM) + ", " + MessageUtility.toString(mmd) + " = " + result); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-				return result;
-			}
-			else if((a instanceof MessageMetaData) && (b instanceof IMarker)) {
-				MessageMetaData mmd = (MessageMetaData)a;
-				IMarker bM = (IMarker)b;
-				int result = compare(mmd, bM);
-				if(isVerbose()) {
-					getBuffer().write("compare(" + MessageUtility.toString(mmd) + ", " + MessageUtility.toString(bM) + " = " + result); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}						
-				return result;
-			}
-			else if((a instanceof MessageMetaData) && (b instanceof MessageMetaData)) {
-				MessageMetaData aMMD = (MessageMetaData)a;
-				MessageMetaData bMMD = (MessageMetaData)b;
-				int result = compare(aMMD, bMMD);
-				if(isVerbose()) {
-					getBuffer().write("compare(" + MessageUtility.toString(aMMD) + ", " + MessageUtility.toString(bMMD) + " = " + result); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-				return result;
-			}
-			
-			// else put it at the end of the list
-			return 1;
-		}
-		
-		public int compare(String aStr, String bStr) {
-			if((aStr == null) && (bStr == null)) {
-				return 0;
-			}
-			else if(aStr == null) {
-				return 1;
-			}
-			else if(bStr == null) {
-				return -1;
-			}
-			return aStr.compareTo(bStr);
-		}
-		
-		public int compare(int aInt, int bInt) {
-			return aInt - bInt;
-		}
-		
-		public int compare(ValidatorMetaData aVMD, ValidatorMetaData bVMD) {
-			if((aVMD == null) && (bVMD == null)) {
-				return 0;
-			}
-			else if(aVMD == null) {
-				return 1;
-			}
-			else if(bVMD == null) {
-				return -1;
-			}
-			return compare(aVMD.getValidatorUniqueName(), bVMD.getValidatorUniqueName());
-		}
-
-		public int compare(IMarker aMarker, IMarker bMarker) {
-			if((aMarker == null) && (bMarker == null)) {
-				return 0;
-			}
-			else if(aMarker == null) {
-				return 1;
-			}
-			else if(bMarker == null) {
-				return -1;
-			}
-			
-			int valCmp = compare(getValidator(aMarker), getValidator(bMarker));
-			if(valCmp != 0) {
-				return valCmp;
-			}
-
-			int prjCmp = compare(getProject(aMarker), getProject(bMarker));
-			if(prjCmp != 0) {
-				return prjCmp;
-			}
-			
-			int idCmp = compare(getMessagePrefix(aMarker), getMessagePrefix(bMarker));
-			if(idCmp != 0) {
-				return idCmp;
-			}
-
-			int cmp = compareResourceAndLocation(aMarker, bMarker);
-			return cmp;
-		}
-		
-		public int compare(IMarker marker, MessageMetaData mmd) {
-			if((marker == null) && (mmd == null)) {
-				return 0;
-			}
-			else if(marker == null) {
-				return 1;
-			}
-			else if(mmd == null) {
-				return -1;
-			}
-
-			int valCmp = compare(getValidator(marker), mmd.getValidator());
-			if(valCmp != 0) {
-				return valCmp;
-			}
-
-			int prjCmp = compare(getProject(marker), mmd.getValidatorTestcase().getProjectName());
-			if(prjCmp != 0) {
-				return prjCmp;
-			}
-			
-			int idCmp = compare(getMessagePrefix(marker), mmd.getMessagePrefix());
-			if(idCmp != 0) {
-				return idCmp;
-			}
-
-			int cmp = compareResourceAndLocation(marker, mmd);
-			return cmp;
-		}
-		
-		public int compare(MessageMetaData mmd, IMarker marker) {
-			if((mmd == null) && (marker == null)) {
-				return 0;
-			}
-			else if(mmd == null) {
-				return 1;
-			}
-			else if(marker == null) {
-				return -1;
-			}
-
-			int valCmp = compare(mmd.getValidator(), getValidator(marker));
-			if(valCmp != 0) {
-				return valCmp;
-			}
-
-			int prjCmp = compare(mmd.getValidatorTestcase().getProjectName(), getProject(marker));
-			if(prjCmp != 0) {
-				return prjCmp;
-			}
-
-			int idCmp = compare(mmd.getMessagePrefix(), getMessagePrefix(marker));
-			if(idCmp != 0) {
-				return idCmp;
-			}
-
-			int cmp = compareResourceAndLocation(mmd, marker);
-			return cmp;
-		}
-		
-		public int compare(MessageMetaData aMMD, MessageMetaData bMMD) {
-			if((aMMD == null) && (bMMD == null)) {
-				return 0;
-			}
-			else if(aMMD == null) {
-				return 1;
-			}
-			else if(bMMD == null) {
-				return -1;
-			}
-			
-			int valCmp = compare(aMMD.getValidator(), bMMD.getValidator());
-			if(valCmp != 0) {
-				return valCmp;
-			}
-
-			int prjCmp = compare(aMMD.getValidatorTestcase().getProjectName(), bMMD.getValidatorTestcase().getProjectName());
-			if(prjCmp != 0) {
-				return prjCmp;
-			}
-			
-			int idCmp = compare(aMMD.getMessagePrefix(), bMMD.getMessagePrefix());
-			if(idCmp != 0) {
-				return idCmp;
-			}
-
-			int cmp = compareResourceAndLocation(aMMD, bMMD);
-			return cmp;
-		}
-		
-		public int compareResourceAndLocation(IMarker aMarker, IMarker bMarker) {
-			int resCmp = compare(getResource(aMarker), getResource(bMarker));
-			if(resCmp != 0) {
-				return resCmp;
-			}
-			
-			Integer aLineNo = getLineNumber(aMarker);
-			Integer bLineNo = getLineNumber(bMarker);
-			if((aLineNo != null) && (bLineNo!= null)) {
-				return compare(aLineNo, bLineNo);
-			}
-			
-			String aLocation = getLocation(aMarker);
-			String bLocation = getLocation(bMarker);
-			if((aLocation != null) && (bLocation != null)) {
-				return compare(aLocation, bLocation);
-			}
-			
-			// If one has a line number and the other has a text location, can't compare
-			// the location, so just assume that they're equal.
-			return resCmp;
-		}
-		
-		public int compareResourceAndLocation(IMarker marker, MessageMetaData mmd) {
-			int resCmp = compare(getResource(marker), mmd.getResource());
-			if(resCmp != 0) {
-				return resCmp;
-			}
-			
-			if(mmd.isSetLineNumber()) {
-				Integer aLineNo = getLineNumber(marker);
-				int bLineNo = mmd.getLineNumber();
-				if(aLineNo != null) {
-					return compare(aLineNo.intValue(), bLineNo);
-				}
-			}
-
-			if(mmd.isSetLocation()) {
-				String aLocation = getLocation(marker);
-				String bLocation = mmd.getLocation();
-				if((aLocation != null) && (bLocation != null)) {
-					return compare(aLocation, bLocation);
-				}
-			}
-			
-			// If one has a line number and the other has a text location, can't compare
-			// the location, so just assume that they're equal.
-			return resCmp;
-		}
-		
-		public int compareResourceAndLocation(MessageMetaData mmd, IMarker marker) {
-			int resCmp = compare(mmd.getResource(), getResource(marker));
-			if(resCmp != 0) {
-				return resCmp;
-			}
-
-			if(mmd.isSetLineNumber()) {
-				int aLineNo = mmd.getLineNumber();
-				Integer bLineNo = getLineNumber(marker);
-				if(bLineNo!= null) {
-					return compare(aLineNo, bLineNo.intValue());
-				}
-			}
-
-			if(mmd.isSetLocation()) {
-				String aLocation = mmd.getLocation();
-				String bLocation = getLocation(marker);
-				if((aLocation != null) && (bLocation != null)) {
-					return compare(aLocation, bLocation);
-				}
-			}
-			
-			// If one has a line number and the other has a text location, can't compare
-			// the location, so just assume that they're equal.
-			return resCmp;
-		}
-		
-		public int compareResourceAndLocation(MessageMetaData aMMD, MessageMetaData bMMD) {
-			int resCmp = compare(aMMD.getResource(), bMMD.getResource());
-			if(resCmp != 0) {
-				return resCmp;
-			}
-
-			if(aMMD.isSetLineNumber() && bMMD.isSetLineNumber()) {
-				int aLineNo = aMMD.getLineNumber();
-				int bLineNo = bMMD.getLineNumber();
-				return compare(aLineNo, bLineNo);
-			}
-
-			if(aMMD.isSetLocation() && bMMD.isSetLocation()) {
-				String aLocation = aMMD.getLocation();
-				String bLocation = bMMD.getLocation();
-				if((aLocation != null) && (bLocation != null)) {
-					return compare(aLocation, bLocation);
-				}
-			}
-			
-			// If one has a line number and the other has a text location, can't compare
-			// the location, so just assume that they're equal.
-			return resCmp;
-		}
-	}
-	
-	public static MessagePrefixComparator getMessagePrefixComparator() {
-		if(_messagePrefixComparator == null) {
-			_messagePrefixComparator = new MessagePrefixComparator();
-		}
-		return _messagePrefixComparator;
-	}
-	
-	static class MessagePrefixComparator implements Comparator {
-		public int compare(Object a, Object b) {
-			String aPrefix = null;
-			String bPrefix = null;
-			if(a instanceof PropertyLine) {
-				aPrefix = ((PropertyLine)a).getMessagePrefix();
-			}
-			else if(a instanceof MessageMetaData) {
-				aPrefix = ((MessageMetaData)a).getMessagePrefix();
-			}
-			
-			if(b instanceof PropertyLine) {
-				bPrefix = ((PropertyLine)b).getMessagePrefix();
-			}
-			else if(b instanceof MessageMetaData) {
-				bPrefix = ((MessageMetaData)b).getMessagePrefix();
-			}
-
-			if(aPrefix.length() == 9) {
-				aPrefix = aPrefix.substring(0, 9);
-			}
-			
-			if(bPrefix.length() == 9) {
-				bPrefix = bPrefix.substring(0, 9);
-			}
-			
-			return aPrefix.compareTo(bPrefix);
-		}
-	}
-		
-	class MessageIdComparator implements Comparator {
-		private boolean _verbose = false;
-		private IBuffer _buffer = null;
-		
-		public boolean isVerbose() {
-			return _verbose;
-		}
-		
-		public void setVerbose(boolean v) {
-			_verbose = v;
-		}
-		
-		public IBuffer getBuffer() {
-			return _buffer;
-		}
-		
-		public void setBuffer(IBuffer b) {
-			_buffer = b;
-		}
-		
-		public String getMessageId(IMarker marker) {
-			try {
-				return (String)marker.getAttribute(ConfigurationConstants.VALIDATION_MARKER_MESSAGEID);
-			}
-			catch(CoreException exc) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, exc);
-				}
-				return ""; //$NON-NLS-1$
-			}
-		}
-		
-		public int compare(String aStr, String bStr) {
-			if((aStr == null) && (bStr == null)) {
-				return 0;
-			}
-			else if(aStr == null) {
-				return 1;
-			}
-			else if(bStr == null) {
-				return -1;
-			}
-			return aStr.compareTo(bStr);
-		}
-		
-		public int compare(Object a, Object b) {
-			if((a == null) && (b == null)) {
-				return 0;
-			}
-			else if(a == null) {
-				return 1;
-			}
-			else if(b == null) {
-				return -1;
-			}
-			
-			
-			// Sort first on the version, then on the message prefix
-			if((a instanceof String) && (b instanceof String)) {
-				String aStr = (String)a;
-				String bStr = (String)b;
-				return compare(aStr, bStr);
-			}
-			else if ((a instanceof PropertyLine) && (b instanceof PropertyLine)) {
-				PropertyLine aM = (PropertyLine)a;
-				PropertyLine bM = (PropertyLine)b;
-				
-				return compare(aM.getMessageId(), bM.getMessageId());
-			}
-			else if ((a instanceof PropertyLine) && (b instanceof IMarker)) {
-				PropertyLine aM = (PropertyLine)a;
-				IMarker bM = (IMarker)b;
-				
-				return compare(aM.getMessageId(), getMessageId(bM));
-			}
-			else if((a instanceof IMarker) && (b instanceof PropertyLine)) {
-				IMarker aM = (IMarker)a;
-				PropertyLine bM = (PropertyLine)b;
-				
-				return compare(getMessageId(aM), bM.getMessageId());
-			}
-			else if((a instanceof IMarker) && (b instanceof IMarker)) {
-				IMarker aM = (IMarker)a;
-				IMarker bM = (IMarker)b;
-
-				return compare(getMessageId(aM), getMessageId(bM));
-			}
-			
-			// else put it at the end of the list
-			return 1;
-		}
-	};
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/OperationTestcase.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/OperationTestcase.java
deleted file mode 100644
index 1ecc44a..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/OperationTestcase.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.eclipse.jst.validation.test.internal.registry;
-
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.IOperationRunnable;
-import org.eclipse.jst.validation.test.setup.IBuffer;
-
-/**
- * Instead of testing a validator, an operation test case tests the 
- * validation framework.
- */
-public class OperationTestcase implements ITestcaseMetaData {
-	private String _pluginId = null; // The plugin id that has contributed this test case.
-	private String _projectName = null; // the name of the project that this test case tests
-	private String _inputFileName = null;
-	private String _opName = null; // the name of the test case
-	private IOperationRunnable _runnable = null;
-
-	public OperationTestcase(String pluginId, String projectName, String opName, String inputFileName, IOperationRunnable runnable) {
-		_pluginId = pluginId;
-		_projectName = projectName;
-		_inputFileName = inputFileName;
-		_opName = opName;
-		_runnable = runnable;
-	}
-	
-	public String getName() {
-		return _opName;
-	}
-	
-	public boolean isVisible() {
-		return true; // framework test cases are always visible on the test collector menu
-	}
-	
-	public String getDeclaringPluginId() {
-		return _pluginId;
-	}
-	
-	public String getProjectName() {
-		return _projectName;
-	}
-	
-	public IProject getProject() {
-		return TestcaseUtility.findProject(this);
-	}
-	
-	public String getInputFileName() {
-		return _inputFileName;
-	}
-	
-	public IOperationRunnable getRunnable() {
-		return _runnable;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.validation.test.internal.registry.ITestcaseMetaData#run(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.jst.validation.test.setup.IBuffer, org.eclipse.core.resources.IProject)
-	 */
-	public void run(IBuffer buffer, IProject project) {
-		try {
-			getRunnable().setBuffer(buffer);
-			getRunnable().setProject(project);
-			getRunnable().setName(getName());
-			ResourcesPlugin.getWorkspace().run(getRunnable(), buffer.getProgressMonitor());
-		}
-		catch(CoreException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc); //$NON-NLS-1$
-			}
-		}
-	}
-
-	public String toString() {
-		return getName();
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/RegistryConstants.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/RegistryConstants.java
deleted file mode 100644
index 134032e..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/RegistryConstants.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.eclipse.jst.validation.test.internal.registry;
-
-/**
- * Validation constants needed to declare an extension point, and
- * to implement an extension.
- */
-public interface RegistryConstants {
-	public static final String PLUGIN_ID = org.eclipse.jst.validation.test.BVTValidationPlugin.PLUGIN_ID;
-	
-	public static final String VALIDATOR_TESTCASE_EXT_PT_ID = "test"; // extension point declaration of the validator test case //$NON-NLS-1$
-	public static final String VALIDATOR_SETUP_EXT_PT_ID = "testSetup"; // extension point declaration of the test case setup mechanism (i.e., import the EAR or JAR) //$NON-NLS-1$
-	public static final String VALIDATOR_OPERATION_TESTCASE_EXT_PT_ID = "opTest"; // extension point declaration of the operation test case //$NON-NLS-1$
-	
-	public static final Double EJB20 = new Double(2.0); // EJB 2.0 input or 1.3 EAR
-	public static final Double EJB11 = new Double(1.1); // EJB 1.1 input or 1.2 EAR
-	public static final Double EJB = null; // common EJB level, such as reflection errors
-	public static final String EJB20_MSSG = "ejb20"; // in a .properties line, if the message id contains this string, it's an EJB 2.0 rule //$NON-NLS-1$
-	public static final String EJB11_MSSG = "ejb11"; // in a .properties line, if the message id contains this string, it's an EJB 1.1 rule //$NON-NLS-1$
-	public static final String EJB_MSSG = null; // in a .properties file, if the message is neither EJB20 nor EJB11, the rule is cross-specs. (e.g. reflection errors) //$NON-NLS-1$
-	
-
-	/*package*/ static final String ATT_VALIDATOR = "validator"; // the validator  //$NON-NLS-1$
-	/*package*/ static final String ATT_PLUGIN = "plugin"; // identifies the plugin which has the class //$NON-NLS-1$
-	/*package*/ static final String TAG_TEST = "test"; //$NON-NLS-1$
-	/*package*/ static final String TAG_IMPORT = "import"; //$NON-NLS-1$
-	/*package*/ static final String ATT_OPERATION = "operation"; // the fully-qualified name of the IImportOperation which is used to import the input //$NON-NLS-1$
-	/*package*/ static final String ATT_INPUT = "input"; //$NON-NLS-1$
-	/*package*/ static final String ATT_VERSION = "version"; // the version of the input, e.g. EJB 1.1 vs. EJB 2.0 //$NON-NLS-1$
-	/*package*/ static final String TAG_MESSAGE = "message"; //$NON-NLS-1$
-	/*package*/ static final String ATT_PREFIX = "prefix"; //$NON-NLS-1$
-	/*package*/ static final String ATT_SEVERITY = "severity"; //$NON-NLS-1$
-	/*package*/ static final String ATT_PROJECT = "project"; //$NON-NLS-1$
-	/*package*/ static final String ATT_RESOURCE = "resource"; //$NON-NLS-1$
-	/*package*/ static final String ATT_LOCATION = "location"; //$NON-NLS-1$
-	/*package*/ static final String ATT_TEXT = "text"; //$NON-NLS-1$
-	/*package*/ static final String ATT_VISIBLE = "visible"; // Is this test visible on the Test Collector menu? //$NON-NLS-1$
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestSetupImport.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestSetupImport.java
deleted file mode 100644
index 7205a9e..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestSetupImport.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.eclipse.jst.validation.test.internal.registry;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.util.logging.Level;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.setup.IImportOperation;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-/**
- * This class holds the metadata needed to import an .ear or
- * a .jar file to set up a test case in batch mode.
- */
-public class TestSetupImport {
-	private String _fileName = null;
-	private IImportOperation _importOperation = null;
-
-	public TestSetupImport(IImportOperation op, String fileName) {
-		_importOperation = op;
-		_fileName = fileName;
-	}
-
-	public File getInputFile(String dir) {
-		File file = new File(dir, getFileName());
-		if(!file.exists()) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, "File " + file.getAbsolutePath() + " must exist and have read access."); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			return null;
-		}
-		
-		return file;
-	}
-	
-	public String getFileName() {
-		return _fileName;
-	}
-	
-	public IImportOperation getOperation() {
-		return _importOperation;
-	}
-	
-	/**
-	 * Return true if the file was found and imported successfully.
-	 */
-	public boolean importFile(IProgressMonitor monitor, String dir) {
-		Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-		int executionMap = 0x0;
-		boolean imported = true;
-		try {
-			File file = getInputFile(dir);
-			executionMap |= 0x1;
-			try {
-				IImportOperation op = getOperation();
-				executionMap |= 0x2;
-				imported = op.run(monitor, file);
-				executionMap |= 0x4;
-			}
-			catch (InterruptedException exc) {
-				executionMap |= 0x8;
-				imported = false;
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			catch (InvocationTargetException exc) {
-				executionMap |= 0x10;
-				imported = false;
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-					if(exc.getTargetException() != null) {
-						entry.setTargetException(exc.getTargetException());
-						logger.write(Level.SEVERE, entry);
-					}
-				}
-			}
-			catch (Throwable exc) {
-				executionMap |= 0x20;
-				imported = false;
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-		finally {
-			if(!imported) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setExecutionMap(executionMap);
-				entry.setText("TestSetup for " + dir + " was unsuccessful."); //$NON-NLS-1$ //$NON-NLS-2$
-				logger.write(Level.SEVERE, entry);
-			}
-			
-		}
-		return imported;
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestcaseMetaData.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestcaseMetaData.java
deleted file mode 100644
index b4f2c56..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestcaseMetaData.java
+++ /dev/null
@@ -1,160 +0,0 @@
-package org.eclipse.jst.validation.test.internal.registry;
-
-import java.io.File;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.IPluginRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-
-public class TestcaseMetaData {
-	private String _pluginId = null; // The plugin id that has contributed this test case.
-	private ValidatorMetaData _vmd = null;
-	private MessageMetaData[] _messages = null;
-	private String _project = null; // the name of the project that this test case tests
-	private String[] _resourceNames = null; // the resources listed in the MessageMetaData of this test case.
-	private String _inputFileName = null;
-	private String _name = null; // the name of the test case
-	
-	public TestcaseMetaData(String pluginName, String project, ValidatorMetaData vmd, String inputFileName) {
-		_pluginId = pluginName;
-		_project = project;
-		_vmd = vmd;
-		_inputFileName = inputFileName;
-	}
-	
-	public String getDeclaringPluginId() {
-		return _pluginId;
-	}
-	
-	public String getProject() {
-		return _project;
-	}
-	
-	public IProject findProject() {
-		return ResourcesPlugin.getWorkspace().getRoot().getProject(_project);
-	}
-	
-	public String getInputFileName() {
-		return _inputFileName;
-	}
-	
-	public int getNumMessages() {
-		return getMessages().size();
-	}
-	
-	// The messages need to be stored in a list instead of an array because
-	// the list is sorted before searching & displaying.
-	public List getMessages() {
-		List copy = new ArrayList();
-		for(int i=0; i<_messages.length; i++) {
-			copy.add(_messages[i]);
-		}
-		
-		return copy;
-	}
-	
-	// Return the resources in this project for which there is a message in this test case.
-	// No resource instance will be in the resource more than once.
-	public IResource[] getResources(IProject project) {
-		Set temp = new HashSet(); // use a set in case there is more than one message registered against a resource (don't want duplicates in the list).
-		String[] resourceNames = getResourceNames();
-		for(int i=0; i<resourceNames.length; i++) {
-			String resourceName = resourceNames[i];
-			IResource resource = project.findMember(resourceName);
-			if(resource != null) {
-				// resource exists
-				temp.add(resource);
-			}
-		}
-		
-		IResource[] result = new IResource[temp.size()];
-		temp.toArray(result);
-		return result;
-	}
-	
-	public String[] getResourceNames() {
-		if(_resourceNames == null) {
-			_resourceNames = new String[_messages.length];
-			for(int i=0; i<_messages.length; i++) {
-				_resourceNames[i] = _messages[i].getResource();
-			}
-		}
-		return _resourceNames;
-	}
-	
-	/**
-	 * When an empty TMD is used to test an operation, and the operation needs the IResource[]
-	 * affected by the TMD to know whether or not the operation passes (i.e., one of the ValidatorSubsetOperation
-	 * constructors takes an IResource[], and the IResource[] must not be empty or null), then
-	 * this method is used to set the "resources" affected by the test case.
-	 */
-	public void setResourceNames(String[] resourceNames) {
-		_resourceNames = resourceNames;
-	}
-	
-	public void setMessages(MessageMetaData[] messages) {
-		// If messages are null, that means that the test case expects no validation errors.
-		_messages = ((messages == null) ? new MessageMetaData[0] : messages);
-	}
-	
-	public ValidatorMetaData getValidatorMetaData() {
-		return _vmd;
-	}
-	
-	public String getValidatorClass() {
-		return getValidatorMetaData().getValidatorUniqueName();
-	}
-
-	public String getName() {
-		if(_name == null) {
-			_name = _vmd.getValidatorDisplayName() + "::" + getProject(); //$NON-NLS-1$
-		}
-		return _name;
-	}	
-	
-	public String getInputDir() {
-		// If the directory where the testcase input isn't specified, 
-		// assume that the input is in a subdirectory, named "testInput",
-		// of the testcase's plugin.
-		IPluginRegistry registry = Platform.getPluginRegistry();
-		IPluginDescriptor descriptor = registry.getPluginDescriptor(getDeclaringPluginId());
-		if(descriptor != null) {
-			// Because Platform.asLocalURL throws an IOException if the URL resolves
-			// to a directory, find the plugin.xml file and then strip off the file name 
-			// to find the testInput directory.
-			try {
-				String pluginXmlPath = Platform.asLocalURL(new URL(descriptor.getInstallURL(), "plugin.xml")).getPath(); //$NON-NLS-1$
-				File pluginXml = new File(pluginXmlPath);
-				if(pluginXml.exists()) {
-					File inputDir = new File(pluginXml.getParent(), "testInput"); //$NON-NLS-1$
-					if (inputDir.exists() && inputDir.isDirectory()) {
-						return inputDir.getPath();
-					}
-				}
-			}
-			catch(java.io.IOException exc) {
-			    Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.getLevel() == Level.SEVERE) {
-					logger.write(Level.SEVERE, exc);
-				}
-			}
-		}
-		
-		// Should never get here, but if we do, assume that the input 
-		// directory is the current directory.
-		return System.getProperty("user.dir"); //$NON-NLS-1$
-	}
-}
-
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestcaseUtility.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestcaseUtility.java
deleted file mode 100644
index 32d58e3..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestcaseUtility.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.eclipse.jst.validation.test.internal.registry;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.net.URL;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.IPluginRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-
-/**
- * Utility class that contains convenience methods for test cases.
- */
-public final class TestcaseUtility {
-	/**
-	 * Load the project that this test case is supposed to run on.
-	 */
-	public static IProject findProject(ITestcaseMetaData tmd) {
-		if(tmd == null) {
-			return null;
-		}
-		
-		return ResourcesPlugin.getWorkspace().getRoot().getProject(tmd.getProjectName());
-	}
-
-	/**
-	 * Return the directory where the input for this test case can be located.
-	 */
-	public static String getInputDir(ITestcaseMetaData tmd) {
-		// If the directory where the testcase input isn't specified, 
-		// assume that the input is in a subdirectory, named "testInput",
-		// of the testcase's plugin.
-		IPluginRegistry registry = Platform.getPluginRegistry();
-		IPluginDescriptor descriptor = registry.getPluginDescriptor(tmd.getDeclaringPluginId());
-		if(descriptor != null) {
-			// Because Platform.asLocalURL throws an IOException if the URL resolves
-			// to a directory, find the plugin.xml file and then strip off the file name 
-			// to find the testInput directory.
-			try {
-				String pluginXmlPath = Platform.asLocalURL(new URL(descriptor.getInstallURL(), "plugin.xml")).getPath(); //$NON-NLS-1$
-				File pluginXml = new File(pluginXmlPath);
-				if(pluginXml.exists()) {
-					File inputDir = new File(pluginXml.getParent(), "testInput"); //$NON-NLS-1$
-					if (inputDir.exists() && inputDir.isDirectory()) {
-						return inputDir.getPath();
-					}
-				}
-			}
-			catch(java.io.IOException exc) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, exc);
-				}
-			}
-		}
-		
-		// Should never get here, but if we do, assume that the input 
-		// directory is the current directory.
-		return System.getProperty("user.dir"); //$NON-NLS-1$
-	}
-
-	/**
-	 * logFileName must point to a fully-qualified file.
-	 */
-	public static void flush(String logFileName, String buffer, boolean append) {
-		try {
-			FileWriter writer = new FileWriter(logFileName, append);
-			writer.write(buffer); // Write the entire report to the state log.
-			writer.close();
-		}
-		catch(IOException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-		}
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/ValidatorTestcase.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/ValidatorTestcase.java
deleted file mode 100644
index f9fb765..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/ValidatorTestcase.java
+++ /dev/null
@@ -1,480 +0,0 @@
-package org.eclipse.jst.validation.test.internal.registry;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.BVTValidationException;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.ValidationTypeEnum;
-import org.eclipse.jst.validation.test.internal.util.BVTRunner;
-import org.eclipse.jst.validation.test.setup.IBuffer;
-import org.eclipse.wst.validation.internal.ConfigurationManager;
-import org.eclipse.wst.validation.internal.GlobalConfiguration;
-import org.eclipse.wst.validation.internal.TaskListUtility;
-import org.eclipse.wst.validation.internal.VThreadManager;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-import org.eclipse.wst.validation.internal.core.IFileDelta;
-import org.eclipse.wst.validation.internal.operations.ValidatorSubsetOperation;
-
-public class ValidatorTestcase implements ITestcaseMetaData {
-	private String _pluginId = null; // The plugin id that has contributed this test case.
-	private ValidatorMetaData _vmd = null;
-	private MessageMetaData[] _messages = null;
-	private String _projectName = null; // the name of the project that this test case tests
-	private String[] _resourceNames = null; // the resources listed in the MessageMetaData of this test case.
-	private String _inputFileName = null;
-	private String _name = null; // the name of the test case
-	private boolean _visible = true; // Is this test case visible on the Test Collector menu
-	
-	public ValidatorTestcase(String pluginName, String project, ValidatorMetaData vmd, String inputFileName, boolean visible) {
-		_pluginId = pluginName;
-		_projectName = project;
-		_vmd = vmd;
-		_inputFileName = inputFileName;
-		_visible = visible;
-	}
-	
-	public boolean isVisible() {
-		return _visible;
-	}
-	
-	public String getDeclaringPluginId() {
-		return _pluginId;
-	}
-	
-	public String getProjectName() {
-		return _projectName;
-	}
-	
-	public IProject getProject() {
-		return TestcaseUtility.findProject(this);
-	}
-	
-	public String getInputFileName() {
-		return _inputFileName;
-	}
-	
-	/**
-	 * Return the number of messages
-	 */
-	public int getNumMessages() {
-		return getMessages(ValidationTypeEnum.RUN_VALIDATION).size();
-	}
-	
-	/**
-	 * Return the list of messages that should be reported for the given build
-	 * type. (e.g. if the validator does not support incremental validation,
-	 * then instead of returning the list of expected messages, return an empty 
-	 * list.)
-	 */
-	public List getMessages(int buildType) {
-		// The messages need to be stored in a list instead of an array because
-		// the list is sorted before searching & displaying.
-		switch(buildType) {
-			case(ValidationTypeEnum.AUTO_VALIDATION):
-			case(ValidationTypeEnum.INCREMENTAL_VALIDATION): {
-				if(!getValidatorMetaData().isIncremental()) {
-					return Collections.EMPTY_LIST;
-				}
-				// Otherwise, return the default copy below.
-				break;
-			}
-
-			case(ValidationTypeEnum.FULL_VALIDATION): {
-				if(!getValidatorMetaData().isFullBuild()) {
-					return Collections.EMPTY_LIST;
-				}
-				// Otherwise, return the default copy below.
-				break;
-			}
-
-			case(ValidationTypeEnum.RUN_VALIDATION):
-			default: {
-				// Return the default copy below.
-			}
-			
-		}
-		
-		List copy = new ArrayList();
-		for(int i=0; i<_messages.length; i++) {
-			copy.add(_messages[i]);
-		}
-		
-		return copy;
-	}
-	
-	// Return the resources in this project for which there is a message in this test case.
-	// No resource instance will be in the resource more than once.
-	public IResource[] getResources(IProject project) {
-		Set temp = new HashSet(); // use a set in case there is more than one message registered against a resource (don't want duplicates in the list).
-		String[] resourceNames = getResourceNames();
-		for(int i=0; i<resourceNames.length; i++) {
-			String resourceName = resourceNames[i];
-			IResource resource = project.findMember(resourceName);
-			if(resource != null) {
-				// resource exists
-				temp.add(resource);
-			}
-		}
-		
-		IResource[] result = new IResource[temp.size()];
-		temp.toArray(result);
-		return result;
-	}
-	
-	public String[] getResourceNames() {
-		if(_resourceNames == null) {
-			_resourceNames = new String[_messages.length];
-			for(int i=0; i<_messages.length; i++) {
-				_resourceNames[i] = _messages[i].getResource();
-			}
-		}
-		return _resourceNames;
-	}
-	
-	/**
-	 * When an empty TMD is used to test an operation, and the operation needs the IResource[]
-	 * affected by the TMD to know whether or not the operation passes (i.e., one of the ValidatorSubsetOperation
-	 * constructors takes an IResource[], and the IResource[] must not be empty or null), then
-	 * this method is used to set the "resources" affected by the test case.
-	 */
-	public void setResourceNames(String[] resourceNames) {
-		_resourceNames = resourceNames;
-	}
-	
-	public void setMessages(MessageMetaData[] messages) {
-		// If messages are null, that means that the test case expects no validation errors.
-		_messages = ((messages == null) ? new MessageMetaData[0] : messages);
-	}
-	
-	public ValidatorMetaData getValidatorMetaData() {
-		return _vmd;
-	}
-	
-	public String getValidatorClass() {
-		return getValidatorMetaData().getValidatorUniqueName();
-	}
-
-	public String getName() {
-		if(_name == null) {
-			_name = _vmd.getValidatorDisplayName() + "::" + getProjectName(); //$NON-NLS-1$
-		}
-		return _name;
-	}	
-	
-	public void run(IBuffer buffer, IProject project) {
-		String status = ">>>>>RUN VALIDATION TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$			
-		buffer.getProgressMonitor().subTask(status);
-		buffer.write(status);
-		buffer.addExecutionStatus(getName(), ValidationTypeEnum.RUN_VALIDATION_NAME, validate(buffer, project, ValidationTypeEnum.RUN_VALIDATION, ValidationTypeEnum.RUN_VALIDATION_NAME));
-		status = ">>>>>END RUN VALIDATION TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
-		buffer.getProgressMonitor().subTask(status);
-		buffer.write(status);
-		
-		status = ">>>>>FULL BUILD TEST PASS [" + project.getName() + "]>>>>>";			//$NON-NLS-1$ //$NON-NLS-2$		
-		buffer.getProgressMonitor().subTask(status);
-		buffer.write(status);
-		buffer.addExecutionStatus(getName(), ValidationTypeEnum.FULL_VALIDATION_NAME, validate(buffer, project, ValidationTypeEnum.FULL_VALIDATION, ValidationTypeEnum.FULL_VALIDATION_NAME));
-		status = ">>>>>END FULL BUILD TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
-		buffer.getProgressMonitor().subTask(status);
-		buffer.write(status);
-		
-		status = ">>>>>INCREMENTAL BUILD TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
-		buffer.getProgressMonitor().subTask(status);
-		buffer.write(status);
-		buffer.addExecutionStatus(getName(), ValidationTypeEnum.INCREMENTAL_VALIDATION_NAME, validate(buffer, project, ValidationTypeEnum.INCREMENTAL_VALIDATION, ValidationTypeEnum.INCREMENTAL_VALIDATION_NAME));
-		status = ">>>>>END INCREMENTAL BUILD TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
-		buffer.getProgressMonitor().subTask(status);
-		buffer.write(status);
-		
-		status = ">>>>>AUTO BUILD TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
-		buffer.getProgressMonitor().subTask(status);
-		buffer.write(status);
-		buffer.addExecutionStatus(getName(), ValidationTypeEnum.AUTO_VALIDATION_NAME, validate(buffer, project, ValidationTypeEnum.AUTO_VALIDATION, ValidationTypeEnum.AUTO_VALIDATION_NAME));
-		status = ">>>>>END AUTO BUILD TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
-		buffer.getProgressMonitor().subTask(status);
-		buffer.write(status);
-		
-		if(getValidatorMetaData().isAsync()) {
-			status = ">>>>>ASYNCHRONOUS VALIDATION TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
-			buffer.getProgressMonitor().subTask(status);
-			buffer.write(status);
-			buffer.addExecutionStatus(getName(), ValidationTypeEnum.ASYNC_NAME, asyncValidate(buffer, project, ValidationTypeEnum.ASYNC_NAME));
-			status = ">>>>>END ASYNCHRONOUS VALIDATION TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
-			buffer.getProgressMonitor().subTask(status);
-			buffer.write(status);
-		}
-		else {
-			// By default, "pass" the asynchrous tests of any validator that cannot run asynchronous tests.
-			buffer.addExecutionStatus(getName(), ValidationTypeEnum.ASYNC_NAME, true);
-		}
-	}
-	
-	private boolean validate(IBuffer buffer, IProject project, int validationTypeEnum, String taskName) {
-		long start = System.currentTimeMillis();
-		boolean passed = true;
-		try {
-			passed = BVTRunner.singleton().test(buffer, project, this, validationTypeEnum);
-		}
-		catch(BVTValidationException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-		}
-		finally {
-			long end = System.currentTimeMillis();
-			buffer.addElapsedTime(taskName, (end - start));
-			buffer.write("Total time for validator " + getValidatorMetaData().getValidatorDisplayName() + " of project " + project.getName() + " in " + taskName + " mode was " + (end - start) + " milliseconds."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-		}
-		return passed;
-	}
-	
-	private boolean asyncValidate(IBuffer buffer, IProject project, String subTaskName) {
-		boolean passed = true;
-		long start = System.currentTimeMillis();
-		long end = 0;
-		try {
-			GlobalConfiguration gconf = ConfigurationManager.getManager().getGlobalConfiguration();
-			boolean autoValidate = gconf.isAutoValidate();
-			boolean buildValidate = gconf.isBuildValidate();
-			try {
-				// Turn off auto-validate so that the project isn't validated automatically.
-				gconf.setAutoValidate(false);
-				gconf.setBuildValidate(false);
-				gconf.passivate();
-				
-				// Two tests: 
-				//   1. Run validation on copies of the original project: "projectName.fork" and "projectName.noFork"
-				//      Compare the markers of the copies to the FVT TestcaseMetaData, and the validator passes if the 
-				//		results of each copy matches the TestcaseMetaData.
-				//   2. Run validation on copies, but this time introduce changes during the validation.
-				//		Extract the names of resources from the testcase metadata, find those resources, and
-				//		add/delete/rename/move/close/change them.
-				
-				boolean pass1 = validateAndCompare(buffer, project, subTaskName);
-				boolean pass2 = validateChangeAndCompare(buffer, project, IFileDelta.CHANGED, subTaskName);
-				boolean pass3 = validateChangeAndCompare(buffer, project, IFileDelta.DELETED, subTaskName);
-				passed = (pass1 && pass2 && pass3);
-			}
-			catch(CoreException exc) {
-				// Couldn't create copy.Just continue with the next test.
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, exc);
-				}
-			}
-			catch(BVTValidationException exc) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, exc);
-					if(exc.getTargetException() != null) {
-						logger.write(Level.SEVERE, exc.getTargetException());
-					}
-				}
-			}
-			catch(Throwable exc) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, exc);
-				}
-			}
-			finally {
-				gconf.setAutoValidate(autoValidate);
-				gconf.setBuildValidate(buildValidate);
-				gconf.passivate();
-			}
-		}
-		catch(InvocationTargetException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-		}
-		finally {
-			end = System.currentTimeMillis();
-			buffer.addElapsedTime(ValidationTypeEnum.ASYNC_NAME, (end - start));
-			buffer.write("Total time for validator " + getValidatorMetaData().getValidatorDisplayName() + " of project " + project.getName() + " in asynchronous mode was " + (end - start) + " milliseconds."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-			
-		}
-		return passed;
-	}
-
-	/**
-	 * Run validation, using several operations (both forked and not forked), on the IProject.
-	 * Return true if the result, after the last operation is complete, is the expected result.
-	 */
-	private boolean validateAndCompare(IBuffer buffer, IProject project, String subTaskName) throws CoreException, BVTValidationException {
-		// Now compare the IProject's result to the expected TestcaseMetaData result.
-		// Validate
-		ValidatorSubsetOperation noForkOp = new ValidatorSubsetOperation(project, true, false);
-		noForkOp.setValidators(getValidatorMetaData().getValidatorNames());
-		noForkOp.run(buffer.getProgressMonitor());
-		
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		ValidatorSubsetOperation forkOp = new ValidatorSubsetOperation(project, true, true);
-		forkOp.setValidators(getValidatorMetaData().getValidatorNames());
-		forkOp.run(buffer.getProgressMonitor());
-		
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		ValidatorSubsetOperation noForkOp2 = new ValidatorSubsetOperation(project, true, false);
-		noForkOp2.setValidators(getValidatorMetaData().getValidatorNames());
-		noForkOp2.run(buffer.getProgressMonitor());
-
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		ValidatorSubsetOperation forkOp2 = new ValidatorSubsetOperation(project, true, true);
-		forkOp2.setValidators(getValidatorMetaData().getValidatorNames());
-		forkOp2.run(buffer.getProgressMonitor());
-		
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		ValidatorSubsetOperation forkOp3 = new ValidatorSubsetOperation(project, true, true);
-		forkOp3.setValidators(getValidatorMetaData().getValidatorNames());
-		forkOp3.run(buffer.getProgressMonitor());
-		
-		// Wait until all of the threads have complete.
-		buffer.getProgressMonitor().subTask("Waiting for all forked threads to finish..."); //$NON-NLS-1$
-		while(!VThreadManager.getManager().isDone() && !buffer.getProgressMonitor().isCanceled()) {}
-		buffer.getProgressMonitor().subTask("All threads are complete. Beginning the comparison."); //$NON-NLS-1$
-		
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		// Compare
-		IMarker[] markers = TaskListUtility.getValidationTasks(project, getValidatorMetaData().getValidatorNames());
-
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		return BVTRunner.singleton().verify(buffer, getName(), subTaskName, project, getMessages(ValidationTypeEnum.RUN_VALIDATION), markers); 
-	}
-
-	private boolean validateChangeAndCompare(IBuffer buffer, IProject project, int ifileDeltaType, String subTaskName) throws BVTValidationException, CoreException {
-		boolean passed = true;
-		
-		ValidatorMetaData[] vmds = new ValidatorMetaData[]{getValidatorMetaData()};
-		
-		ValidatorSubsetOperation noForkOpOrig = new ValidatorSubsetOperation(project, true, false);
-		noForkOpOrig.setValidators(getValidatorMetaData().getValidatorNames());
-		noForkOpOrig.run(buffer.getProgressMonitor());
-
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		ValidatorSubsetOperation noForkOpChanged = new ValidatorSubsetOperation(project, vmds, getResources(project), ifileDeltaType, false, false); // false = do not force if there's no deltas to validate
-		noForkOpChanged.run(buffer.getProgressMonitor());
-
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		ValidatorSubsetOperation forkOpOrig = new ValidatorSubsetOperation(project, true, true);
-		forkOpOrig.setValidators(getValidatorMetaData().getValidatorNames());
-		forkOpOrig.run(buffer.getProgressMonitor());
-
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		ValidatorSubsetOperation forkOpChanged = new ValidatorSubsetOperation(project, vmds,  getResources(project), ifileDeltaType, false, true); // false = do not force if there's no deltas to validate
-		forkOpChanged.run(buffer.getProgressMonitor());
-		
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		ValidatorSubsetOperation noForkOp2Orig = new ValidatorSubsetOperation(project, true, false);
-		noForkOp2Orig.setValidators(getValidatorMetaData().getValidatorNames());
-		noForkOp2Orig.run(buffer.getProgressMonitor());
-
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		ValidatorSubsetOperation noForkOp2Changed = new ValidatorSubsetOperation(project, vmds,  getResources(project), ifileDeltaType, false, false); // false = do not force if there's no deltas to validate
-		noForkOp2Changed.run(buffer.getProgressMonitor());
-
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		ValidatorSubsetOperation forkOp2Orig = new ValidatorSubsetOperation(project, true, true);
-		forkOp2Orig.setValidators(getValidatorMetaData().getValidatorNames());
-		forkOp2Orig.run(buffer.getProgressMonitor());
-		
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		ValidatorSubsetOperation forkOp2Changed = new ValidatorSubsetOperation(project, vmds,  getResources(project), ifileDeltaType, false, true); // false = do not force if there's no deltas to validate
-		forkOp2Changed.run(buffer.getProgressMonitor());
-
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		ValidatorSubsetOperation forkOp3Orig = new ValidatorSubsetOperation(project, true, true);
-		forkOp3Orig.setValidators(getValidatorMetaData().getValidatorNames());
-		forkOp3Orig.run(buffer.getProgressMonitor());
-		
-		if(buffer.getProgressMonitor().isCanceled()) {
-			return false;
-		}
-
-		ValidatorSubsetOperation forkOp3Changed = new ValidatorSubsetOperation(project, vmds, getResources(project), ifileDeltaType, false, true); // false = do not force if there's no deltas to validate
-		forkOp3Changed.run(buffer.getProgressMonitor());
-		
-		// Wait until all of the threads have complete.
-		buffer.getProgressMonitor().subTask("Waiting for all forked threads to finish..."); //$NON-NLS-1$
-		while(!VThreadManager.getManager().isDone() && !buffer.getProgressMonitor().isCanceled()) {}
-		if(buffer.getProgressMonitor().isCanceled()) {
-			buffer.getProgressMonitor().subTask("Comparison cancelled. Performing cleanup."); //$NON-NLS-1$
-			return false;
-		}
-		buffer.getProgressMonitor().subTask("All threads are complete. Beginning the comparison."); //$NON-NLS-1$
-		
-		// Compare
-		IMarker[] markers = TaskListUtility.getValidationTasks(project, getValidatorMetaData().getValidatorNames());
-
-		// Now compare the IProject's result to the expected TestcaseMetaData result.
-		// Don't write _passed = _passed && get...
-		// When the _passed == false, then java didn't bother running the test.
-		passed = BVTRunner.singleton().verify(buffer, getName(), subTaskName, project, getMessages(ValidationTypeEnum.RUN_VALIDATION), markers);
-		
-		ResourcesPlugin.getWorkspace().deleteMarkers(markers);
-	
-		return passed;
-		
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BVTRunner.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BVTRunner.java
deleted file mode 100644
index dbd494e..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BVTRunner.java
+++ /dev/null
@@ -1,688 +0,0 @@
-package org.eclipse.jst.validation.test.internal.util;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.BVTValidationException;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.ValidationTypeEnum;
-import org.eclipse.jst.validation.test.internal.registry.BVTValidationRegistryReader;
-import org.eclipse.jst.validation.test.internal.registry.ITestcaseMetaData;
-import org.eclipse.jst.validation.test.internal.registry.MessageMetaData;
-import org.eclipse.jst.validation.test.internal.registry.MessageUtility;
-import org.eclipse.jst.validation.test.internal.registry.OperationTestcase;
-import org.eclipse.jst.validation.test.internal.registry.TestSetupImport;
-import org.eclipse.jst.validation.test.internal.registry.TestcaseUtility;
-import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
-import org.eclipse.jst.validation.test.setup.IBuffer;
-import org.eclipse.jst.validation.test.setup.ITestStatus;
-import org.eclipse.wst.validation.internal.InternalValidatorManager;
-import org.eclipse.wst.validation.internal.TaskListUtility;
-import org.eclipse.wst.validation.internal.VThreadManager;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-import org.eclipse.wst.validation.internal.operations.OneValidatorOperation;
-import org.eclipse.wst.validation.internal.operations.ValidationOperation;
-import org.eclipse.wst.validation.internal.operations.ValidatorManager;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-/**
- */
-public final class BVTRunner {
-	private static BVTRunner _inst = null;
-	private List _extra = null; // The extra markers reported (stored in a list to make reading easier).
-	private List _missing = null; // The missing MMD that were supposed to be reported (stored in a list to make reading easier).
-
-	public static BVTRunner singleton() {
-		if(_inst == null) {
-			_inst = new BVTRunner();
-		}
-		return _inst;
-	}
-	
-	private BVTRunner() {
-		super();
-		_extra = new ArrayList();
-		_missing = new ArrayList();
-	}
-	
-	private boolean isVerbose() {
-		Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-		if(logger.isLoggingLevel(Level.FINEST)) {
-			return true;
-		}
-		return false;
-	}
-
-	private char getSeverityChar(Integer severity) {
-		if(severity == null) {
-			return '?';
-		}
-		
-		switch(severity.intValue()) {
-			case(IMarker.SEVERITY_ERROR): {
-				return 'E';
-			}
-			
-			case(IMarker.SEVERITY_WARNING): {
-				return 'W';
-			}
-			
-			case(IMarker.SEVERITY_INFO): {
-				return 'I';
-			}
-			
-			default: {
-				return '?';
-			}
-		}
-	}
-	
-	private String[] getNames(IProject[] projects) {
-		if(projects == null) {
-			return new String[0];
-		}
-		String[] names = new String[projects.length];
-		for(int i=0; i<projects.length; i++) {
-			IProject project = projects[i];
-			names[i] = project.getName();
-		}
-		return names;
-	}
-
-	private void debug(IBuffer buffer, IMarker[] messages) {
-		if(messages == null) {
-			buffer.write("Nothing to debug because nothing was reported"); //$NON-NLS-1$
-		}
-		
-		for(int i=0; i<messages.length; i++) {
-			IMarker marker = messages[i];
-			buffer.write(MessageUtility.toString(marker));
-		}
-	}
-
-	protected IProgressMonitor getDebugMonitor(IProgressMonitor monitor) {
-		if(isVerbose()) {
-			return monitor;
-		}
-		else {
-			return new NullProgressMonitor(); // if verbose is true, show progress messages for the creation & validation of the project. Otherwise show only the BVT status.
-		}
-	}
-	
-	/**
-	 * When invoking the test from the UI, the input has already been imported, so just test it.
-	 * The name of the test is derived from the name of the project.
-	 * Return the number of tests that passed.
-	 */	
-	public int test(IBuffer buffer, IProject[] projects) throws BVTValidationException {	
-		String[] testNames = getNames(projects);
-		BVTValidationRegistryReader reader = BVTValidationRegistryReader.getReader();
-		
-		buffer.getProgressMonitor().beginTask("Running BVT tests", projects.length); //$NON-NLS-1$
-		int totalTests = 0;
-		int totalPassed = 0;
-		for(int i=0; i<projects.length; i++) {
-			buffer.getProgressMonitor().subTask("Testing project " + (i+1) + " of " + projects.length); //$NON-NLS-1$ //$NON-NLS-2$
-			IProject project = projects[i];
-			ValidatorTestcase[] tests = reader.getValidatorTests(buffer.getProgressMonitor(), testNames[i]);
-			if((tests == null) || (tests.length == 0)) {
-				buffer.getProgressMonitor().subTask("There are no tests to run."); //$NON-NLS-1$
-				continue;
-			}
-			
-			int numTestsPassed = 0;
-			for(int j=0; j<tests.length; j++) {
-				ValidatorTestcase tmd = tests[j];
-				if(test(buffer, project, tmd, ValidationTypeEnum.RUN_VALIDATION)) {
-					numTestsPassed++;
-					buffer.getProgressMonitor().subTask("Test " + (j+1) + " of " + tests.length + " passed."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-				else {
-					buffer.getProgressMonitor().subTask("Test " + (j+1) + " of " + tests.length + " failed."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-				buffer.getProgressMonitor().worked(1);
-			}
-			
-			totalTests += tests.length;
-			totalPassed += numTestsPassed;
-			
-			buffer.write(numTestsPassed + " of " + tests.length + " tests passed."); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		buffer.write("\n>>>>>>>>>>TEST RESULTS>>>>>>>>>>"); //$NON-NLS-1$
-		buffer.write(totalPassed + " of " + totalTests + " tests passed."); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.getProgressMonitor().done();
-		
-		return totalPassed;
-	}
-	
-	/**
-	 * Construct a ValidationOperation on the IProject, invoke the operation, and verify that the
-	 * resulting IMarkers match the expected messages in the tmd.
-	 */	
-	public boolean test(IBuffer buffer, IProject project, ValidatorTestcase tmd, int validationEnumType) throws BVTValidationException {
-		switch(validationEnumType) {
-			case(ValidationTypeEnum.RUN_VALIDATION): {
-				return test(buffer, tmd.getName(), ValidationTypeEnum.RUN_VALIDATION_NAME, tmd.getMessages(validationEnumType), new OneValidatorOperation(project, tmd.getValidatorClass(), true, false), InternalValidatorManager.getManager().getValidatorNames(new ValidatorMetaData[]{tmd.getValidatorMetaData()})); // true=force, false=no for
-			}
-			
-			case(ValidationTypeEnum.FULL_VALIDATION): {
-				return build(buffer, project, tmd, validationEnumType, ValidationTypeEnum.FULL_VALIDATION_NAME);
-			}
-			
-			case(ValidationTypeEnum.INCREMENTAL_VALIDATION): {
-				return build(buffer, project, tmd, validationEnumType, ValidationTypeEnum.INCREMENTAL_VALIDATION_NAME);
-			}
-			
-			case(ValidationTypeEnum.AUTO_VALIDATION): {
-				return build(buffer, project, tmd, validationEnumType, ValidationTypeEnum.AUTO_VALIDATION_NAME);
-			}
-			
-			default: {
-				buffer.addExecutionStatus(tmd.getName(), null, ITestStatus.FAIL, buffer, "Unrecognized validation option:" + validationEnumType); //$NON-NLS-1$
-				return false;
-			}
-		}
-	}
-	
-	private boolean build(IBuffer buffer, final IProject project, final ValidatorTestcase tmd, final int validationEnumType, String subTaskName) throws BVTValidationException {
-		try {
-			IProgressMonitor nullMonitor = new NullProgressMonitor();
-			ResourcesPlugin.getWorkspace().run(
-			new IWorkspaceRunnable(){
-				public void run(IProgressMonitor monitor) {
-					try {
-						IResource[] resources = tmd.getResources(project);
-						for(int i=0; i<resources.length; i++) {
-							IResource res = resources[i];
-							res.touch(monitor);
-						}
-					}
-					catch(CoreException exc) {
-						Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-						if(logger.isLoggingLevel(Level.SEVERE)) {
-							logger.write(exc);
-						}
-					}
-				}
-			}, nullMonitor);
-		}
-		catch(CoreException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(exc);
-			}
-			buffer.addExecutionStatus(tmd.getName(), subTaskName, ITestStatus.FAIL, buffer, "CoreException caught; stack trace in LoggingUtil.log"); //$NON-NLS-1$
-			return false;
-		}
-
-		try {
-			// Do not build using only the validation builder because some validators
-			// (i.e., the EJB Validator) depend on the output of other builders 
-			// (i.e., the Java Builder).
-			project.build(validationEnumType, new NullProgressMonitor());
-		}
-		catch(CoreException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(exc);
-			}
-			buffer.write("CoreException caught; stack trace in LoggingUtil.log"); //$NON-NLS-1$
-			return false;
-		}
-
-		IMarker[] messages = TaskListUtility.getValidationTasks(project, InternalValidatorManager.getManager().getValidatorNames(new ValidatorMetaData[]{tmd.getValidatorMetaData()}));
-		return verify(buffer, tmd.getName(), subTaskName, project, tmd.getMessages(validationEnumType), messages);
-	}
-	
-	/**
-	 * Run the given ValidationOperation and ensure that the results match the results of the given test case.
-	 * Return true if the results match and false if they don't.
-	 * 
-	 * This method is public because it's needed for the TestOpConstr operation.
-	 */
-	public boolean test(IBuffer buffer, String testName, String subTaskName, List expectedMessages, ValidationOperation op, String[] validatorNames) throws BVTValidationException {
-		IProgressMonitor debugMonitor = getDebugMonitor(buffer.getProgressMonitor());
-		boolean passed = true;
-		try {
-			
-			if(op == null) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.WARNING)) {
-					logger.write(Level.WARNING, "Cannot run tests because the Operation is null."); //$NON-NLS-1$
-				}
-				passed = false;
-			}
-			else {
-				try {
-						ValidatorManager.getManager().setNoMessageLimit(op.getProject());
-					
-						ResourcesPlugin.getWorkspace().run(op, debugMonitor); 
-						
-						if(op.isFork()) {
-							// Wait until all forked threads are complete
-							while(!VThreadManager.getManager().isDone()){};
-						}
-			
-						// Load the enabled validators from the test, not the operation,
-						// because the test has the messages for a single validator, and
-						// if the messages from all enabled validators are retrieved,
-						// then "extra" messages, reported by validators whose messages
-						// aren't expected by the test, fail the test case. 
-						IMarker[] messages = TaskListUtility.getValidationTasks(op.getProject(), validatorNames);
-						passed = verify(buffer, testName, subTaskName, op.getProject(), expectedMessages, messages);
-				}
-				catch(Throwable exc) {
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if(logger.isLoggingLevel(Level.SEVERE)) {
-						logger.write(Level.SEVERE, exc);
-					}
-					passed = false;
-				}
-			}
-		}
-		catch(Throwable exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-			passed = false;
-		}
-		return passed;
-	}
-
-	public boolean setupTests(IBuffer buffer, boolean verbose) {
-		ValidatorTestcase[] vts = BVTValidationRegistryReader.getReader().getValidatorTests(buffer.getProgressMonitor(), (String)null);
-		OperationTestcase[] ots = BVTValidationRegistryReader.getReader().getOperationTests(buffer.getProgressMonitor(), (String)null);
-		boolean successful = true;
-		for(int i=0; i<vts.length; i++) {
-			ValidatorTestcase vtest = vts[i];
-			successful = setupTests(buffer, vtest, false) && successful;
-		}
-		
-		for(int j=0; j<ots.length; j++) {
-			OperationTestcase otest = ots[j];
-			successful = setupTests(buffer, otest, false) && successful;
-		}
-		
-		return successful;
-	}
-	
-	/**
-	 * Return true if all of the test cases' input were found and imported.
-	 */
-	public boolean setupTests(IBuffer buffer, ITestcaseMetaData tmd, boolean verbose) {
-		int executionMap = 0x0;
-		boolean imported = true;
-		Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-		try {
-			BVTValidationRegistryReader reader = BVTValidationRegistryReader.getReader();
-	
-			// Each import operation deletes any project before it re-imports it.
-			String dir = TestcaseUtility.getInputDir(tmd);
-			TestSetupImport[] setup = reader.getTestSetup(buffer, dir, tmd, verbose);
-			if((setup == null) || (setup.length == 0)) {
-				String message = "Cannot import input that does not exist. Check that directory " + dir + " exists."; //$NON-NLS-1$ //$NON-NLS-2$ 
-				buffer.write(message);
-				executionMap |= 0x1;
-				imported = false;
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setExecutionMap(executionMap);
-					entry.setText(message);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			else {
-				buffer.getProgressMonitor().beginTask("Importing files; please wait...", setup.length); //$NON-NLS-1$
-				for(int i=0; i<setup.length; i++) {
-					buffer.getProgressMonitor().subTask("Importing file " + (i+1) + " of " + setup.length); //$NON-NLS-1$ //$NON-NLS-2$
-					if(!setup[i].importFile(buffer.getProgressMonitor(), dir)) {
-						// One of the input files couldn't be imported.
-						executionMap |= 0x2;
-						imported = false;
-						if(logger.isLoggingLevel(Level.SEVERE)) {
-							LogEntry entry = ValidationPlugin.getLogEntry();
-							entry.setExecutionMap(executionMap);
-							entry.setText("Import failed for dir " + dir); //$NON-NLS-1$
-							logger.write(Level.SEVERE, entry);
-						}
-						continue;
-					}
-					buffer.getProgressMonitor().worked(1);
-				}
-				buffer.getProgressMonitor().done();
-			}
-		}
-		finally {
-			if(!imported) {
-				String tmdName = (tmd == null) ? "?" : tmd.getName(); //$NON-NLS-1$
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setExecutionMap(executionMap);
-				entry.setText("Test setup for " + tmdName + " was unsuccessful."); //$NON-NLS-1$ //$NON-NLS-2$
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-		return imported;
-	}
-
-	/**
-	 * Return true if the expected messages (tmdMmdList) matches the reported messages (ml2).
-	 */
-	public boolean compare(IBuffer buffer, String testName, String subTaskName, List tmdMmdList, IMarker[] ml2) {
-		// Convert one of the arrays into a list so that it can be sorted.
-		int numMatched = 0;
-		List mmdList = new ArrayList(tmdMmdList); // create a copy of the tmd's expected output so that the tmd's output remains intact
-		int numExpected = mmdList.size();
-		int numReported = ml2.length;
-		boolean passed = true;
-	
-
-		try {		
-			Collections.sort(mmdList, MessageUtility.getMessageComparator(buffer, isVerbose()));
-	
-			try {
-				for(int i=0; i<ml2.length; i++) {
-					IMarker marker = ml2[i];
-					MessageMetaData matching = getMatchingMetaData(buffer, mmdList, marker);
-					if(matching == null) {
-						_extra.add(marker);
-						continue;
-					}
-					else {
-						// Every time a mmd is matched to a marker, remove the mmd
-						// from the list so that mmds without a marker can be flagged.
-						mmdList.remove(matching);
-						numMatched++;
-					}
-				}
-	
-				if(mmdList.size() != 0) {
-					_missing.addAll(mmdList);
-				}
-			}
-			catch(Throwable exc) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, exc);
-				}
-				passed = false;
-			}
-			finally {
-				passed = passed && ((_missing.size() == 0) && (_extra.size() == 0));
-				
-				// Report the missing markers after the MMD list is sorted
-				Collections.sort(_missing, MessageUtility.getMessageComparator(buffer, isVerbose()));
-				Iterator iterator = _missing.iterator();
-				while(iterator.hasNext()) {
-					MessageMetaData mmd = (MessageMetaData)iterator.next();
-					buffer.addExecutionStatus(testName, subTaskName, ITestStatus.FAIL, buffer, "ERROR[missing message]: " + MessageUtility.toString(mmd)); //$NON-NLS-1$
-				}
-				
-				// Report the extra markers after they're sorted.
-				Collections.sort(_extra, MessageUtility.getMessageComparator(buffer, isVerbose()));
-				iterator = _extra.iterator();
-				while(iterator.hasNext()) {
-					IMarker marker = (IMarker)iterator.next();
-					buffer.addExecutionStatus(testName, subTaskName, ITestStatus.FAIL, buffer, "ERROR[extra message]: " + MessageUtility.toString(marker) + ", Text is: \"" + MessageUtility.getMessage(marker) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-		
-				if(numExpected != numReported) {
-					buffer.write("Wrong number of messages reported. Expected " + numExpected + " and got " + numReported); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-	
-				buffer.write("Number of extra messages: " + _extra.size()); //$NON-NLS-1$
-				buffer.write("Number of missing messages: " + _missing.size()); //$NON-NLS-1$
-				buffer.write("Number of matched messages: " + numMatched); //$NON-NLS-1$
-			}
-		}
-		finally {
-			mmdList.clear();
-			_extra.clear(); // Clear the list of extra markers (stored in a list to make reading easier).
-			_missing.clear(); // Clear the list of missing markers (stored in a list to make reading easier).
-		}
-		return passed;
-	}
-	
-	public boolean verify(IBuffer buffer, String testName, String subTaskName, IProject project, List mmdListOrig, IMarker[] messages) {
-		buffer.write("Test case: " + testName); //$NON-NLS-1$
-
-		int numMatched = 0;
-		int numExpected = 0;
-		int numReported = 0;
-		boolean passed = true;
-		List mmdList = new ArrayList(mmdListOrig); // Need to modify the list, but do not want to modify the original, so create a copy.
-		try {
-			// First, check that the number of messages match.
-			if(messages == null) {
-				passed = false;
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.INFO)) {
-					logger.write(Level.INFO, "No messages were reported."); //$NON-NLS-1$
-				}
-				return passed;
-			}
-			
-			numExpected = mmdList.size();
-			numReported = messages.length;
-			
-			Collections.sort(mmdList, MessageUtility.getMessageComparator(buffer, isVerbose()));
-
-			for(int i=0; i<messages.length; i++) {
-				IMarker marker = messages[i];
-				MessageMetaData mmd = getMatchingMetaData(buffer, mmdList, marker);
-	
-				if(mmd == null) {
-					_extra.add(marker);
-					continue;
-				}
-				else {
-					// Every time a mmd is matched to a marker, remove the mmd
-					// from the list so that mmds without a marker can be flagged.
-					mmdList.remove(mmd);
-					if(isVerbose()) {
-						buffer.write("matched " + MessageUtility.toString(marker) + " to " + MessageUtility.toString(mmd)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					numMatched++;
-				}
-				
-				// Check severity
-				try {
-					// Fail a test case based on severity mismatch because EJB deploy
-					// relies on the severity to determine whether or not deployment
-					// can continue?
-					verifySeverity(buffer, testName, subTaskName, mmd, marker);
-				}
-				catch(CoreException e) {
-					passed = false;
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if(logger.isLoggingLevel(Level.SEVERE)) {
-						logger.write(Level.SEVERE, e);
-					}
-					buffer.write("ERROR[Testcase::" + testName + "]. CoreException caught while verifying severity"); //$NON-NLS-1$ //$NON-NLS-2$
-					continue;
-				}
-				
-				// Check resource
-				try {
-					// Don't fail a test case based on resource, because the "location" column will
-					// uniquely identify the location of the message, anyway. Should still let the 
-					// user know, though.
-					verifyResource(buffer, testName, subTaskName, mmd, marker);
-				}
-				catch(CoreException e) {
-					passed = false;
-					buffer.write("ERROR[Testcase::" + testName + "]. CoreException caught while verifying resource"); //$NON-NLS-1$ //$NON-NLS-2$
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if(logger.isLoggingLevel(Level.SEVERE)) {
-						logger.write(Level.SEVERE, e);
-					}
-					continue;
-				}
-				
-				// Check location
-				try {
-					// Don't fail a test case based on location, because the line number calculation
-					// is different in UI & batch, and the test cases are based on UI test results.
-					// Should still alert the user, though.
-					verifyLocation(buffer, testName, subTaskName,  mmd, marker);
-				}
-				catch(CoreException e) {
-					passed = false;
-					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-					if(logger.isLoggingLevel(Level.SEVERE)) {
-						logger.write(Level.SEVERE, e);
-					}
-					buffer.write("ERROR[Testcase::" + testName + "]. CoreException caught while verifying line number"); //$NON-NLS-1$ //$NON-NLS-2$
-					continue;
-				}
-			}
-			
-			if(mmdList.size() != 0) {
-				_missing.addAll(mmdList);
-			}
-		}
-		catch(Throwable exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-			passed = false;
-		}
-		finally {
-			if(!((_missing.size() == 0) && (_extra.size() == 0))) {
-				passed = false;
-			}
-			
-			if(passed) {
-				buffer.write("PASS[Testcase::" + testName + "]"); //$NON-NLS-1$ //$NON-NLS-2$
-				buffer.addExecutionStatus(testName, subTaskName, true); // If fail, will be reported in the extra & missing below.
-			}
-			else {
-				buffer.write("FAIL[Testcase::" + testName + "]"); //$NON-NLS-1$ //$NON-NLS-2$
-
-				// No point in listing the mmdList because it's empty by the time the finally block is reached
-				if(isVerbose()) {
-					buffer.write("List of markers reported:"); //$NON-NLS-1$
-					debug(buffer, messages);
-				}
-			}
-			
-			// Report the missing markers after the MMD list is sorted
-			Collections.sort(_missing, MessageUtility.getMessageComparator(buffer, isVerbose()));
-			Iterator iterator = _missing.iterator();
-			while(iterator.hasNext()) {
-				MessageMetaData mmd = (MessageMetaData)iterator.next();
-				buffer.addExecutionStatus(testName, subTaskName, ITestStatus.FAIL, buffer, "ERROR[missing message]: " + MessageUtility.toString(mmd)); //$NON-NLS-1$
-			}
-			
-			// Report the extra markers after they're sorted.
-			Collections.sort(_extra, MessageUtility.getMessageComparator(buffer, isVerbose()));
-			iterator = _extra.iterator();
-			while(iterator.hasNext()) {
-				IMarker marker = (IMarker)iterator.next();
-				buffer.addExecutionStatus(testName, subTaskName, ITestStatus.FAIL, buffer, "ERROR[extra message]: " + MessageUtility.toString(marker) + ", Text is: \"" + MessageUtility.getMessage(marker) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-	
-			if(numExpected != numReported) {
-				buffer.write("Wrong number of messages reported. Expected " + numExpected + " and got " + numReported); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			buffer.write("Number of extra messages: " + _extra.size()); //$NON-NLS-1$
-			buffer.write("Number of missing messages: " + _missing.size()); //$NON-NLS-1$
-			buffer.write("Number of matched messages: " + numMatched); //$NON-NLS-1$
-			buffer.write("End of test case: " + testName); //$NON-NLS-1$
-			_extra.clear(); // Clear the list of extra markers (stored in a list to make reading easier).
-			_missing.clear(); // Clear the list of missing markers (stored in a list to make reading easier).
-		}
-		return passed;
-	}
-	
-	private int verifySeverity(IBuffer buffer, String testName, String subTaskName, MessageMetaData mmd, IMarker marker) throws CoreException {
-		// If prefixSeverity is null, marker has no prefix, therefore it has no severity
-		Integer prefixSeverity = MessageUtility.getSeverity(marker);
-		if(prefixSeverity != null) {
-			Integer severity = (Integer)marker.getAttribute(IMarker.SEVERITY); // IMarker.SEVERITY_ERROR, IMarker.SEVERITY_WARNING, IMarker.SEVERITY_INFO
-			boolean severityEqual = true;
-			if((severity == null) && (prefixSeverity == null)) {
-				severityEqual = true;
-			}
-			else if(severity == null) {
-				severityEqual = false;
-			}
-			else if(prefixSeverity == null) {
-				severityEqual = false;
-			}
-			else {
-				severityEqual = severity.equals(prefixSeverity);
-			}
-			
-			if(!severityEqual) {
-				buffer.addExecutionStatus(testName, subTaskName, ITestStatus.WARN, buffer, "WARNING[mismatching severity]: expected " + getSeverityChar(prefixSeverity) + ", got " + getSeverityChar(severity) + " on marker " + MessageUtility.toString(marker)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				return ITestStatus.WARN;
-			}
-		}
-			
-		return ITestStatus.PASS;
-	}
-	
-	private int verifyResource(IBuffer buffer, String testName, String subTaskName, MessageMetaData mmd, IMarker marker) throws CoreException {
-		String resource = MessageUtility.getResource(marker);
-		if(!resource.equals(mmd.getResource())) {
-			buffer.addExecutionStatus(testName, subTaskName, ITestStatus.WARN, buffer, "INFO[wrong resource]: expected " + mmd.getResource() + ", got " + resource + " on marker " + MessageUtility.toString(marker)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			return ITestStatus.WARN;
-		}
-		return ITestStatus.PASS;
-	}
-	
-	private int verifyLocation(IBuffer buffer, String testName, String subTaskName, MessageMetaData mmd, IMarker marker) throws CoreException {
-		// Either compare two line numbers or two text locations, but not a line number to a text location.
-		if(mmd.isSetLineNumber()) {
-			Integer lineNumber = MessageUtility.getLineNumber(marker);
-			if(lineNumber == null) {
-				// Marker has a text location, not a line number.
-				return ITestStatus.PASS;
-			}
-			
-			if(lineNumber.intValue() != mmd.getLineNumber()) {
-				buffer.addExecutionStatus(testName, subTaskName, ITestStatus.WARN, buffer, "INFO[wrong location]: expected " + mmd.getLineNumber() + ", got " + lineNumber + " on marker " + MessageUtility.toString(marker)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				return ITestStatus.WARN;
-			}
-		}
-		else if(mmd.isSetLocation()) {
-			String location = MessageUtility.getLocation(marker);
-			if(location == null) {
-				// marker has a line number, not a text location
-				return ITestStatus.PASS;
-			}
-			
-			if(!(mmd.getLocation().equals(location))) {
-				buffer.addExecutionStatus(testName, subTaskName, ITestStatus.WARN, buffer, "INFO[wrong location]: expected " + mmd.getLocation() + ", got " + location + " on marker " + MessageUtility.toString(marker)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				return ITestStatus.WARN;
-			}
-		}
-		
-		return ITestStatus.PASS;
-	}
-	
-	
-	private MessageMetaData getMatchingMetaData(IBuffer buffer, List mmdList, IMarker marker) {
-		int result = Collections.binarySearch(mmdList, marker, MessageUtility.getMessageComparator(buffer, isVerbose()));
-		if(result < 0) {
-			return null;
-		}
-		return (MessageMetaData)mmdList.get(result);
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BVTValidationUtility.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BVTValidationUtility.java
deleted file mode 100644
index beff0ed..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BVTValidationUtility.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.jst.validation.test.internal.util;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jst.validation.test.BVTValidationException;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.internal.registry.BVTValidationRegistryReader;
-import org.eclipse.jst.validation.test.internal.registry.ITestcaseMetaData;
-import org.eclipse.jst.validation.test.internal.registry.OperationTestcase;
-import org.eclipse.jst.validation.test.internal.registry.TestcaseUtility;
-import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
-import org.eclipse.wst.validation.internal.ConfigurationConstants;
-import org.eclipse.wst.validation.internal.ValidationRegistryReader;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-
-/**
- * @version 	1.0
- * @author
- */
-public final class BVTValidationUtility {
-	private BVTValidationUtility() {
-	}
-	
-	public static ValidatorMetaData getValidatorMetaData(IMarker marker) {
-		String validatorClassName = null;
-		try {
-			validatorClassName = marker.getAttribute(ConfigurationConstants.VALIDATION_MARKER_OWNER).toString();
-			ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validatorClassName);
-			return vmd;
-		}
-		catch (CoreException exc) {
-		}
-		return null;		
-	}
-	
-	private static IMarker[] getValidationTasks(IResource resource) {
-		try {
-			IMarker[] allMarkers = resource.findMarkers(ConfigurationConstants.VALIDATION_MARKER, false, IResource.DEPTH_INFINITE); // false means only consider PROBLEM_MARKER, not variants of PROBLEM_MARKER. Since addTask only adds PROBLEM_MARKER, we don't need to consider its subtypes.
-			return allMarkers;
-		}
-		catch (CoreException exc) {
-			return null;
-		}
-	}
-	
-	public static void removeAllValidationMarkers() {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IWorkspaceRoot root = workspace.getRoot();
-		IMarker[] markers = getValidationTasks(root);
-		if(markers != null) {
-			try {
-				workspace.deleteMarkers(markers);
-			}
-			catch(CoreException e) {
-			}
-		}
-	}
-
-	public static String getProjectName(File file) {
-		String fileName = file.getName();
-		int extIndex = fileName.indexOf('.');
-		if(extIndex > 0) {
-			return fileName.substring(0, extIndex);
-		}
-		else {
-			return fileName;
-		}
-	}
-
-	public static String getQualifiedLogName(String logFileName) {
-		String dir = BVTValidationPlugin.getPlugin().getStateLocation().toOSString();
-		File dirWithFile = new File(dir, logFileName);
-		return dirWithFile.toString();
-	}
-	
-	public static IProject[] getProjects(ITestcaseMetaData[] tmds) {
-		List sortedList = new ArrayList();
-		for(int i=0; i<tmds.length; i++) {
-			IProject p = TestcaseUtility.findProject(tmds[i]);
-			if((p != null) && (p.exists()) && (p.isOpen()) && !sortedList.contains(p)) {
-				sortedList.add(p);
-			}
-		}
-		Collections.sort(sortedList, new Comparator() {
-			public int compare(Object a, Object b){
-				if((a == null) && (b == null)) {
-					return 0;
-				}
-				else if(a == null) {
-					return 1;
-				}
-				else if(b == null) {
-					return -1;
-				}
-			
-				if((a instanceof IProject) && (b instanceof IProject)) {
-					return ((IProject)a).getName().compareTo(((IProject)b).getName());
-				}
-				
-				return -1; // should never reach here...both Objects should always be IProjects
-			}
-		});
-		IProject[] result = new IProject[sortedList.size()];
-		sortedList.toArray(result);
-		return result;
-	}
-
-	public static ITestcaseMetaData[] getTests(ITestcaseMetaData[] tmds, IProject p) {
-		ITestcaseMetaData[] temp = new ITestcaseMetaData[tmds.length];
-		int count = 0;
-		for(int i=0; i<tmds.length; i++) {
-			ITestcaseMetaData tmd = tmds[i];
-			if(tmd.getProjectName().equals(p.getName())) {
-				temp[count++] = tmd;
-			}
-		}
-		
-		ITestcaseMetaData[] result = new ITestcaseMetaData[count];
-		System.arraycopy(temp, 0, result, 0, count);
-		return result;
-	}
-
-	/**
-	 * Return the total number of validator tests.
-	 */	
-	public static int numValidatorTests(IProgressMonitor monitor, IProject[] projects) throws BVTValidationException {	
-		BVTValidationRegistryReader reader = BVTValidationRegistryReader.getReader();
-		
-		int totalTests = 0;
-		for(int i=0; i<projects.length; i++) {
-			IProject project = projects[i];
-			ValidatorTestcase[] tests = reader.getValidatorTests(monitor, project);
-			if((tests == null) || (tests.length == 0)) {
-				continue;
-			}
-			
-			totalTests += tests.length;
-		}
-		
-		return totalTests;
-	}
-	
-	/**
-	 * Return all public (visible) test cases for a particular project.
-	 */
-	public static ValidatorTestcase[] getValidatorTests(IProgressMonitor monitor, IProject[] projects) {
-		Set testSet = new HashSet();		
-		for(int i=0; i<projects.length; i++) {
-			IProject project = projects[i];
-			ValidatorTestcase[] tests = getValidatorTests(monitor, project);
-			if(tests.length == 0) {
-				continue;
-			}
-			
-			for(int j=0; j<tests.length; j++) {
-				ValidatorTestcase vt = tests[j];
-				testSet.add(vt);
-			}
-		}
-		
-		ValidatorTestcase[] result = new ValidatorTestcase[testSet.size()];
-		testSet.toArray(result);
-		return result;
-	}
-
-	/**
-	 * Return all visible validator test cases for a project.
-	 */
-	public static ValidatorTestcase[] getValidatorTests(IProgressMonitor monitor, IProject project) {
-		BVTValidationRegistryReader reader = BVTValidationRegistryReader.getReader();
-
-		ValidatorTestcase[] tests = reader.getValidatorTests(monitor, project);
-		if(tests == null) {
-			return new ValidatorTestcase[0];
-		}
-		
-		return tests;
-	}
-
-	/**
-	 * Return all of the tests.
-	 */
-	public static OperationTestcase[] getOperationTests(IProgressMonitor monitor) {
-		return BVTValidationRegistryReader.getReader().getOperationTests(monitor, (String)null);
-	}
-	
-	public static OperationTestcase[] getOperationTests(IProgressMonitor monitor, IProject project) {
-		BVTValidationRegistryReader reader = BVTValidationRegistryReader.getReader();
-
-		OperationTestcase[] tests = reader.getOperationTests(monitor, project);
-		if(tests == null) {
-			return new OperationTestcase[0];
-		}
-		
-		return tests;
-	}
-
-	/**
-	 * Return all of the tests.
-	 */
-	public static ValidatorTestcase[] getValidatorTests(IProgressMonitor monitor) {
-		return BVTValidationRegistryReader.getReader().getValidatorTests(monitor, (String)null);
-	}
-	
-	/**
-	 * Return all of the tests, visible and invisible, owned by the validator metadata.
-	 */
-	public static ValidatorTestcase[] getValidatorTests(IProgressMonitor monitor, ValidatorMetaData vmd) {
-		ValidatorTestcase[] allTests = BVTValidationRegistryReader.getReader().getValidatorTests(monitor, (String)null);
-		ValidatorTestcase[] temp = new ValidatorTestcase[allTests.length];
-		int count = 0;
-		for(int i=0; i<allTests.length; i++) {
-			ValidatorTestcase testvmd = allTests[i];
-			if(vmd.equals(testvmd.getValidatorMetaData())) {
-				temp[count++] = testvmd;
-			}
-		}
-		ValidatorTestcase[] result = new ValidatorTestcase[count];
-		System.arraycopy(temp, 0, result, 0, count);
-		return result;
-	}
-	
-	public static ValidatorMetaData[] getValidatorsThatHaveTests(IProgressMonitor monitor) {
-		ValidatorTestcase[] tests = getValidatorTests(monitor);
-		Set temp = new HashSet();
-		for(int i=0; i<tests.length; i++) {
-			ValidatorTestcase vt = tests[i];
-			temp.add(vt.getValidatorMetaData());
-		}
-		
-		ValidatorMetaData[] vmds = new ValidatorMetaData[temp.size()];
-		temp.toArray(vmds);
-		return vmds;
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BuildInfo.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BuildInfo.java
deleted file mode 100644
index 1b612aa..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BuildInfo.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.eclipse.jst.validation.test.internal.util;
-public class BuildInfo {
-  public static final String copyright = "Licensed Materials -- Property of IBM\n(c) Copyright International Business Machines Corporation, 2001,2003\nUS Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.";
-  public static final String fgBuildLevel = "20031112_1915-WB212-AD-V511D-W5";
-  public static String level() { return fgBuildLevel; }
-  public static String getWSABuildLevel() { return fgBuildLevel; }
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/RunTestsOperation.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/RunTestsOperation.java
deleted file mode 100644
index 8b2b032..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/RunTestsOperation.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.eclipse.jst.validation.test.internal.util;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.validation.test.internal.registry.ITestcaseMetaData;
-import org.eclipse.jst.validation.test.setup.IBuffer;
-
-
-/**
- * Run the BVT of the validator: a full test, an incremental test,
- * and an asynchronous test, if applicable.
- * 
- * This class must NOT be wrapped in an IWorkspaceRunnable or 
- * there will be deadlock during the asynchronous validation test!
- * (Read the comment above VThreadManager::isDone() for details.)
- */
-public class RunTestsOperation {
-	private static RunTestsOperation _inst = null;
-	
-	private RunTestsOperation() {
-	}
-	
-	public static RunTestsOperation singleton() {
-		if(_inst == null) {
-			_inst = new RunTestsOperation();
-		}
-		return _inst;
-	}
-	
-	/**
-	 * @see org.eclipse.core.resources.IWorkspaceRunnable#run(IProgressMonitor)
-	 */
-	public void run(IBuffer buffer, ITestcaseMetaData[] allTmds) {
-		IProject[] projects = BVTValidationUtility.getProjects(allTmds);
-		for(int i=0; i<projects.length; i++) {
-			IProject project = projects[i];
-			ITestcaseMetaData[] tmds = BVTValidationUtility.getTests(allTmds, project);
-			
-			for(int j=0; j<tmds.length; j++) {
-				ITestcaseMetaData tmd = tmds[j];
-				tmd.run(buffer, project);
-			}
-		}
-	}
-	
-
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/AImportOperation.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/AImportOperation.java
deleted file mode 100644
index 3d51322..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/AImportOperation.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.eclipse.jst.validation.test.setup;
-
-import java.io.File;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.internal.util.BVTValidationUtility;
-import org.eclipse.wst.validation.internal.operations.ValidatorManager;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-/**
- * Abstract class that provides some of the functionality required to create
- * a project and populate it with the contents of a file.
- */
-public abstract class AImportOperation implements IImportOperation {
-	private void preRun(IProgressMonitor monitor) {
-		ValidatorManager.getManager().suspendAllValidation(true);
-	}
-	
-	private void postRun(IProgressMonitor monitor) {
-		ValidatorManager.getManager().suspendAllValidation(false);
-	}
-	
-	protected void deleteOldProject(IProgressMonitor monitor, String projectName) {
-		// delete any existing project of this name
-		IProject existingProject = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
-		if (existingProject.exists()) {
-			try {
-				existingProject.delete(true, null); // null=no progress mon (don't scare users)
-			}
-			catch (CoreException exc) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, exc);
-				}
-			}
-		}
-	}
-	
-	public boolean run(IProgressMonitor monitor, File file) {
-		boolean imported = true;
-		int executionMap = 0x0;
-		IProject project = null;
-		Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-		try {
-			if(monitor == null) {
-				monitor = new NullProgressMonitor();
-			}
-			
-			preRun(monitor);
-			
-			try {
-				String projectName = BVTValidationUtility.getProjectName(file);
-				deleteOldProject(monitor, projectName);
-				project = createNewProject(monitor, projectName, file);
-				
-				if((project == null) || (!project.isAccessible())) {
-					executionMap |= 0x1;
-					imported = false;
-					String message = "Cannot import file because IProject is null or not accessible."; //$NON-NLS-1$
-					monitor.subTask(message);
-					if(logger.isLoggingLevel(Level.SEVERE)) {
-						LogEntry entry = ValidationPlugin.getLogEntry();
-						entry.setExecutionMap(executionMap);
-						entry.setText(message);
-						logger.write(Level.SEVERE, entry);
-					}
-
-				}
-				else {				
-					imported = importFile(monitor, project, file);
-					executionMap |= 0x2;
-				}
-			}
-			catch (Throwable exc) {
-				executionMap |= 0x4;
-				imported = false;
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			finally {
-				postRun(monitor);
-			}
-		}
-		finally {
-			if(!imported) {
-				String projectName = (project == null) ? file.getName() : project.getName();
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setExecutionMap(executionMap);
-				entry.setText("AImportOperation for " + projectName + " was unsuccessful."); //$NON-NLS-1$ //$NON-NLS-2$
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-		return imported;
-	}
-	
-	protected abstract IProject createNewProject(IProgressMonitor monitor, String projectName, File inputFile);
-	
-	/**
-	 * Return true if the file was imported successfully.
-	 */
-	protected abstract boolean importFile(IProgressMonitor monitor, IProject project, File file);
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/BuildInfo.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/BuildInfo.java
deleted file mode 100644
index 745dcbe..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/BuildInfo.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.eclipse.jst.validation.test.setup;
-public class BuildInfo {
-  public static final String copyright = "Licensed Materials -- Property of IBM\n(c) Copyright International Business Machines Corporation, 2001,2003\nUS Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.";
-  public static final String fgBuildLevel = "20031112_1915-WB212-AD-V511D-W5";
-  public static String level() { return fgBuildLevel; }
-  public static String getWSABuildLevel() { return fgBuildLevel; }
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/CheckForUntestedPropertiesOperation.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/CheckForUntestedPropertiesOperation.java
deleted file mode 100644
index 802eb77..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/CheckForUntestedPropertiesOperation.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package org.eclipse.jst.validation.test.setup;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.IPluginRegistry;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.sample.parser.PropertyLine;
-import org.eclipse.jst.validation.sample.workbenchimpl.PluginPropertyFile;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.ValidationTypeEnum;
-import org.eclipse.jst.validation.test.internal.registry.MessageUtility;
-import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
-import org.eclipse.jst.validation.test.internal.util.BVTValidationUtility;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-/**
- * Generate a FVT test case for every EJB Validator validation marker on each
- * selected project.
- */
-public final class CheckForUntestedPropertiesOperation implements IWorkspaceRunnable {
-	private ValidatorMetaData _vmd = null;
-	private IBuffer _buffer = null;
-	private String _resourceBundleName = null;
-	public CheckForUntestedPropertiesOperation(IBuffer buffer, ValidatorMetaData vmd, String resourceBundleName) {
-		setValidatorMetaData(vmd);
-		setBuffer(buffer);
-		setResourceBundleName(resourceBundleName);
-	}
-	public IBuffer getBuffer() {
-		return _buffer;
-	}
-	void setBuffer(IBuffer b) {
-		_buffer = b;
-	}
-	public ValidatorMetaData getValidatorMetaData() {
-		return _vmd;
-	}
-	private String getPluginId(ValidatorMetaData vmd) {
-		try {
-			// TODO Remove this hack once a getter has been added to ValidatorMetaData for its pluginId.
-			if (vmd != null) {
-				ClassLoader cl = vmd.getValidator().getClass().getClassLoader();
-				IPluginRegistry registry = Platform.getPluginRegistry();
-				IPluginDescriptor[] descriptors = registry.getPluginDescriptors();
-				for (int i = 0; i < descriptors.length; i++) {
-					IPluginDescriptor desc = descriptors[i];
-					if (desc.getPluginClassLoader().equals(cl)) {
-						return desc.getUniqueIdentifier();
-					}
-				}
-			}
-		} catch (InstantiationException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-		}
-		return null;
-	}
-	void setValidatorMetaData(ValidatorMetaData vmd) {
-		_vmd = vmd;
-	}
-	public String getResourceBundleName() {
-		return _resourceBundleName;
-	}
-	void setResourceBundleName(String name) {
-		_resourceBundleName = name;
-	}
-	/**
-	 * @see org.eclipse.core.resources.IWorkspaceRunnable#run(IProgressMonitor)
-	 */
-	public void run(IProgressMonitor monitor) throws CoreException {
-		List pLines = null;
-		List untestedLines = new ArrayList();
-		List testedLines = new ArrayList();
-		Comparator comparator = MessageUtility.getMessagePrefixComparator();
-		// Assume that the BVT tests were run on the projects before this menu
-		// action was clicked.
-		// Load and parse the .properties file to know what message ids to look
-		// for.
-		String propFileName = getResourceBundleName();
-		ValidatorMetaData vmd = getValidatorMetaData();
-		monitor.subTask("Attempting to load file: " + propFileName); //$NON-NLS-1$
-		String pluginId = getPluginId(vmd);
-		if (pluginId == null) {
-			monitor.subTask("Cannot load plugin id for validator " + vmd.getValidatorDisplayName()); //$NON-NLS-1$
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, "Cannot load plugin id for validator " + vmd.getValidatorDisplayName()); //$NON-NLS-1$
-			}
-			return;
-		}
-		PluginPropertyFile pFile = new PluginPropertyFile(pluginId, propFileName);
-		monitor.worked(1);
-		monitor.subTask("Parsing."); //$NON-NLS-1$
-		pLines = pFile.getPropertyLines();
-		Collections.sort(pLines, comparator); // false = no verbose output
-		monitor.worked(1);
-		monitor.subTask("Loading test messages."); //$NON-NLS-1$
-		ValidatorTestcase[] tmds = BVTValidationUtility.getValidatorTests(monitor, vmd);
-		for (int k = 0; k < tmds.length; k++) {
-			ValidatorTestcase tmd = tmds[k];
-			List mssg = tmd.getMessages(ValidationTypeEnum.RUN_VALIDATION);
-			testedLines.addAll(mssg);
-		}
-		Collections.sort(testedLines, comparator);
-		monitor.subTask("Comparing."); //$NON-NLS-1$
-		Iterator iterator = pLines.iterator();
-		while (iterator.hasNext()) {
-			if (monitor.isCanceled()) {
-				return;
-			}
-			PropertyLine line = (PropertyLine)iterator.next();
-			int index = Collections.binarySearch(testedLines, line, comparator);
-			if (index < 0) {
-				// not found.
-				untestedLines.add(line);
-			}
-		}
-		monitor.worked(1);
-		// now see if the list of untested lines has entries.
-		Collections.sort(untestedLines, comparator);
-		Iterator untestediterator = untestedLines.iterator();
-		if (untestediterator.hasNext()) {
-			getBuffer().write("List of messages which are not tested (" + untestedLines.size() + " of " + pLines.size() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		} else {
-			getBuffer().write("All messages are tested."); //$NON-NLS-1$
-		}
-		while (untestediterator.hasNext()) {
-			if (monitor.isCanceled()) {
-				return;
-			}
-			PropertyLine line = (PropertyLine)untestediterator.next();
-			getBuffer().write(line.toString());
-		}
-		untestedLines.clear(); // clear the list for the next project
-		testedLines.clear();
-		monitor.worked(1);
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/IBuffer.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/IBuffer.java
deleted file mode 100644
index 2d0bc81..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/IBuffer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.eclipse.jst.validation.test.setup;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * If information needs to be reported to the user, but that information is long,
- * and the user needs to see it all at the same time (e.g., test case results),
- * then the information is reported to implementations of this class. 
- * Implementations can choose to report the information immediately 
- * (e.g., to System.out), or can append each message, and report the message
- * only once everything is complete. 
- */
-public interface IBuffer extends ITestStatus {
-	/**
-	 * Return the progress monitor that is used for reporting progress
-	 * status as the long-running process executes.
-	 */
-	public IProgressMonitor getProgressMonitor();
-	
-	/**
-	 * Display the message to the user; the buffer implementation may 
-	 * display the message immediately, or may display the message only
-	 * when report() is called.
-	 */
-	public void write(String message);
-	
-	/**
-	 * Between one task and the next, usually between test cases, add a delineating
-	 * mark to show the beginning and end of each task clearly. The parameter 
-	 * passed in, taskName, is the name of the task that is ending.
-	 */
-	public void delineate(String taskName);
-		
-	/**
-	 * If information was not reported immediately, calling this method
-	 * forces the buffer to be reported to the user. The contents of the
-	 * buffer are not cleared; a subseqent call to this method will 
-	 * repeat what has been reported before. Any calls to elapsedTime
-	 * will be reported.
-	 */
-	public void report();
-	
-	/**
-	 * Clear any stored messages from the buffer, but not any elapsedTime 
-	 * numbers from the store.
-	 */
-	public void clear();
-	
-	/**
-	 * Return the fully-qualified name of the log file, or null if none.
-	 */
-	public String getLogFileName();
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/IImportOperation.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/IImportOperation.java
deleted file mode 100644
index 31d0d05..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/IImportOperation.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.eclipse.jst.validation.test.setup;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * All validation FVT tests must provide an IImportOperation implementation
- * to import the input file.
- */
-public interface IImportOperation {
-	/**
-	 * Runs this operation without forcing a UI dependency. Return true if the file
-	 * was found and imported successfully.
-	 *
-	 * @param monitor the progress monitor to use to display progress and receive
-	 *   requests for cancelation
-	 * @param inputFile the file which needs to be imported into the workbench
-	 * @exception InvocationTargetException if the run method must propagate a checked exception,
-	 * 	it should wrap it inside an <code>InvocationTargetException</code>; runtime exceptions are automatically
-	 *  wrapped in an <code>InvocationTargetException</code> by the calling context
-	 * @exception InterruptedException if the operation detects a request to cancel, 
-	 *  using <code>IProgressMonitor.isCanceled()</code>, it should exit by throwing 
-	 *  <code>InterruptedException</code>
-	 *
-	 * @see IRunnableWithProgress
-	 */
-	public boolean run(IProgressMonitor monitor, File inputFile) throws InvocationTargetException, InterruptedException;
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/ITestStatus.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/ITestStatus.java
deleted file mode 100644
index ba2b936..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/ITestStatus.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.jst.validation.test.setup;
-
-/**
- * Instances of this interface track the execution of a test case,
- * and are used to report a summary of the execution of all of the
- * test cases at the end of a set of test runs.
- */
-public interface ITestStatus {
-	public final int PASS = 0;
-	public final int WARN = 1;
-	public final int FAIL = 2;
-	
-	/**
-	 * To track how long a task takes, call this method with a unique name
-	 * of the task. If the task already exists, the elapsedTime is added
-	 * to the existing time.
-	 */
-	public void addElapsedTime(String taskName, long elapsedTime);
-	
-	/**
-	 * If pass is true, PASS is used; if pass is false, FAIL is used.
-	 */
-	public void addExecutionStatus(String testPassName, boolean pass);
-	
-	/**
-	 * If pass is true, PASS is used; if pass is false, FAIL is used.
-	 * While still considered part of test case "testPassName", this 
-	 * splits this part of the test case into a section named "subTaskName".
-	 */
-	public void addExecutionStatus(String testPassName, String subTaskName, boolean pass);
-	
-	/**
-	 * As each test is executed, this method is used to track how many of that
-	 * type of test pass or fail. passOrFail can be one of three values: PASS, WARN, or FAIL.
-	 * If value is PASS, then the test case passes, and no message needs to be displayed to the user.
-	 * If value is WARN, then the test case passes, and a warning message must be displayed to the user.
-	 * If value is FAIL, then the test case fails, and a failure message must be displayed to the user.
-	 */
-	public void addExecutionStatus(String testcaseName, String subTaskName, int passOrFail, IBuffer buffer, String message);
-	
-	/**
-	 * Return true if all of the test cases run so far have passed; otherwise
-	 * return false. If no test cases have run, return true.
-	 */
-	public boolean isSuccessful();
-	
-	/**
-	 * Return true if a particular test case passed.
-	 */
-	public boolean isSuccessful(String testName);
-	
-	/**
-	 * Reset all variables to the default value to prepare this test status for reuse.
-	 */
-	public void clear();
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/JARImportOperation.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/JARImportOperation.java
deleted file mode 100644
index 8c08400..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/JARImportOperation.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package org.eclipse.jst.validation.test.setup;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Enumeration;
-import java.util.logging.Level;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.wst.validation.internal.operations.ValidatorManager;
-
-/**
- * Create a Java project by importing a JAR file.
- */
-public class JARImportOperation extends AImportOperation {
-	// Most of the code in this class was stolen from the JDT. See org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathsBlock.
-	public static void createProject(IProject project, IPath locationPath, IProgressMonitor monitor) throws CoreException {
-		if (monitor == null) {
-			monitor= new NullProgressMonitor();
-		}				
-
-		// create the project
-		try {
-			if (!project.exists()) {
-				IProjectDescription desc= project.getWorkspace().newProjectDescription(project.getName());
-				if (Platform.getLocation().equals(locationPath)) {
-					locationPath= null;
-				}
-				desc.setLocation(locationPath);
-				project.create(desc, monitor);
-				monitor= null;
-			}
-			if (!project.isOpen()) {
-				project.open(monitor);
-				monitor= null;
-			}
-		} finally {
-			if (monitor != null) {
-				monitor.done();
-			}
-		}
-	}
-
-	public static void addJavaNature(IProject project, IProgressMonitor monitor) throws CoreException {
-		if (!project.hasNature(JavaCore.NATURE_ID)) {
-			IProjectDescription description = project.getDescription();
-			String[] prevNatures= description.getNatureIds();
-			String[] newNatures= new String[prevNatures.length + 1];
-			System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length);
-			newNatures[prevNatures.length]= JavaCore.NATURE_ID;
-			description.setNatureIds(newNatures);
-			project.setDescription(description, monitor);
-		} else {
-			monitor.worked(1);
-		}
-	}
-	
-	private void configureProject(IProgressMonitor monitor, IProject project) {
-		try {
-			// Set the classpath to the default.
-			IJavaProject jp = JavaCore.create(project);
-			jp.setRawClasspath(null, new SubProgressMonitor(monitor, 7));		
-
-			// Now add rt.jar to it
-			IClasspathEntry[] existingClasspath = jp.getRawClasspath();
-			IClasspathEntry[] classpath= new IClasspathEntry[existingClasspath.length + 1];
-			System.arraycopy(existingClasspath, 0, classpath, 0, existingClasspath.length);
-			IClasspathEntry rtJar = JavaCore.newVariableEntry(new Path("JRE_LIB"), new Path("JRE_SRC"), null); //$NON-NLS-1$ //$NON-NLS-2$
-			classpath[existingClasspath.length] = rtJar;
-			jp.setRawClasspath(classpath, new SubProgressMonitor(monitor, 7));
-			
-			// Enable this java project with the Validation Builder so that automatic validation 
-			// can run on it.
-			ValidatorManager.addProjectBuildValidationSupport(project);
-		}
-		catch(JavaModelException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.jst.validation.test.setup.AImportOperation#createNewProject(IProgressMonitor, String, File)
-	 */
-	protected IProject createNewProject(IProgressMonitor monitor, String projectName, File inputFile) {
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
-		try {
-			createProject(project, null, monitor);
-			addJavaNature(project, monitor);
-			configureProject(monitor, project);
-		}
-		catch(CoreException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-		}
-		return project;
-	}
-	
-	protected void createFolder(IProgressMonitor monitor, IProject project, IPath pathname) throws CoreException {
-		IFolder folder = project.getFolder(pathname);
-		IContainer container = folder.getParent();
-		if(!container.exists()) {
-			createFolder(monitor, project, container.getProjectRelativePath());
-		}
-		if(!folder.exists()) {
-			// Don't overwrite existing files.
-			folder.create(true, true, monitor); // true=force, true=local
-		}
-	}
-	
-	protected void createFile(IProgressMonitor monitor, IProject project, IPath pathname, InputStream stream) throws CoreException {
-		IFile nfile = project.getFile(pathname);
-		IContainer container = nfile.getParent();
-		if(!container.exists()) {
-			createFolder(monitor, project, container.getProjectRelativePath());
-		}
-		if(!nfile.exists()) {
-			// Don't overwrite existing files.
-			nfile.create(stream, true, monitor);
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.jst.validation.test.setup.AImportOperation#importFile(IProgressMonitor, IProject, File)
-	 */
-	protected boolean importFile(IProgressMonitor monitor, IProject project, File file) {
-		// Import the file 
-		try {
-			ZipFile zipFile = new ZipFile(file);
-			Enumeration zipEntries = zipFile.entries();
-			while(zipEntries.hasMoreElements()) {
-				ZipEntry zipEntry = (ZipEntry)zipEntries.nextElement();
-				IPath pathname = new Path(zipEntry.getName());
-				if(zipEntry.isDirectory()) {
-					createFolder(monitor, project, pathname);
-				}
-				else {
-					createFile(monitor, project, pathname, zipFile.getInputStream(zipEntry));
-				}
-			}
-			return true;
-		}
-		catch(IOException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-			return false;
-		}
-		catch(CoreException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-			return false;
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/TestCaseGeneratorOperation.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/TestCaseGeneratorOperation.java
deleted file mode 100644
index e64e34f..0000000
--- a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/TestCaseGeneratorOperation.java
+++ /dev/null
@@ -1,139 +0,0 @@
-package org.eclipse.jst.validation.test.setup;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.internal.registry.MessageUtility;
-import org.eclipse.wst.validation.internal.TaskListUtility;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * Generate an FVT test case, for a selected IProject or IProjects, to
- * be pasted into plugin.xml.
- */
-public final class TestCaseGeneratorOperation implements IWorkspaceRunnable {
-	private final static String _TESTCASE_TEMPLATE_ = "\t\t\t<test \n\t\t\t\tproject=\"{0}\"\n\t\t\t\tinput=\"\"\n\t\t\t\tvalidator=\"{1}\">\n{2}\t\t\t</test>\n"; //$NON-NLS-1$
-	private final static String _TESTCASE_MESSAGE_TEMPLATE_ = "\t\t\t\t<message prefix=\"{0}\" resource=\"{1}\" location=\"{2}\" text=\"{3}\"/>\n"; //$NON-NLS-1$
-	private Map _vmdBuffer = null; // map where the ValidatorMetaData is the key and the value is a StringBuffer
-	private IProject[] _projects = null;
-	private IBuffer _buffer = null;
-	
-	public TestCaseGeneratorOperation(IProject[] projects, IBuffer buffer) {
-		setProjects(projects);
-		setBuffer(buffer);
-		_vmdBuffer = new HashMap();
-	}
-	
-	/**
-	 * Get the buffer where the test case generated output will be sent.
-	 */
-	public IBuffer getBuffer() {
-		return _buffer;
-	}
-	
-	public void setBuffer(IBuffer b) {
-		_buffer = b;
-	}
-	
-	public IProject[] getProjects() {
-		return _projects;
-	}
-	
-	public void setProjects(IProject[] projects) {
-		_projects = projects;
-	}
-
-	/**
-	 * @see org.eclipse.core.resources.IWorkspaceRunnable#run(IProgressMonitor)
-	 */
-	public void run(IProgressMonitor arg0) throws CoreException {
-		try {
-			generate(getProjects());
-		}
-		catch(Throwable exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-			getBuffer().write("A Throwable was caught; could not generate the test case. Check the LoggingUtil.log file for details."); //$NON-NLS-1$
-		}
-		finally {
-			_vmdBuffer.clear();
-		}
-	}
-	
-	protected void generate(IProject[] projects) {
-		// First, load all of the validation markers from the selected projects, 
-		// and group them by the validator.
-		for(int i=0; i<projects.length; i++) {
-			IProject project = projects[i];
-			IMarker[] markers = TaskListUtility.getValidationTasks(project, IMessage.ALL_MESSAGES);
-			if((markers == null) || (markers.length == 0)){
-				getBuffer().write("Cannot generate a test case for project " + project.getName() + " until \"Run Validation\" has been run. Enable only the validator whose test case is to be generated, right-click, and \"Run Validation\". Once the validation messages have been reported, a test case can be generated from those messages."); //$NON-NLS-1$ //$NON-NLS-2$
-				continue;
-			}
-			
-			// A test case = one validator on one project => what markers
-			List markerList = new ArrayList();
-			for(int j=0; j<markers.length; j++) {
-				markerList.add(markers[j]);
-			}
-			
-			// Sort the markers by validator, project, prefix, location & resource
-			Collections.sort(markerList, MessageUtility.getMessageComparator(getBuffer(), false));
-
-			Iterator iterator = markerList.iterator();
-			while(iterator.hasNext()) {
-				IMarker marker = (IMarker)iterator.next();			
-				ValidatorMetaData vmd = MessageUtility.getValidator(marker);
-				if(vmd != null) {
-					StringBuffer messageBuffer = getBuffer(vmd);
-					String messageId = MessageUtility.getMessagePrefix(marker);
-					String resource = MessageUtility.getResource(marker);
-					Integer lineNumber = MessageUtility.getLineNumber(marker);
-					String location = (lineNumber == null) ? (location = MessageUtility.getLocation(marker)) : (location = lineNumber.toString());
-					String text = MessageUtility.getMessage(marker); // Emit the text of the message so that, if the message prefixes are changed in the future, it's easy to see that the same test is run with a different prefix, and that the test didn't really fail.
-					text = text.replace('<', '['); // remove the XML reserved characters.
-					text = text.replace('>', ']');
-					text = text.replace('"', '\'');
-					messageBuffer.append(MessageFormat.format(_TESTCASE_MESSAGE_TEMPLATE_, new String[]{messageId, resource, location, text}));
-				}
-			}
-			
-			iterator = _vmdBuffer.keySet().iterator(); // iterate over the vmds
-			while(iterator.hasNext()) {
-				ValidatorMetaData vmd = (ValidatorMetaData)iterator.next();
-				StringBuffer buffer = (StringBuffer)_vmdBuffer.get(vmd);
-				String testcaseTemplate = MessageFormat.format(_TESTCASE_TEMPLATE_, new String[]{project.getName(), vmd.getValidatorUniqueName(), buffer.toString()});
-				
-				getBuffer().write(testcaseTemplate);
-				
-				buffer.delete(0, buffer.length()); // clear the buffer for the next project
-			}
-		}
-	}
-	
-	private StringBuffer getBuffer(ValidatorMetaData vmd) {
-		StringBuffer buffer = (StringBuffer)_vmdBuffer.get(vmd);
-		if(buffer == null) {
-			buffer = new StringBuffer();
-			_vmdBuffer.put(vmd, buffer);
-		}
-		return buffer;
-	}
-
-}
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/BuildInfo.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/BuildInfo.java
deleted file mode 100644
index f56d29a..0000000
--- a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/BuildInfo.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.eclipse.jst.validation.test.fwk;
-public class BuildInfo {
-  public static final String copyright = "Licensed Materials -- Property of IBM\n(c) Copyright International Business Machines Corporation, 2001,2003\nUS Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.";
-  public static final String fgBuildLevel = "20031112_1915-WB212-AD-V511D-W5";
-  public static String level() { return fgBuildLevel; }
-  public static String getWSABuildLevel() { return fgBuildLevel; }
-}
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrBuilder.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrBuilder.java
deleted file mode 100644
index 88250a2..0000000
--- a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.eclipse.jst.validation.test.fwk;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- */
-public class TestOpConstrBuilder extends IncrementalProjectBuilder {
-	public static final String BUILDER_ID = "org.eclipse.jst.validation.test.fwk.bvtbuilder"; //$NON-NLS-1$
-	private IResourceDelta _delta = null;
-	private static TestOpConstrBuilder _inst = null;
-	
-	public TestOpConstrBuilder() {
-		_inst = this;
-	}
-
-	/**
-	 * @see org.eclipse.core.internal.events.InternalBuilder#build(int, java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
-		// Nothing to do; this class exists only so that an IResourceDelta can be constructed.
-		_delta = getDelta(getProject());
-		return null;
-	}
-
-	public IResourceDelta getDelta() {
-		return _delta;
-	}
-	
-	public static TestOpConstrBuilder singleton() {
-		return _inst;
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrInputOperation.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrInputOperation.java
deleted file mode 100644
index 2c767b9..0000000
--- a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrInputOperation.java
+++ /dev/null
@@ -1,260 +0,0 @@
-package org.eclipse.jst.validation.test.fwk;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.ICommand;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jem.java.JavaHelpers;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.fwk.validator.JDTUtility;
-import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
-import org.eclipse.jst.validation.test.setup.IBuffer;
-
-/**
- * This class constructs the input for the TestOpConstrOperation. Because
- * TestOpConstrOperation is not invoked as part of a build, when its IResources
- * are touched, a build is invoked after each touch, and that means that the
- * IResourceDelta that's constructed has only one IResource in it instead
- * of the group of changed IResource instances.
- */
-public class TestOpConstrInputOperation implements IWorkspaceRunnable {
-	public static final String FWK_NOBUILD_TEST_VALIDATOR_CLASS = "org.eclipse.jst.validation.test.fwk.validator.FwkNoBuildTestValidator"; //$NON-NLS-1$
-	public static final String FWK_TEST_VALIDATOR_CLASS = "org.eclipse.jst.validation.test.fwk.validator.FwkTestValidator"; //$NON-NLS-1$
-	public static final String PROPERTIES_VALIDATOR_CLASS = "org.eclipse.wst.validation.sample.PropertiesValidator"; //$NON-NLS-1$
-	
-	private IProject _project = null;
-	private IBuffer _buffer = null;
-	private static ICommand _builderCommand = null;
-	
-	private IResourceDelta _changedDelta = null;
-	private IResourceDelta _emptyDelta = null;
-	private JavaHelpers[] _changedClasses = null;
-	
-	/**
-	 * IProject must exist and be open.
-	 */
-	public TestOpConstrInputOperation(IBuffer buffer, IProject project) {
-		setProject(project);
-		setBuffer(buffer);
-	}
-
-	public IBuffer getBuffer() {
-		return _buffer;
-	}
-	
-	public void setBuffer(IBuffer b) {
-		_buffer = b;
-	}
-		
-	public IProject getProject() {
-		return _project;
-	}
-	
-	public void setProject(IProject p) {
-		_project = p;
-	}
-
-	/*package*/ static void debug(final IBuffer buffer, String title, IResourceDelta delta) {
-		try {
-			buffer.write(title);
-			delta.accept(new IResourceDeltaVisitor() {
-				public boolean visit(IResourceDelta subdelta) throws CoreException {
-					if (subdelta == null)
-						return true;
-
-					IResource resource = subdelta.getResource();
-					buffer.write("resource is: " + resource.getFullPath()); //$NON-NLS-1$
-					return true; // visit the subdelta's children
-				}
-			});
-		}
-		catch(CoreException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-		}
-	}
-	
-	/**
-	 * Return an IResource that is not validated by the Fwk Test Validator (this
-	 * resource is used for the case where a resource is changed, and a build
-	 * is invoked, but the Fwk Test validator does not validate that resource and
-	 * should not be launched.)
-	 */	
-	public static IResource[] getEmptyResources(IProject project) {
-		IResource[] changedResources = new IResource[]{
-			project.getFile(".classpath"), //$NON-NLS-1$
-		};
-		return changedResources;
-	}
-	
-	public static void touch(IProject project, IResource[] changedResources) {
-		for(int i=0; i<changedResources.length; i++) {
-			IResource res = changedResources[i];
-			try {
-				res.touch(null); // null IProgressMonitor
-			}
-			catch(CoreException exc) {
-				// Oh well...dirty the next file.
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, exc);
-				}
-			}
-		}
-	}
-
-	private static IResourceDelta getDelta(IProject project, IResource[] changedResources) {
-		try {
-			touch(project, changedResources);
-			project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, TestOpConstrBuilder.BUILDER_ID, _builderCommand.getArguments(), null); // null IProgressMonitor
-			return TestOpConstrBuilder.singleton().getDelta();
-		}
-		catch(CoreException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-			return null;
-		}
-	}
-	
-	private static void addBuilder(IProject project, boolean doAdd) {
-		if(doAdd) {
-			// Add the builder to the project
-			try {
-				IProjectDescription description = project.getDescription();
-				ICommand[] oldCommands = description.getBuildSpec();
-				ICommand[] newCommands = new ICommand[oldCommands.length + 1];
-				System.arraycopy(oldCommands, 0, newCommands, 0, oldCommands.length);
-				_builderCommand = description.newCommand();
-				_builderCommand.setBuilderName(TestOpConstrBuilder.BUILDER_ID);
-				newCommands[oldCommands.length] = _builderCommand;
-				description.setBuildSpec(newCommands);
-
-				project.setDescription(description, null);
-			}
-			catch(CoreException exc) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, exc);
-				}
-			}
-		}
-		else {
-			// Remove the builder
-			try {
-				IProjectDescription description = project.getDescription();
-				ICommand[] oldCommands = description.getBuildSpec();
-				ICommand[] newCommands = new ICommand[oldCommands.length - 1];
-				System.arraycopy(oldCommands, 0, newCommands, 0, newCommands.length);
-				description.setBuildSpec(newCommands);
-				project.setDescription(description, null);
-			}
-			catch(CoreException exc) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, exc);
-				}
-			}
-		}
-	}
-
-	public void run(IProgressMonitor monitor) {
-		try {
-			addBuilder(getProject(), true);
-			
-			// First, build the project so that the subsequent builds aren't started with a null delta.
-			getProject().build(IncrementalProjectBuilder.INCREMENTAL_BUILD, TestOpConstrBuilder.BUILDER_ID, _builderCommand.getArguments(), null); // null IProgressMonitor
-			
-			ValidatorTestcase[] tmds = JDTUtility.getVFTests(monitor, getProject());
-			if((tmds == null) || (tmds.length == 0)) {
-				return;
-			}
-
-			// Then calculate the deltas
-			IResource[] changedResources = getChangedResources(getProject(), tmds);
-			_emptyDelta = getDelta(getProject(), getEmptyResources(getProject()));
-			_changedDelta = getDelta(getProject(), changedResources);
-			
-			// Then restore the project's build commands back to what they were.
-			addBuilder(getProject(), false);
-
-			_changedClasses = getChangedClasses(changedResources);
-		}
-		catch(Throwable exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-		}
-		finally {
-		}
-	}
-	
-	public IResourceDelta getChangedDelta() {
-		return _changedDelta;
-	}
-	
-	public IResourceDelta getEmptyDelta() {
-		return _emptyDelta;
-	}
-	
-	public static IResource[] getChangedResources(IProject project, ValidatorTestcase[] tmds) {
-		Set temp = new HashSet();
-		for(int i=0; i<tmds.length; i++) {
-			ValidatorTestcase tmd = tmds[i];
-			IResource[] res = tmd.getResources(project);
-			for(int j=0; j<res.length; j++) {
-				temp.add(res[j]);
-			}
-		}
-		IResource[] result = new IResource[temp.size()];
-		temp.toArray(result);
-		return result;
-	}
-	
-	public JavaHelpers[] getChangedClasses(IResource[] resources) {
-		if(_changedClasses == null) {
-			if(resources == null) {
-				return new JavaHelpers[0];
-			}
-			
-			JavaHelpers[] result = new JavaHelpers[resources.length];
-			int count = 0;
-			for(int i=0; i<resources.length; i++) {
-				IResource resource = resources[i];
-				if((resource instanceof IFile) && (resource.getFileExtension().equals("java") || resource.getFileExtension().equals("class"))) { //$NON-NLS-1$  //$NON-NLS-2$
-					JavaHelpers h = JDTUtility.getJavaHelpers((IFile)resource);
-					if(h != null) {
-						result[count++] = h;
-					}
-				}
-			}
-			
-			if(count != resources.length) {
-				JavaHelpers[] temp = new JavaHelpers[count];
-				System.arraycopy(result, 0, temp, 0, count);
-				return temp;
-			}
-			else {
-				return result;
-			}
-		}
-		return _changedClasses;
-	}
-}
-
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrOperation.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrOperation.java
deleted file mode 100644
index 0ca9931..0000000
--- a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrOperation.java
+++ /dev/null
@@ -1,619 +0,0 @@
-package org.eclipse.jst.validation.test.fwk;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jem.java.JavaHelpers;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.BVTValidationException;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.IOperationRunnable;
-import org.eclipse.jst.validation.test.ValidationTypeEnum;
-import org.eclipse.jst.validation.test.fwk.validator.JDTUtility;
-import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
-import org.eclipse.jst.validation.test.internal.util.BVTRunner;
-import org.eclipse.jst.validation.test.setup.IBuffer;
-import org.eclipse.wst.validation.internal.ConfigurationManager;
-import org.eclipse.wst.validation.internal.GlobalConfiguration;
-import org.eclipse.wst.validation.internal.InternalValidatorManager;
-import org.eclipse.wst.validation.internal.TaskListUtility;
-import org.eclipse.wst.validation.internal.ValidationConfiguration;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-import org.eclipse.wst.validation.internal.operations.AllValidatorsOperation;
-import org.eclipse.wst.validation.internal.operations.EnabledIncrementalValidatorsOperation;
-import org.eclipse.wst.validation.internal.operations.EnabledValidatorsOperation;
-import org.eclipse.wst.validation.internal.operations.IRuleGroup;
-import org.eclipse.wst.validation.internal.operations.OneValidatorOperation;
-import org.eclipse.wst.validation.internal.operations.ValidationOperation;
-import org.eclipse.wst.validation.internal.operations.ValidatorSubsetOperation;
-import org.eclipse.wst.validation.internal.operations.WorkbenchReporter;
-
-/**
- * This class tests every constructor available in the ValidationOperation
- * hierarchy and ensures that an operation, created with that constructor, 
- * results in the expected validation IMarkers.
- */
-public class TestOpConstrOperation implements IOperationRunnable {
-	private IProject _project = null;
-	private IBuffer _buffer = null;
-	private String _testCaseName = null;
-	
-	/**
-	 * Must have a public default constructor in order to createExecutableExtension.
-	 * MUST call setBuffer, setProject, and setName before using the operation.
-	 */
-	public TestOpConstrOperation() {
-	}
-	
-	/**
-	 * IProject must exist and be open.
-	 */
-	public TestOpConstrOperation(IBuffer buffer, IProject project, String testCaseName) {
-		setBuffer(buffer);
-		setProject(project);
-		setName(testCaseName);
-	}
-	
-	public IBuffer getBuffer() {
-		return _buffer;
-	}
-	
-	public void setBuffer(IBuffer b) {
-		_buffer = b;
-	}
-	
-	public IProject getProject() {
-		return _project;
-	}
-	
-	public void setProject(IProject p) {
-		_project = p;
-	}
-	
-	public String getName() {
-		return _testCaseName;
-	}
-	
-	public void setName(String name) {
-		_testCaseName = name;
-	}	
-
-	public void run(IProgressMonitor monitor) {
-		try {
-			GlobalConfiguration gconf = ConfigurationManager.getManager().getGlobalConfiguration();
-			GlobalConfiguration origGconf = new GlobalConfiguration(gconf);
-			boolean autoBuildEnabled = ResourcesPlugin.getWorkspace().isAutoBuilding();
-			try {
-				// In order for the operations to work correctly, set the enabled validators to
-				// the validators for which tests exist, and turn off auto-build so that a
-				// validation is forced.
-				gconf.setCanProjectsOverride(false);
-				gconf.setAutoValidate(true);
-				gconf.setBuildValidate(true);
-				gconf.setMaximumNumberOfMessages(WorkbenchReporter.NO_MESSAGE_LIMIT);
-				gconf.passivate();
-				
-				JDTUtility.setAutoBuild(false);
-				
-				monitor.subTask("Loading operations; please wait..."); //$NON-NLS-1$
-				TestWrapper[] testCaseAndOperations = getOperations(monitor, gconf);
-				if(testCaseAndOperations == null) {
-					String message = "Test case failed; cannot test null operations."; //$NON-NLS-1$
-					getBuffer().write(message);
-					monitor.subTask(message);
-					return;
-				}
-	
-				int numPassed = 0;
-				for(int i=0; i<testCaseAndOperations.length; i++) {
-					TestWrapper testWrapper = testCaseAndOperations[i];
-					ValidationOperation operation = testWrapper.getOperation();
-					boolean tpassed = false;
-					try {
-						if(monitor.isCanceled()) {
-							break;
-						}
-						monitor.subTask("Testing " + (i+1) + " of " + testCaseAndOperations.length + " constructors."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						preTest(testWrapper);
-						if(test(monitor, testWrapper)) {
-							numPassed++;
-							tpassed = true;
-						}
-					}
-					catch(Throwable exc) {
-						getBuffer().write("Throwable caught while testing #" + (i+1) + " " + operation.getClass().getName()); //$NON-NLS-1$ //$NON-NLS-2$
-						Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-						if(logger.isLoggingLevel(Level.SEVERE)) {
-							logger.write(Level.SEVERE, exc);
-						}
-					}
-					finally {
-						String message = "Test #" + (i+1) + " of " + testCaseAndOperations.length + ((tpassed) ? " passed." : " failed."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-						monitor.subTask(message);
-						getBuffer().write(message);
-						getBuffer().addExecutionStatus(getName(), testWrapper.getName(), tpassed); //$NON-NLS-1$
-					}
-				}
-				
-				String status = numPassed + " of " + testCaseAndOperations.length + " tests passed."; //$NON-NLS-1$ //$NON-NLS-2$
-				monitor.subTask(status);
-				getBuffer().write(status);
-			}
-			finally {
-				// Set the project's settings back to what they were.
-				gconf = origGconf;
-				gconf.passivate();
-				
-				JDTUtility.setAutoBuild(autoBuildEnabled);
-			}
-		}
-		catch(InvocationTargetException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-		}
-	}
-	
-	private void preTest(TestWrapper wrapper) throws CoreException {
-		// First, remove all of the markers. Can't rely on the operation to remove the markers between
-		// one invocation and the next because sometimes the validation is not supposed to run.
-		TaskListUtility.removeAllTasks(getProject(), wrapper.getValidatorNames()); // null=delete markers on all objects
-	}
-	
-	/**
-	 * Return true if the test passes, and false if it failed.
-	 */
-	private boolean test(IProgressMonitor monitor, TestWrapper testWrapper) throws InvocationTargetException {
-		boolean result = true;
-		try {
-			result = BVTRunner.singleton().test(getBuffer(), getName(), testWrapper.getName(), testWrapper.getExpectedMessages(), testWrapper.getOperation(), testWrapper.getValidatorNames()) && result;
-		}
-		catch(BVTValidationException exc) {
-			result = false;
-			if(exc.getTargetException() != null) {
-				throw new InvocationTargetException(exc.getTargetException(), exc.getMessage());
-			}
-		}
-		return result;
-	}
-	
-	/**
-	 * Return an array, with the first entry in the array the ValidatorTestcase that 
-	 * holds the expected results, and the second entry of the array a ValidationOperation[]
-	 * containing the operations to be tested.
-	 */
-	private TestWrapper[] getOperations(IProgressMonitor monitor, ValidationConfiguration vconf) throws InvocationTargetException {
-		ValidatorTestcase[] allTmds = JDTUtility.getVFTests(monitor, getProject());
-		if((allTmds == null) || (allTmds.length == 0)) {
-			return null;
-		}
-
-		// Some of the operation constructors require file extensions. 
-		String fileExtension = ".java"; //$NON-NLS-1$
-		String defaultExtension = null;
-		IFile javaFile = getProject().getFile("foo.java"); //$NON-NLS-1$
-
-		// Some of the operations below pass if they don't produce any results.
-		// Create a test case that passes the operation if the operation does nothing.
-		List tmdEmpty = new ArrayList(); // expected messages == none
-		List tmdInc = new ArrayList(); // expected messages when incremental validators ran
-		List tmdEnabled = new ArrayList(); // expected messages when enabled validators ran
-		List tmdJava = new ArrayList(); // expected messages when validators that validate .java files are run
-		List tmdFull = new ArrayList(); // expected messages when validators that support only "Run Validation" are run
-		Set enabledValidators = new HashSet(); // enabled validators == FWK Val, FWK NoBuild Val, Properties Val
-		Set enabledIncrementalValidators = new HashSet(); // enabled incremental == FWK Val, Properties Val (support incremental validation)
-		Set javaValidators = new HashSet(); // java val == FWK Val, FWK NoBuild Val (validate .java files)
-		Set fullValidators = new HashSet(); // full val == FWK NoBuild Val (runs only when "Run Validation" clicked)
-		ValidatorMetaData[] enabledVmd = new ValidatorMetaData[allTmds.length];
-		for(int i=0; i<allTmds.length; i++) {
-			ValidatorTestcase vt = allTmds[i];
-			
-			ValidatorMetaData vmd = vt.getValidatorMetaData();
-			enabledValidators.add(vmd);
-			enabledVmd[i] = vmd;
-			if(vmd.isIncremental()) {
-				enabledIncrementalValidators.add(vmd);
-			}
-			else {
-				fullValidators.add(vmd);
-				tmdFull.addAll(vt.getMessages(ValidationTypeEnum.RUN_VALIDATION));
-			}
-			
-			// It is the responsibility of the code that instantiates the ValidatorSubsetOperation
-			// to ensure that when an array of changed resources or objects is passed to the operation,
-			// that only incremental validators are invoked by the operation. The framework does not
-			// check if the validators are incremental or not; instead, the named validators will run,
-			// even if they perform a full validation instead of validating just the arrays.
-			if(vmd.isApplicableTo(javaFile) && vmd.isIncremental()) {
-				javaValidators.add(vmd);
-				tmdJava.addAll(vt.getMessages(ValidationTypeEnum.INCREMENTAL_VALIDATION));
-			}
-			
-			tmdEnabled.addAll(vt.getMessages(ValidationTypeEnum.RUN_VALIDATION));
-			tmdInc.addAll(vt.getMessages(ValidationTypeEnum.INCREMENTAL_VALIDATION));			
-		}
-		String[] allValidatorNames = InternalValidatorManager.getManager().getValidatorNames(enabledValidators);
-		String[] incValidatorNames = InternalValidatorManager.getManager().getValidatorNames(enabledIncrementalValidators);
-		String[] javaValidatorNames = InternalValidatorManager.getManager().getValidatorNames(javaValidators);
-		String[] fullValidatorNames = InternalValidatorManager.getManager().getValidatorNames(fullValidators);
-		
-		vconf.setEnabledValidators(enabledVmd);
-		vconf.passivate();
-		
-		// Start constructing the tests
-		// For the tests that depend on the value of the autoBuild setting, it is assumed that
-		// autoBuild is on. The tests will fail if autoBuild is disabled.
-		//
-		// Unlike the subsequent operations, these first two cannot use the allTmds TMD because
-		// more than one validator runs. The allTmdFull TMD contains all tmd of validators that
-		// will run. 
-		AllValidatorsOperation op1 = new AllValidatorsOperation(getProject());
-		TestWrapper test1 = new TestWrapper(op1, tmdEnabled, "op1", allValidatorNames); //$NON-NLS-1$
-		
-		AllValidatorsOperation op2 = new AllValidatorsOperation(getProject(), false); // don't fork
-		TestWrapper test2 = new TestWrapper(op2, tmdEnabled, "op2", allValidatorNames); //$NON-NLS-1$
-
-		// Construct the input for the rest of the operations using the VF Test validators.
-		TestOpConstrInputOperation inputOp = new TestOpConstrInputOperation(getBuffer(), getProject());
-		try {
-			ResourcesPlugin.getWorkspace().run(inputOp, monitor);
-		}
-		catch(Throwable exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-			return new TestWrapper[0];
-		}
-		
-		IResource[] changedResources = TestOpConstrInputOperation.getChangedResources(getProject(), allTmds);
-		IResource[] emptyResources = TestOpConstrInputOperation.getEmptyResources(getProject());
-		JavaHelpers[] changedClasses = inputOp.getChangedClasses(changedResources);
-		IResourceDelta emptyDelta = inputOp.getEmptyDelta();
-		IResourceDelta changedDelta = inputOp.getChangedDelta();
-		// end construct input
-
-		EnabledIncrementalValidatorsOperation op3 = new EnabledIncrementalValidatorsOperation(getProject(), null,true);
-		TestWrapper test3 = new TestWrapper(op3, tmdInc, "op3", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledIncrementalValidatorsOperation op4 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta,false);
-		TestWrapper test4 = new TestWrapper(op4, tmdInc, "op4", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledIncrementalValidatorsOperation op5 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta,false);
-		TestWrapper test5 = new TestWrapper(op5, tmdEmpty, "op5", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledIncrementalValidatorsOperation op6 = new EnabledIncrementalValidatorsOperation(getProject(), null, IRuleGroup.PASS_FAST,false);
-		TestWrapper test6 = new TestWrapper(op6, tmdInc, "op6", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledIncrementalValidatorsOperation op7 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, IRuleGroup.PASS_FAST,false);
-		TestWrapper test7 = new TestWrapper(op7, tmdInc, "op7", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledIncrementalValidatorsOperation op8 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta, IRuleGroup.PASS_FAST,false);
-		TestWrapper test8 = new TestWrapper(op8, tmdEmpty, "op8", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledIncrementalValidatorsOperation op9 = new EnabledIncrementalValidatorsOperation(getProject(), enabledIncrementalValidators, null, IRuleGroup.PASS_FAST);
-		TestWrapper test9 = new TestWrapper(op9, tmdInc, "op9", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledIncrementalValidatorsOperation op10 = new EnabledIncrementalValidatorsOperation(getProject(), enabledIncrementalValidators, changedDelta, IRuleGroup.PASS_FAST);
-		TestWrapper test10 = new TestWrapper(op10, tmdInc, "op10", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledIncrementalValidatorsOperation op11 = new EnabledIncrementalValidatorsOperation(getProject(), enabledIncrementalValidators, emptyDelta, IRuleGroup.PASS_FAST);
-		TestWrapper test11 = new TestWrapper(op11, tmdEmpty, "op11", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledIncrementalValidatorsOperation op12 = new EnabledIncrementalValidatorsOperation(getProject(), null, false); // full validate, don't fork
-		TestWrapper test12 = new TestWrapper(op12, tmdInc, "op12", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledIncrementalValidatorsOperation op13 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, false); // delta validate, don't fork
-		TestWrapper test13 = new TestWrapper(op13, tmdInc, "op13", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledIncrementalValidatorsOperation op14 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta, false); // empty delta validate, don't fork
-		TestWrapper test14 = new TestWrapper(op14, tmdEmpty, "op14", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledIncrementalValidatorsOperation op15 = new EnabledIncrementalValidatorsOperation(getProject(), null, IRuleGroup.PASS_FAST, false); // full validate, don't fork
-		TestWrapper test15 = new TestWrapper(op15, tmdInc, "op15", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledIncrementalValidatorsOperation op16 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, IRuleGroup.PASS_FAST, false); // delta validate, don't fork
-		TestWrapper test16 = new TestWrapper(op16, tmdInc, "op16", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledIncrementalValidatorsOperation op17 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta, IRuleGroup.PASS_FAST, false); // empty delta validate, don't fork
-		TestWrapper test17 = new TestWrapper(op17, tmdEmpty, "op17", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledValidatorsOperation op18 = new EnabledValidatorsOperation(getProject());
-		TestWrapper test18= new TestWrapper(op18, tmdEnabled, "op18", allValidatorNames); //$NON-NLS-1$
-		
-		EnabledValidatorsOperation op19 = new EnabledValidatorsOperation(getProject(), false); // don't fork
-		TestWrapper test19 = new TestWrapper(op19, tmdEnabled, "op19", allValidatorNames); //$NON-NLS-1$
-		
-		EnabledValidatorsOperation op20 = new EnabledValidatorsOperation(getProject(), IRuleGroup.PASS_FAST);
-		TestWrapper test20 = new TestWrapper(op20, tmdEnabled, "op20", allValidatorNames); //$NON-NLS-1$
-		
-		EnabledValidatorsOperation op21 = new EnabledValidatorsOperation(getProject(), IRuleGroup.PASS_FAST, true,false); // force validation if it doesn't need to run
-		TestWrapper test21 = new TestWrapper(op21, tmdEnabled, "op21", allValidatorNames); //$NON-NLS-1$
-		
-		EnabledValidatorsOperation op22 = new EnabledValidatorsOperation(getProject(), IRuleGroup.PASS_FAST, false,false); // no force validation if it doesn't need to run
-		TestWrapper test22 = new TestWrapper(op22, tmdEnabled, "op22", allValidatorNames); //$NON-NLS-1$
-		
-		EnabledValidatorsOperation op23 = new EnabledValidatorsOperation(getProject(), IRuleGroup.PASS_FAST, true, false); // force, don't fork
-		TestWrapper test23 = new TestWrapper(op23, tmdEnabled, "op23", allValidatorNames); //$NON-NLS-1$
-		
-		EnabledValidatorsOperation op24 = new EnabledValidatorsOperation(getProject(), IRuleGroup.PASS_FAST, false, false); // no force, don't fork
-		TestWrapper test24 = new TestWrapper(op24, tmdEnabled, "op24", allValidatorNames); //$NON-NLS-1$
-		
-		EnabledValidatorsOperation op25 = new EnabledIncrementalValidatorsOperation(getProject(), null,true); 
-		TestWrapper test25 = new TestWrapper(op25, tmdEnabled, "op25", allValidatorNames); //$NON-NLS-1$
-		
-		EnabledValidatorsOperation op26 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta,true);
-		TestWrapper test26 = new TestWrapper(op26, tmdInc, "op26", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledValidatorsOperation op27 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta,true);
-		TestWrapper test27 = new TestWrapper(op27, tmdEmpty, "op27", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledValidatorsOperation op28 = new EnabledIncrementalValidatorsOperation(getProject(), null, IRuleGroup.PASS_FAST,true);
-		TestWrapper test28 = new TestWrapper(op28, tmdEnabled, "op28", allValidatorNames); //$NON-NLS-1$
-		
-		EnabledValidatorsOperation op29 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, IRuleGroup.PASS_FAST,true);
-		TestWrapper test29 = new TestWrapper(op29, tmdInc, "op29", incValidatorNames); //$NON-NLS-1$
-		
-		EnabledValidatorsOperation op30 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta, IRuleGroup.PASS_FAST,true); 
-		TestWrapper test30 = new TestWrapper(op30, tmdEmpty, "op30", incValidatorNames); //$NON-NLS-1$
-
-		ValidatorMetaData vmd = allTmds[0].getValidatorMetaData();
-		String validatorName = vmd.getValidatorUniqueName();
-		String[] vmdNames = InternalValidatorManager.getManager().getValidatorNames(new ValidatorMetaData[]{vmd});
-		List expectedMessages = allTmds[0].getMessages(ValidationTypeEnum.RUN_VALIDATION);
-		OneValidatorOperation op31 = new OneValidatorOperation(getProject(), validatorName);
-		TestWrapper test31 = new TestWrapper(op31, expectedMessages, "op31", vmdNames); //$NON-NLS-1$
-		
-		OneValidatorOperation op32 = new OneValidatorOperation(getProject(), validatorName, true); // force if necessary
-		TestWrapper test32 = new TestWrapper(op32, expectedMessages, "op32", vmdNames); //$NON-NLS-1$
-		
-		OneValidatorOperation op33 = new OneValidatorOperation(getProject(), validatorName, false); // no force
-		TestWrapper test33 = new TestWrapper(op33, expectedMessages, "op33", vmdNames); //$NON-NLS-1$
-		
-		OneValidatorOperation op34 = new OneValidatorOperation(getProject(), validatorName, true, false); // force, no fork
-		TestWrapper test34 = new TestWrapper(op34, expectedMessages, "op34", vmdNames); //$NON-NLS-1$
-		
-		OneValidatorOperation op35 = new OneValidatorOperation(getProject(), validatorName, false, false); // no force, no fork
-		TestWrapper test35 = new TestWrapper(op35, expectedMessages, "op35", vmdNames); //$NON-NLS-1$
-		
-		OneValidatorOperation op36 = new OneValidatorOperation(getProject(), validatorName, true, IRuleGroup.PASS_FAST); // force
-		TestWrapper test36 = new TestWrapper(op36, expectedMessages, "op36", vmdNames); //$NON-NLS-1$
-		
-		OneValidatorOperation op37 = new OneValidatorOperation(getProject(), validatorName, false, IRuleGroup.PASS_FAST); // no force
-		TestWrapper test37 = new TestWrapper(op37, expectedMessages, "op37", vmdNames); //$NON-NLS-1$
-		
-		OneValidatorOperation op38 = new OneValidatorOperation(getProject(), validatorName, true, IRuleGroup.PASS_FAST, false); // force, no fork
-		TestWrapper test38 = new TestWrapper(op38, expectedMessages, "op38", vmdNames); //$NON-NLS-1$
-		
-		OneValidatorOperation op39 = new OneValidatorOperation(getProject(), validatorName, false, IRuleGroup.PASS_FAST, false); // no force, no fork
-		TestWrapper test39 = new TestWrapper(op39, expectedMessages, "op39", vmdNames); //$NON-NLS-1$
-
-		ValidatorSubsetOperation op40 = new ValidatorSubsetOperation(getProject(),true,false);
-		op40.setValidators(allValidatorNames);
-		TestWrapper test40 = new TestWrapper(op40, tmdEnabled, "op40", allValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op41 = new ValidatorSubsetOperation(getProject(), true,false); // force
-		op41.setValidators(allValidatorNames);
-		TestWrapper test41 = new TestWrapper(op41, tmdEnabled, "op41", allValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op42 = new ValidatorSubsetOperation(getProject(), false,false); // no force
-		op42.setValidators(allValidatorNames);
-		TestWrapper test42 = new TestWrapper(op42, tmdEnabled, "op42", allValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op43 = new ValidatorSubsetOperation(getProject(), true, false); // force, no fork
-		op43.setValidators(allValidatorNames);
-		TestWrapper test43 = new TestWrapper(op43, tmdEnabled, "op43", allValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op44 = new ValidatorSubsetOperation(getProject(), false, false); // no force, no fork
-		op44.setValidators(allValidatorNames);
-		TestWrapper test44 = new TestWrapper(op44, tmdEnabled, "op44", allValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op45 = new ValidatorSubsetOperation(getProject(), true, IRuleGroup.PASS_FAST,false); // force
-		op45.setValidators(allValidatorNames);
-		TestWrapper test45 = new TestWrapper(op45, tmdEnabled, "op45", allValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op46 = new ValidatorSubsetOperation(getProject(), false, IRuleGroup.PASS_FAST,false); // no force
-		op46.setValidators(allValidatorNames);
-		TestWrapper test46 = new TestWrapper(op46, tmdEnabled, "op46", allValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op47 = new ValidatorSubsetOperation(getProject(), true, IRuleGroup.PASS_FAST, false); // force, no fork
-		op47.setValidators(allValidatorNames);
-		TestWrapper test47 = new TestWrapper(op47, tmdEnabled, "op47", allValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op48 = new ValidatorSubsetOperation(getProject(), false, IRuleGroup.PASS_FAST, false); // no force, no fork
-		op48.setValidators(allValidatorNames);
-		TestWrapper test48 = new TestWrapper(op48, tmdEnabled, "op48", allValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op49 = new EnabledIncrementalValidatorsOperation(getProject(), null,false);
-		op49.setValidators(allValidatorNames);
-		TestWrapper test49 = new TestWrapper(op49, tmdEnabled, "op49", allValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op50 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta,false);
-		op50.setValidators(incValidatorNames);
-		TestWrapper test50 = new TestWrapper(op50, tmdInc, "op50", incValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op51 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta,false);
-		op51.setValidators(incValidatorNames);
-		TestWrapper test51 = new TestWrapper(op51, tmdEmpty, "op51", incValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op52 = new EnabledIncrementalValidatorsOperation(getProject(), null, false); // false=autoBuild disabled
-		op52.setValidators(allValidatorNames);
-		TestWrapper test52 = new TestWrapper(op52, tmdEnabled, "op52", allValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op53 = new EnabledIncrementalValidatorsOperation(getProject(), null, true); // true=autoBuild enabled
-		op53.setValidators(fullValidatorNames);
-		TestWrapper test53 = new TestWrapper(op53, tmdFull, "op53", fullValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op54 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, false); // false=autoBuild disabled
-		op54.setValidators(incValidatorNames);
-		TestWrapper test54 = new TestWrapper(op54, tmdInc, "op54", incValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op55 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, true); // true=autoBuild enabled
-		op55.setValidators(incValidatorNames);
-		TestWrapper test55 = new TestWrapper(op55, tmdEmpty, "op55", incValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op56 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta, false); // false=autoBuild disabled
-		op56.setValidators(incValidatorNames);
-		TestWrapper test56 = new TestWrapper(op56, tmdEmpty, "op56", incValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op57 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta, true); // true=autoBuild enabled
-		op57.setValidators(incValidatorNames);
-		TestWrapper test57 = new TestWrapper(op57, tmdEmpty, "op57", incValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op58 = new EnabledIncrementalValidatorsOperation(getProject(),null, IRuleGroup.PASS_FAST,false); // false=autoBuild disabled
-		op58.setValidators(allValidatorNames);
-		TestWrapper test58 = new TestWrapper(op58, tmdEnabled, "op58", allValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op59 = new EnabledIncrementalValidatorsOperation(getProject(), null, IRuleGroup.PASS_FAST,false); // true=autoBuild enabled
-		op59.setValidators(allValidatorNames);
-		TestWrapper test59 = new TestWrapper(op59, tmdFull, "op59", allValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op60 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, IRuleGroup.PASS_FAST,false); // false=autoBuild disabled
-		op60.setValidators(incValidatorNames);
-		TestWrapper test60 = new TestWrapper(op60, tmdInc, "op60", incValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op61 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, IRuleGroup.PASS_FAST,false); // true=autoBuild enabled
-		op61.setValidators(incValidatorNames);
-		TestWrapper test61 = new TestWrapper(op61, tmdEmpty, "op61", incValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op62 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta,IRuleGroup.PASS_FAST,false); // false=autoBuild disabled
-		op62.setValidators(incValidatorNames);
-		TestWrapper test62 = new TestWrapper(op62, tmdEmpty, "op62", incValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op63 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta,IRuleGroup.PASS_FAST,true); // true=autoBuild enabled
-		op63.setValidators(incValidatorNames);
-		TestWrapper test63 = new TestWrapper(op63, tmdEmpty, "op63", incValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op64 = new EnabledIncrementalValidatorsOperation(getProject(),null,IRuleGroup.PASS_FAST,true);
-		op64.setValidators(allValidatorNames);
-		TestWrapper test64 = new TestWrapper(op64, tmdEnabled, "op64", allValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op65 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, IRuleGroup.PASS_FAST,true);
-		op65.setValidators(incValidatorNames);
-		TestWrapper test65 = new TestWrapper(op65, tmdInc, "op65", incValidatorNames); //$NON-NLS-1$
-		
-		ValidatorSubsetOperation op66 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta, IRuleGroup.PASS_FAST,true);
-		op66.setValidators(incValidatorNames);
-		TestWrapper test66 = new TestWrapper(op66, tmdEmpty, "op66", incValidatorNames); //$NON-NLS-1$
-
-		if(changedClasses != null) {
-			ValidatorSubsetOperation op67 = new ValidatorSubsetOperation(getProject(), fileExtension, changedResources,false);
-			op67.setValidators(javaValidatorNames);
-			TestWrapper test67 = new TestWrapper(op67, tmdJava, "op67", javaValidatorNames); //$NON-NLS-1$
-			
-			ValidatorSubsetOperation op68 = new ValidatorSubsetOperation(getProject(), fileExtension, changedResources, false); // no fork
-			op68.setValidators(javaValidatorNames);
-			TestWrapper test68 = new TestWrapper(op68, tmdJava, "op68", javaValidatorNames); //$NON-NLS-1$
-			
-			ValidatorSubsetOperation op69 = new ValidatorSubsetOperation(getProject(), fileExtension, defaultExtension, changedResources,false);
-			op69.setValidators(javaValidatorNames);
-			TestWrapper test69 = new TestWrapper(op69, tmdJava, "op69", javaValidatorNames); //$NON-NLS-1$
-			
-			ValidatorSubsetOperation op70 = new ValidatorSubsetOperation(getProject(), fileExtension, defaultExtension, changedResources, false); // no fork
-			op70.setValidators(javaValidatorNames);
-			TestWrapper test70 = new TestWrapper(op70, tmdJava, "op70", javaValidatorNames); //$NON-NLS-1$
-			
-			ValidatorSubsetOperation op71 = new ValidatorSubsetOperation(getProject(), fileExtension, emptyResources,false);
-			op71.setValidators(javaValidatorNames);
-			TestWrapper test71 = new TestWrapper(op71, tmdEmpty, "op71", javaValidatorNames); //$NON-NLS-1$
-			
-			ValidatorSubsetOperation op72 = new ValidatorSubsetOperation(getProject(), fileExtension, emptyResources, false); // no fork
-			op72.setValidators(javaValidatorNames);
-			TestWrapper test72 = new TestWrapper(op72, tmdEmpty, "op72", javaValidatorNames); //$NON-NLS-1$
-			
-			ValidatorSubsetOperation op73 = new ValidatorSubsetOperation(getProject(), fileExtension, defaultExtension, emptyResources,false);
-			op73.setValidators(javaValidatorNames);
-			TestWrapper test73 = new TestWrapper(op73, tmdEmpty, "op73", javaValidatorNames); //$NON-NLS-1$
-			
-			ValidatorSubsetOperation op74 = new ValidatorSubsetOperation(getProject(), fileExtension, defaultExtension, emptyResources, false); // no fork
-			op74.setValidators(javaValidatorNames);
-			TestWrapper test74 = new TestWrapper(op74, tmdEmpty, "op74", javaValidatorNames); //$NON-NLS-1$
-			
-			ValidatorSubsetOperation op75 = new ValidatorSubsetOperation(getProject(), fileExtension, changedClasses,false);
-			op75.setValidators(javaValidatorNames);
-			TestWrapper test75 = new TestWrapper(op75, tmdJava, "op75", javaValidatorNames); //$NON-NLS-1$
-			
-			ValidatorSubsetOperation op76 = new ValidatorSubsetOperation(getProject(), fileExtension, changedClasses, false); // no fork
-			op76.setValidators(javaValidatorNames);
-			TestWrapper test76 = new TestWrapper(op76, tmdJava, "op76", javaValidatorNames); //$NON-NLS-1$
-			
-			ValidatorSubsetOperation op77 = new ValidatorSubsetOperation(getProject(), fileExtension, defaultExtension, changedClasses,false);
-			op77.setValidators(javaValidatorNames);
-			TestWrapper test77 = new TestWrapper(op77, tmdJava, "op77", javaValidatorNames); //$NON-NLS-1$
-			
-			ValidatorSubsetOperation op78 = new ValidatorSubsetOperation(getProject(), fileExtension, defaultExtension, changedClasses, false); // no fork
-			op78.setValidators(javaValidatorNames);
-			TestWrapper test78 = new TestWrapper(op78, tmdJava, "op78", javaValidatorNames); //$NON-NLS-1$
-			
-			TestWrapper[] result = new TestWrapper[] {
-				test1, test2, test3, test4, test5, test6, test7, test8, test9,
-				test10, test11, test12, test13, test14, test15, test16, test17, test18, test19,
-				test20, test21, test22, test23, test24, test25, test26, test27, test28, test29,
-				test30, test31, test32, test33, test34, test35, test36, test37, test38, test39,
-				test40, test41, test42, test43, test44, test45, test46, test47, test48, test49,
-				test50, test51, test52, test53, test54, test55, test56, test57, test58, test59,
-				test60, test61, test62, test63, test64, test65, test66, test67, test68, test69,
-				test70, test71, test72, test73, test74, test75, test76, test77, test78
-			};
-			return result;
-		}
-		else {
-			TestWrapper[] result = new TestWrapper[] {
-				test1, test2, test3, test4, test5, test6, test7, test8, test9,
-				test10, test11, test12, test13, test14, test15, test16, test17, test18, test19,
-				test20, test21, test22, test23, test24, test25, test26, test27, test28, test29,
-				test30, test31, test32, test33, test34, test35, test36, test37, test38, test39,
-				test40, test41, test42, test43, test44, test45, test46, test47, test48, test49,
-				test50, test51, test52, test53, test54, test55, test56, test57, test58, test59,
-				test60, test61, test62, test63, test64, test65, test66
-			};
-			return result;
-		}		
-	}
-
-	private class TestWrapper {
-		private List _messages = null;
-		private ValidationOperation _operation = null;
-		private String _testName = null;
-		private String[] _validatorNames = null;
-		
-		TestWrapper(ValidationOperation op, List expectedMessages, String testName, String[] validatorNames) {
-			_messages = expectedMessages;
-			_operation = op;
-			_testName = testName;
-			_validatorNames = validatorNames;
-		}
-		
-		public List getExpectedMessages() {
-			return _messages;
-		}
-		
-		public ValidationOperation getOperation() {
-			return _operation;
-		}
-		
-		public String getName() {
-			return _testName;
-		}
-		
-		public String[] getValidatorNames() {
-			return _validatorNames;
-		}
-	}
-}
-
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/VALFWK02Operation.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/VALFWK02Operation.java
deleted file mode 100644
index 9657dca..0000000
--- a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/VALFWK02Operation.java
+++ /dev/null
@@ -1,722 +0,0 @@
-package org.eclipse.jst.validation.test.fwk;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.IOperationRunnable;
-import org.eclipse.jst.validation.test.ValidationTypeEnum;
-import org.eclipse.jst.validation.test.fwk.validator.JDTUtility;
-import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
-import org.eclipse.jst.validation.test.internal.util.BVTRunner;
-import org.eclipse.jst.validation.test.setup.IBuffer;
-import org.eclipse.wst.validation.internal.ConfigurationManager;
-import org.eclipse.wst.validation.internal.GlobalConfiguration;
-import org.eclipse.wst.validation.internal.ProjectConfiguration;
-import org.eclipse.wst.validation.internal.TaskListUtility;
-import org.eclipse.wst.validation.internal.ValidationConfiguration;
-import org.eclipse.wst.validation.internal.ValidationRegistryReader;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-import org.eclipse.wst.validation.internal.operations.EnabledValidatorsOperation;
-import org.eclipse.wst.validation.internal.operations.ValidatorManager;
-import org.eclipse.wst.validation.internal.operations.WorkbenchReporter;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * This class runs the VALFWK02 test.
- */
-public final class VALFWK02Operation implements IOperationRunnable {
-	private IProject _project = null;
-	private IBuffer _buffer = null;
-	private String _testCaseName = null;
-	public static String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$
-	
-	/**
-	 * Must have a public default constructor in order to createExecutableExtension.
-	 * MUST call setBuffer, setProject, and setName before using the operation.
-	 */
-	public VALFWK02Operation() {
-	}
-	
-	/**
-	 * IProject must exist and be open.
-	 */
-	public VALFWK02Operation(IBuffer buffer, IProject project, String testCaseName) {
-		setProject(project);
-		setBuffer(buffer);
-		setName(testCaseName);
-	}
-
-	public IBuffer getBuffer() { 
-		return _buffer;
-	}
-	
-	public void setBuffer(IBuffer b) {
-		_buffer = b;
-	}
-	
-	public IProject getProject() {
-		return _project;
-	}
-	
-	public void setProject(IProject p) {
-		_project = p;
-	}
-
-	public String getName() {
-		return _testCaseName;
-	}
-	
-	public void setName(String name) {
-		_testCaseName = name;
-	}	
-
-	public void run(IProgressMonitor monitor) {
-		IProject project = getProject();
-		if(project == null) {
-			throw new IllegalArgumentException("Run VALFWK02 on an existing open IProject."); //$NON-NLS-1$
-		}
-		
-		// First, add the ValidationBuilder to the Java Project
-		ValidatorManager.addProjectBuildValidationSupport(project);
-
-		// Save the old user configuration and restore it in the finally block.
-		try {
-			GlobalConfiguration gconf = ConfigurationManager.getManager().getGlobalConfiguration();
-			ProjectConfiguration pconf = ConfigurationManager.getManager().getProjectConfiguration(project);
-			GlobalConfiguration origGconf = new GlobalConfiguration(gconf); // copy the original values so that they can be restored in the finally block
-			ProjectConfiguration origPconf = new ProjectConfiguration(pconf); // copy the original valuse so that they can be restored in the finally block
-			Level level = ValidationPlugin.getPlugin().getMsgLogger().getLevel();
-			boolean autoBuildEnabled = ResourcesPlugin.getWorkspace().isAutoBuilding();
-				
-			ValidatorMetaData[] configuredValidators = pconf.getValidators();
-			if(configuredValidators.length < 2) {
-				monitor.subTask("Run VALFWK02 on an existing open project that has at least two validators configured: one to enable, and one to disable."); //$NON-NLS-1$
-				return;
-			}
-
-			// Disable at least one validator for this test.
-			// Remove the first enabled validator from the Properties, and the second enabled validator from the
-			// Preferences. (It doesn't matter which validator is removed; it only matters that the Properties and
-			// the Preferences have different validators.)
-			ValidatorMetaData vfTestValidator = ValidationRegistryReader.getReader().getValidatorMetaData(TestOpConstrInputOperation.FWK_NOBUILD_TEST_VALIDATOR_CLASS); //$NON-NLS-1$
-			ValidatorMetaData vfNoBuildTestValidator = ValidationRegistryReader.getReader().getValidatorMetaData(TestOpConstrInputOperation.FWK_TEST_VALIDATOR_CLASS); //$NON-NLS-1$
-			ValidatorMetaData propertiesValidator = ValidationRegistryReader.getReader().getValidatorMetaData(TestOpConstrInputOperation.PROPERTIES_VALIDATOR_CLASS); //$NON-NLS-1$
-			ValidatorMetaData[] enabledPropValidators = new ValidatorMetaData[2];
-			enabledPropValidators[0] = vfTestValidator;
-			enabledPropValidators[1] = vfNoBuildTestValidator;
-			pconf.setEnabledValidators(enabledPropValidators);
-			pconf.setMaximumNumberOfMessages(1);
-			pconf.passivate();
-
-			ValidatorMetaData[] enabledPrefValidators = new ValidatorMetaData[1];
-			enabledPrefValidators[0] = propertiesValidator;
-			gconf.setEnabledValidators(enabledPrefValidators);
-			gconf.setMaximumNumberOfMessages(10);
-			gconf.passivate();
-			
-			
-			ValidatorTestcase[] tmds = JDTUtility.getVFTests(monitor, getProject());
-			if((tmds == null) || (tmds.length == 0)) {
-				monitor.subTask("Cannot run VALFWK02 because there are no test cases registered for JavaProject."); //$NON-NLS-1$
-				return;
-			}
-			
-			ValidatorTestcase fwkNobuildTestTMD = null;
-			ValidatorTestcase fwkTestTMD = null;
-			ValidatorTestcase propTMD = null;
-			for(int i=0; i<tmds.length; i++) {
-				ValidatorTestcase tmd = tmds[i];
-				if(tmd.getValidatorClass().equals(TestOpConstrInputOperation.FWK_TEST_VALIDATOR_CLASS)) {
-					fwkTestTMD = tmd;
-				}
-				else if(tmd.getValidatorClass().equals(TestOpConstrInputOperation.PROPERTIES_VALIDATOR_CLASS)) {
-					propTMD = tmd;
-				}
-				else if(tmd.getValidatorClass().equals(TestOpConstrInputOperation.FWK_NOBUILD_TEST_VALIDATOR_CLASS)) {
-					fwkNobuildTestTMD = tmd;
-				}
-				
-				if((fwkTestTMD != null) && (propTMD != null) && (fwkNobuildTestTMD != null)) {
-					break;
-				}
-			}
-			
-			if((fwkTestTMD == null) || (propTMD == null) || (fwkNobuildTestTMD == null)) {
-				// Can't run the tests
-				monitor.subTask("Cannot run VALFWK02 because the test case is missing for either the VF Test Validator, Properties Validator, or both."); //$NON-NLS-1$
-				return;
-			}
-			
-			try {
-				// Set level to FINEST so that the launch validators are accumulated in ValidationOperation.
-				// (See ValidationOperation::getLaunchedValidators())
-				ValidationPlugin.getPlugin().getMsgLogger().setLevel(Level.FINEST); 
-				
-				getBuffer().write("testPropNotOverride"); //$NON-NLS-1$
-				int allowPass = testPropNotOverride(monitor, project, gconf, pconf, propTMD);
-				getBuffer().write(NEWLINE); //$NON-NLS-1$
-				getBuffer().write("testPropOverride"); //$NON-NLS-1$
-				int propPass = testPropOverride(monitor, project, gconf, pconf, fwkTestTMD);
-				getBuffer().write(NEWLINE); //$NON-NLS-1$
-				getBuffer().write("testPrefNotAllowOverride"); //$NON-NLS-1$
-				int notAllowPass = testPrefNotAllowOverride(monitor, project, gconf, pconf, propTMD);
-				StringBuffer result = new StringBuffer(NEWLINE);
-				result.append("Properties Doesn't Override: "); //$NON-NLS-1$
-				result.append(allowPass);
-				result.append(" of 7 pass."); //$NON-NLS-1$
-				result.append(NEWLINE);
-				result.append("Properites Overrides: "); //$NON-NLS-1$
-				result.append(propPass);
-				result.append(" of 7 pass."); //$NON-NLS-1$
-				result.append(NEWLINE);
-				result.append("Preference Doesn't Allow Override: "); //$NON-NLS-1$
-				result.append(notAllowPass);
-				result.append(" of 7 pass."); //$NON-NLS-1$
-				result.append(NEWLINE);
-				monitor.subTask(result.toString());
-				getBuffer().write(NEWLINE); //$NON-NLS-1$
-				getBuffer().write(result.toString());
-			}
-			finally {
-				gconf = origGconf;
-				gconf.passivate();
-				
-				pconf = origPconf;
-				pconf.passivate();
-				
-				JDTUtility.setAutoBuild(autoBuildEnabled);
-	
-				ValidationPlugin.getPlugin().getMsgLogger().setLevel(level);
-			}
-		}
-		catch(InvocationTargetException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-		}
-		catch(Throwable exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-		}
-	}
-	
-	private static void debug(IBuffer buffer, String title, ValidatorMetaData[] enabledValidators) {
-		buffer.write("Contents of " + title); //$NON-NLS-1$
-		for(int i=0; i<enabledValidators.length; i++) {
-			ValidatorMetaData vmd = enabledValidators[i];
-			buffer.write("\t" + vmd.getValidatorDisplayName()); //$NON-NLS-1$
-		}
-		buffer.write("End contents of " + title); //$NON-NLS-1$
-		buffer.write(NEWLINE); //$NON-NLS-1$
-	}
-	
-	
-	private int testPropNotOverride(final IProgressMonitor monitor, final IProject project, GlobalConfiguration gconf, ProjectConfiguration pconf, ValidatorTestcase tmd) {
-		int numPass = 0;
-		try {
-			// Set up the user configuration for the test. The run(IProgressMonitor) method
-			// will set the values back to what they were before the test.		
-			gconf.setCanProjectsOverride(true);
-			gconf.passivate();
-			pconf.setDoesProjectOverride(false);
-			pconf.passivate();
-			
-			ValidatorManager.getManager().updateTaskList(project); // Update the task list because the preference and properties page do, so the configuration classes don't.
-			
-			debug(getBuffer(), "Enabled Properties Validators", pconf.getEnabledValidators()); //$NON-NLS-1$
-			debug(getBuffer(), "Enabled Preference Validators", gconf.getEnabledValidators()); //$NON-NLS-1$
-	
-			numPass = validate(monitor, project, gconf, tmd, "testPropNotOverride"); //$NON-NLS-1$
-		}
-		catch(InvocationTargetException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-			numPass = 0;
-		}
-		catch(Throwable exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-			numPass = 0;
-		}
-		
-			return numPass;
-	}
-	
-	
-	private int testPropOverride(final IProgressMonitor monitor, final IProject project, GlobalConfiguration gconf, ProjectConfiguration pconf, ValidatorTestcase tmd) {
-		int numPass = 0;
-		try {
-			// Set up the user configuration for the test. The run(IProgressMonitor) method
-			// will set the values back to what they were before the test.		
-			gconf.setCanProjectsOverride(true);
-			gconf.passivate();
-			pconf.setDoesProjectOverride(true);
-			pconf.passivate();
-
-			ValidatorManager.getManager().updateTaskList(project); // Update the task list because the preference and properties page do, so the configuration classes don't.
-			
-			debug(getBuffer(), "Enabled Properties Validators", pconf.getEnabledValidators()); //$NON-NLS-1$
-			debug(getBuffer(), "Enabled Preference Validators", gconf.getEnabledValidators()); //$NON-NLS-1$
-	
-			numPass = validate(monitor, project, pconf, tmd, "testPropOverride"); //$NON-NLS-1$
-		}
-		catch(InvocationTargetException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-		}
-		catch(Throwable exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-		}
-		return numPass;
-	}
-	
-	private int testPrefNotAllowOverride(final IProgressMonitor monitor, final IProject project, GlobalConfiguration gconf, ProjectConfiguration pconf, ValidatorTestcase tmd) {
-		int numPass = 0;
-		try {
-			// Set up the user configuration for the test. The run(IProgressMonitor) method
-			// will set the values back to what they were before the test.		
-			gconf.setCanProjectsOverride(false);
-			gconf.passivate();
-			pconf.setDoesProjectOverride(true);
-			pconf.passivate();
-
-			ValidatorManager.getManager().updateTaskList(project); // Update the task list because the preference and properties page do, so the configuration classes don't.
-			
-			debug(getBuffer(), "Enabled Properties Validators", pconf.getEnabledValidators()); //$NON-NLS-1$
-			debug(getBuffer(), "Enabled Preference Validators", gconf.getEnabledValidators()); //$NON-NLS-1$
-	
-			numPass = validate(monitor, project, gconf, tmd, "testPrefNotAllowOverride"); //$NON-NLS-1$
-		}
-		catch(InvocationTargetException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-		}
-		catch(Throwable exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-		}
-		return numPass;
-	}
-	
-	private int validate(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf, ValidatorTestcase tmd, String testName) {
-		int numPass = 0;
-		boolean successful = true; // Assume that all of the test cases will pass.
-		try {
-			// For the first four tests, need all of the messages to be reported
-			int originalLimit = vconf.getMaximumNumberOfMessages();
-			vconf.setMaximumNumberOfMessages(WorkbenchReporter.NO_MESSAGE_LIMIT);
-			vconf.passivate();
-			
-			boolean pass = runValidation(monitor, project, vconf);
-			if(!pass) {
-//				getBuffer().write(testName + "::runValidation failed"); //$NON-NLS-1$
-				successful = false;
-			}
-			else {
-				numPass++;
-//				getBuffer().write(testName + "::runValidation passed"); //$NON-NLS-1$
-			}
-			getBuffer().addExecutionStatus(getName(), "::" + testName + "runValidation", pass); //$NON-NLS-1$ //$NON-NLS-2$
-			
-			pass = fullBuildValidate(monitor, project, vconf, tmd);
-			if(!pass) {
-//				getBuffer().write(testName + "::fullBuildValidation failed"); //$NON-NLS-1$
-				successful = false;
-			}
-			else {
-				numPass++;
-//				getBuffer().write(testName + "::fullBuildValidation passed"); //$NON-NLS-1$
-			}
-			getBuffer().addExecutionStatus(getName(), "::" + testName + "fullBuildValidation", pass); //$NON-NLS-1$ //$NON-NLS-2$
-			
-			pass = autoValidateEnabled(monitor, project, vconf, tmd);
-			if(!pass) {
-				successful = false;
-//				getBuffer().write(testName + "::autoValidateEnabled failed"); //$NON-NLS-1$
-			}
-			else {
-				numPass++;
-//				getBuffer().write(testName + "::autoValidateEnabled passed"); //$NON-NLS-1$
-			}
-			getBuffer().addExecutionStatus(getName(), "::" + testName + "autoValidateEnabled", pass); //$NON-NLS-1$ //$NON-NLS-2$
-			
-			pass = autoValidateDisabled(monitor, project, vconf, tmd);
-			if(!pass) {
-//				getBuffer().write(testName + "::autoValidateDisabled failed"); //$NON-NLS-1$
-				successful = false;
-			}
-			else {
-				numPass++;
-//				getBuffer().write(testName + "::autoValidateDisabled passed"); //$NON-NLS-1$
-			}
-			getBuffer().addExecutionStatus(getName(), "::" + testName + "autoValidateDisabled", pass); //$NON-NLS-1$ //$NON-NLS-2$
-			
-			pass = buildValidateEnabled(monitor, project, vconf, tmd);
-			if(!pass) {
-//				getBuffer().write(testName + "::buildValidateEnabled failed"); //$NON-NLS-1$
-				successful = false;
-			}
-			else {
-				numPass++;
-//				getBuffer().write(testName + "::buildValidateEnabled passed"); //$NON-NLS-1$
-			}
-			getBuffer().addExecutionStatus(getName(), "::" + testName + "buildValidateEnabled", pass); //$NON-NLS-1$ //$NON-NLS-2$
-
-			pass = buildValidateDisabled(monitor, project, vconf, tmd);
-			if(!pass) {
-//				getBuffer().write(testName + "::buildValidateDisabled failed"); //$NON-NLS-1$
-				successful = false;
-			}
-			else {
-				numPass++;
-//				getBuffer().write(testName + "::buildValidateDisabled passed"); //$NON-NLS-1$
-			}
-			getBuffer().addExecutionStatus(getName(), "::" + testName + "buildValidateDisabled", pass); //$NON-NLS-1$ //$NON-NLS-2$
-
-			// And for this test, the original limit needs to be enforced
-			vconf.setMaximumNumberOfMessages(originalLimit);
-			vconf.passivate();
-
-			pass = maxMessagesReported(monitor, project, vconf);
-			if(!pass) {
-				successful = false;
-//				getBuffer().write(testName + "::maxMessagesReported failed"); //$NON-NLS-1$
-			}
-			else {
-				numPass++;
-//				getBuffer().write(testName + "::maxMessagesReported passed"); //$NON-NLS-1$
-			}
-			getBuffer().addExecutionStatus(getName(), "::" + testName + "maxMessagesReported", pass); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		catch(InvocationTargetException exc) {
-			successful = false;
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-		}
-		finally {
-			getBuffer().addExecutionStatus(getName(), testName, successful); //$NON-NLS-1$
-		}
-		return numPass;
-	}
-	
-	private boolean runValidation(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf) {
-		boolean passed = true;
-		try {
-			// Unlike the other validations, which rely on a build, this method has access to the
-			// operation and can query it for the list of validators that were launched. This technique
-			// is better because it doesn't rely on the validator producing the correct output (markers).
-			// VALFWK02 just wants to check that the correct validators were launched; the TestOpConstr
-			// test wants to check the result given different output and constructor of the Operation.
-			
-			EnabledValidatorsOperation validOp = new EnabledValidatorsOperation(project, vconf.runAsync());
-			ResourcesPlugin.getWorkspace().run(validOp, monitor);
-			// Launched validators should be configured, enabled, and had files to validate on the project.
-			Set launchedValidators = validOp.getLaunchedValidators();
-			
-			// Since a full validation was run, the launched validators should be equivalent
-			// to the configured enabled valdiators.
-			ValidatorMetaData[] enabledValidators = vconf.getEnabledValidators();
-			for(int i=0; i<enabledValidators.length; i++) {
-				ValidatorMetaData vmd = enabledValidators[i];
-				
-				// If it's configured on the project, ensure that the enabled validator was launched.
-				// (May not be configured if the enabled validators is the list of Preference enabled
-				// validators.)
-				if(!launchedValidators.contains(vmd)) {
-					getBuffer().write("ERROR: Expected validator " + vmd.getValidatorDisplayName() + " was not run on project " + project.getName() + ". Failing test."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					passed = false;
-				}
-				else {
-					getBuffer().write("INFO: Expected validator " + vmd.getValidatorDisplayName() + " ran as expected on project " + project.getName() + "."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-			}
-			
-			if(passed == false) {
-				getBuffer().write("launched validators are the following:"); //$NON-NLS-1$
-				Iterator iterator = launchedValidators.iterator();
-				while(iterator.hasNext()) {
-					ValidatorMetaData vmd = (ValidatorMetaData)iterator.next();
-					getBuffer().write("\t" + vmd.getValidatorDisplayName()); //$NON-NLS-1$
-				}
-				getBuffer().write("end of launched validators"); //$NON-NLS-1$
-			}
-		}
-		catch(CoreException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-			passed = false;
-		}
-		catch(InvocationTargetException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-		}
-		
-		
-		return passed;
-	}
-	
-	private boolean fullBuildValidate(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf, ValidatorTestcase tmd) {
-		try {
-			vconf.setBuildValidate(true);
-			vconf.passivate();
-
-			TaskListUtility.removeAllTasks(project);
-			IResource[] changedResources = tmd.getResources(project);;
-			TestOpConstrInputOperation.touch(project, changedResources);
-			
-			project.build(IncrementalProjectBuilder.FULL_BUILD, monitor);
-			IMarker[] messagesAfterBuild = TaskListUtility.getValidationTasks(project, IMessage.ALL_MESSAGES);
-			
-			return BVTRunner.singleton().compare(getBuffer(), getName(), tmd.getName(), tmd.getMessages(ValidationTypeEnum.FULL_VALIDATION), messagesAfterBuild);
-		}
-		catch(CoreException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-			return false;
-		}
-		catch(InvocationTargetException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-			return false;
-		}
-	}
-	
-	private boolean autoValidateEnabled(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf, ValidatorTestcase tmd) {
-		JDTUtility.setAutoBuild(true);
-		
-		try {
-			vconf.setAutoValidate(true);
-			vconf.passivate();
-			
-			TaskListUtility.removeAllTasks(project);
-			IResource[] changedResources = tmd.getResources(project);;
-			TestOpConstrInputOperation.touch(project, changedResources);
-			
-			project.build(IncrementalProjectBuilder.AUTO_BUILD, monitor);
-			IMarker[] messagesAfterBuild = TaskListUtility.getValidationTasks(project, IMessage.ALL_MESSAGES);
-			
-			return BVTRunner.singleton().compare(getBuffer(), getName(), tmd.getName(), tmd.getMessages(ValidationTypeEnum.AUTO_VALIDATION), messagesAfterBuild);
-		}
-		catch(CoreException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-			return false;
-		}
-		catch(InvocationTargetException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-			return false;
-		}
-	}
-	
-	private boolean autoValidateDisabled(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf, ValidatorTestcase tmd) {
-		JDTUtility.setAutoBuild(true);
-
-		try {		
-			vconf.setAutoValidate(false);
-			vconf.passivate();
-
-			TaskListUtility.removeAllTasks(project);
-			IResource[] changedResources = tmd.getResources(project);
-			TestOpConstrInputOperation.touch(project, changedResources);
-		
-			project.build(IncrementalProjectBuilder.AUTO_BUILD, monitor);
-			IMarker[] messagesAfterBuild = TaskListUtility.getValidationTasks(project, IMessage.ALL_MESSAGES);
-			
-			// Pass in an empty list because the validation isn't supposed to run.
-			return BVTRunner.singleton().compare(getBuffer(), getName(), tmd.getName(), Collections.EMPTY_LIST, messagesAfterBuild);
-		}
-		catch(CoreException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-			return false;
-		}
-		catch(InvocationTargetException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-			return false;
-		}
-	}
-	
-	private boolean buildValidateEnabled(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf, ValidatorTestcase tmd) {
-		try {
-			vconf.setBuildValidate(true);
-			vconf.passivate();
-			JDTUtility.setAutoBuild(false);
-	
-			// Construct the input
-			TaskListUtility.removeAllTasks(project);
-			IResource[] changedResources = tmd.getResources(project);
-			TestOpConstrInputOperation.touch(project, changedResources);
-			try {		
-				project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor);
-			}
-			catch(CoreException exc) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, exc);
-				}
-				return false;
-			}
-			IMarker[] messagesAfterBuild = TaskListUtility.getValidationTasks(project, IMessage.ALL_MESSAGES);
-			
-			return BVTRunner.singleton().compare(getBuffer(), getName(), tmd.getName(), tmd.getMessages(ValidationTypeEnum.INCREMENTAL_VALIDATION), messagesAfterBuild);
-		}
-		catch(InvocationTargetException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-			return false;
-		}
-	}
-	
-	private boolean buildValidateDisabled(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf, ValidatorTestcase tmd) {
-		try {
-			vconf.setBuildValidate(false);
-			vconf.passivate();
-			JDTUtility.setAutoBuild(false);
-			
-			// Construct the input
-			TaskListUtility.removeAllTasks(project);
-			IResource[] changedResources = tmd.getResources(project);
-			TestOpConstrInputOperation.touch(project, changedResources);
-			try {		
-				project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor);
-				IMarker[] messagesAfterBuild = TaskListUtility.getValidationTasks(project, IMessage.ALL_MESSAGES);
-
-				// Pass in an empty list because validation isn't supposed to run.				
-				return BVTRunner.singleton().compare(getBuffer(), getName(), tmd.getName(), Collections.EMPTY_LIST, messagesAfterBuild);
-			}
-			catch(CoreException exc) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, exc);
-				}
-				return false;
-			}
-		}
-		catch(InvocationTargetException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-			return false;
-		}
-	}
-	
-	private boolean maxMessagesReported(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf) {
-		try {
-			EnabledValidatorsOperation validOp = null;
-			try {
-				validOp = new EnabledValidatorsOperation(project, vconf.runAsync());
-				ResourcesPlugin.getWorkspace().run(validOp, monitor);
-			}
-			catch(CoreException exc) {
-				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-				if(logger.isLoggingLevel(Level.SEVERE)) {
-					logger.write(Level.SEVERE, exc);
-				}
-				return false;
-			}
-			
-			IMarker[] messages = TaskListUtility.getValidationTasks(project, IMessage.ALL_MESSAGES);
-			if(messages.length <= vconf.getMaximumNumberOfMessages()+1) { // add one for the IWAD3000 message, i.e., "Validation was terminated because the maximum number of messages ..."
-				return true;
-			}
-			
-			return false;
-		}
-		catch(InvocationTargetException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-				if(exc.getTargetException() != null) {
-					logger.write(Level.SEVERE, exc.getTargetException());
-				}
-			}
-			return false;
-		}
-	}
-}
-
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkNoBuildTestHelper.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkNoBuildTestHelper.java
deleted file mode 100644
index b8e9b06..0000000
--- a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkNoBuildTestHelper.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package org.eclipse.jst.validation.test.fwk.validator;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceVisitor;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.java.JavaHelpers;
-import org.eclipse.jst.j2ee.internal.validation.AWorkbenchMOFHelper;
-import org.eclipse.wst.validation.internal.core.IFileDelta;
-import org.eclipse.wst.validation.internal.operations.WorkbenchFileDelta;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-public class FwkNoBuildTestHelper extends AWorkbenchMOFHelper {
-	
-	public FwkNoBuildTestHelper() {
-		super();
-		
-		registerModel(FwkTestValidator.ALL_FILES, "loadAllFiles"); //$NON-NLS-1$
-		registerModel(FwkTestValidator.JAVAHELPERS, "loadJavaHelpers", new Class[]{IFileDelta.class}); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.etools.validate.IWorkbenchHelper#getTargetObjectName(java.lang.Object)
-	 */
-	public String getTargetObjectName(Object arg0) {
-		// No target objects outside of an IResource are used, therefore no target object names are needed.
-		return null;
-	}
-
-	public IFileDelta[] loadAllFiles() {
-		IProject project = getProject();
-		
-		final Set files = new HashSet();
-		IResourceVisitor visitor = new IResourceVisitor() {
-			public boolean visit(IResource res) throws CoreException {
-				if(!res.isAccessible()) {
-					return false; // if the resource isn't accessible then neither are its children
-				}
-				
-				if((res instanceof IFile) && (res.getFileExtension().equals("java"))) { //$NON-NLS-1$
-					WorkbenchFileDelta newFileDelta = new WorkbenchFileDelta(res.getFullPath().toString(), IFileDelta.CHANGED, res);
-					files.add(newFileDelta);
-				}
-
-				return true; // visit the resource's children as well
-			}
-		};
-
-		try {
-			project.accept(visitor, IResource.DEPTH_INFINITE, true); // true means include phantom resources
-		}
-		catch(CoreException exc) {
-			exc.printStackTrace();
-		}
-		
-		IFileDelta[] result = new IFileDelta[files.size()];
-		files.toArray(result);
-		return result;
-	}
-	
-	public JavaHelpers loadJavaHelpers(IFileDelta delta) {
-		WorkbenchFileDelta fd = (WorkbenchFileDelta)delta;
-		IResource result = fd.getResource();
-		if(result != null){
-			if(result instanceof IFile) {
-				return JDTUtility.getJavaHelpers((IFile)result);
-			}
-			else {
-				return null;
-			}
-		}
-		else {
-			// This validator validates only .java files, so this
-			// must be an instanceof JavaClass.
-			return (JavaHelpers)fd.getObject();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.etools.validate.IWorkbenchHelper#getResource(java.lang.Object)
-	 */
-	public IResource getResource(Object object) {
-		IResource result = super.getResource(object);
-		if((result != null) && (result.exists())) {
-			return result;
-		}
-		
-		if (object == null) {
-			return null;
-		}
-
-		if(object instanceof JavaHelpers) {
-			// If the message was added to a JavaHelpers, this method will be called.
-			return JDTUtility.getResource(getProject(), (JavaHelpers) object);
-		}
-		else if(object instanceof WorkbenchFileDelta) {
-			// If the workbench is removing messages from files, and the object is set
-			// instead of the IResource, need to process the delta's object instead of
-			// its resource.
-			return JDTUtility.getResource(getProject(), (JavaHelpers)((WorkbenchFileDelta)object).getObject());
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.etools.validate.AWorkbenchHelper#getLineNo(java.lang.Object)
-	 */
-	public int getLineNo(Object object) {
-		int lineNo = super.getLineNo(object);
-		if(lineNo == IMessage.LINENO_UNSET) {
-			// No adapters, so fudge the line number by adding the message to the first line in the file.
-			return 1;
-		}
-		return lineNo;
-	}
-
-}
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkNoBuildTestValidator.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkNoBuildTestValidator.java
deleted file mode 100644
index 18242f0..0000000
--- a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkNoBuildTestValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.eclipse.jst.validation.test.fwk.validator;
-
-import org.eclipse.jem.java.JavaHelpers;
-import org.eclipse.wst.validation.internal.core.IFileDelta;
-import org.eclipse.wst.validation.internal.core.ValidationException;
-import org.eclipse.wst.validation.internal.operations.LocalizedMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-
-public class FwkNoBuildTestValidator implements IValidator {
-	public static final String ALL_FILES = "ALL_FILES"; // Load all IFileDeltas for the entire contents of the current project. //$NON-NLS-1$
-	public static final String JAVAHELPERS = "JAVAHELPERS"; // The JavaClass that the IFileDelta maps to. //$NON-NLS-1$
-
-	/* (non-Javadoc)
-	 * @see com.ibm.etools.validation.IValidator#cleanup(com.ibm.etools.validation.IReporter)
-	 */
-	public void cleanup(IReporter reporter) {
-		// Nothing is cached, so nothing to do.
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.etools.validation.IValidator#validate(com.ibm.etools.validation.IHelper, com.ibm.etools.validation.IReporter, com.ibm.etools.validation.IFileDelta[])
-	 */
-	public void validate(IValidationContext helper, IReporter reporter) throws ValidationException {
-		IFileDelta[] delta = null ;
-		if((delta == null) || (delta.length ==0)) {
-			// Full Validate
-			delta = (IFileDelta[])helper.loadModel(ALL_FILES);
-		}
-		
-		if(delta == null) {
-			// Problem loading the files
-			return;
-		}
-		
-		for(int i=0; i<delta.length; i++) {
-			JavaHelpers target = (JavaHelpers)helper.loadModel(JAVAHELPERS, new Object[]{delta[i]});
-			LocalizedMessage message = new LocalizedMessage(IMessage.LOW_SEVERITY, "This is a test message for the validation framework, reported by VF NoBuild Test Validator. Please ignore.", target); //$NON-NLS-1$
-			reporter.addMessage(this, message);
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkTestHelper.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkTestHelper.java
deleted file mode 100644
index 4274e55..0000000
--- a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkTestHelper.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package org.eclipse.jst.validation.test.fwk.validator;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceVisitor;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.java.JavaHelpers;
-import org.eclipse.jst.j2ee.internal.validation.AWorkbenchMOFHelper;
-import org.eclipse.wst.validation.internal.core.IFileDelta;
-import org.eclipse.wst.validation.internal.operations.WorkbenchFileDelta;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-public class FwkTestHelper extends AWorkbenchMOFHelper {
-	
-	public FwkTestHelper() {
-		super();
-		
-		registerModel(FwkTestValidator.ALL_FILES, "loadAllFiles"); //$NON-NLS-1$
-		registerModel(FwkTestValidator.JAVAHELPERS, "loadJavaHelpers", new Class[]{IFileDelta.class}); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.etools.validate.IWorkbenchHelper#getTargetObjectName(java.lang.Object)
-	 */
-	public String getTargetObjectName(Object arg0) {
-		// No target objects outside of an IResource are used, therefore no target object names are needed.
-		return null;
-	}
-
-	public IFileDelta[] loadAllFiles() {
-		IProject project = getProject();
-		
-		final Set files = new HashSet();
-		IResourceVisitor visitor = new IResourceVisitor() {
-			public boolean visit(IResource res) throws CoreException {
-				if(!res.isAccessible()) {
-					return false; // if the resource isn't accessible then neither are its children
-				}
-				
-				if((res instanceof IFile) && ( (res.getFileExtension() != null) && res.getFileExtension().equals("java"))) { //$NON-NLS-1$
-					WorkbenchFileDelta newFileDelta = new WorkbenchFileDelta(res.getFullPath().toString(), IFileDelta.CHANGED, res);
-					files.add(newFileDelta);
-				}
-
-				return true; // visit the resource's children as well
-			}
-		};
-
-		try {
-			project.accept(visitor, IResource.DEPTH_INFINITE, true); // true means include phantom resources
-		}
-		catch(CoreException exc) {
-			exc.printStackTrace();
-		}
-		
-		IFileDelta[] result = new IFileDelta[files.size()];
-		files.toArray(result);
-		return result;
-	}
-	
-	public JavaHelpers loadJavaHelpers(IFileDelta delta) {
-		WorkbenchFileDelta fd = (WorkbenchFileDelta)delta;
-		IResource result = fd.getResource();
-		if(result != null){
-			if(result instanceof IFile) {
-				return JDTUtility.getJavaHelpers((IFile)result);
-			}
-			else {
-				return null;
-			}
-		}
-		else {
-			// This validator validates only .java files, so this
-			// must be an instanceof JavaClass.
-			return (JavaHelpers)fd.getObject();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.etools.validate.IWorkbenchHelper#getResource(java.lang.Object)
-	 */
-	public IResource getResource(Object object) {
-		IResource result = super.getResource(object);
-		if((result != null) && (result.exists())) {
-			return result;
-		}
-		
-		if (object == null) {
-			return null;
-		}
-
-		if(object instanceof JavaHelpers) {
-			// If the message was added to a JavaHelpers, this method will be called.
-			return JDTUtility.getResource(getProject(), (JavaHelpers) object);
-		}
-		else if(object instanceof WorkbenchFileDelta) {
-			// If the workbench is removing messages from files, and the object is set
-			// instead of the IResource, need to process the delta's object instead of
-			// its resource.
-			return JDTUtility.getResource(getProject(), (JavaHelpers)((WorkbenchFileDelta)object).getObject());
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.etools.validate.AWorkbenchHelper#getLineNo(java.lang.Object)
-	 */
-	public int getLineNo(Object object) {
-		int lineNo = super.getLineNo(object);
-		if(lineNo == IMessage.LINENO_UNSET) {
-			// No adapters, so fudge the line number by adding the message to the first line in the file.
-			return 1;
-		}
-		return lineNo;
-	}
-
-}
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkTestValidator.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkTestValidator.java
deleted file mode 100644
index 6d1fabd..0000000
--- a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkTestValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.eclipse.jst.validation.test.fwk.validator;
-
-import org.eclipse.jem.java.JavaHelpers;
-import org.eclipse.wst.validation.internal.core.IFileDelta;
-import org.eclipse.wst.validation.internal.core.ValidationException;
-import org.eclipse.wst.validation.internal.operations.LocalizedMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-
-public class FwkTestValidator implements IValidator {
-	public static final String ALL_FILES = "ALL_FILES"; // Load all IFileDeltas for the entire contents of the current project. //$NON-NLS-1$
-	public static final String JAVAHELPERS = "JAVAHELPERS"; // The JavaClass that the IFileDelta maps to. //$NON-NLS-1$
-
-	/* (non-Javadoc)
-	 * @see com.ibm.etools.validation.IValidator#cleanup(com.ibm.etools.validation.IReporter)
-	 */
-	public void cleanup(IReporter reporter) {
-		// Nothing is cached, so nothing to do.
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.etools.validation.IValidator#validate(com.ibm.etools.validation.IHelper, com.ibm.etools.validation.IReporter, com.ibm.etools.validation.IFileDelta[])
-	 */
-	public void validate(IValidationContext helper, IReporter reporter) throws ValidationException {
-		IFileDelta[] delta = null;
-		if((delta == null) || (delta.length ==0)) {
-			// Full Validate
-			delta = (IFileDelta[])helper.loadModel(ALL_FILES);
-		}
-		
-		if(delta == null) {
-			// Problem loading the files
-			return;
-		}
-		
-		for(int i=0; i<delta.length; i++) {
-			JavaHelpers target = (JavaHelpers)helper.loadModel(JAVAHELPERS, new Object[]{delta[i]});
-			LocalizedMessage message = new LocalizedMessage(IMessage.LOW_SEVERITY, "This is a test message for the validation framework, reported by VF Test Validator. Please ignore.", target); //$NON-NLS-1$
-			reporter.addMessage(this, message);
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/JDTUtility.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/JDTUtility.java
deleted file mode 100644
index 7396f1c..0000000
--- a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/JDTUtility.java
+++ /dev/null
@@ -1,318 +0,0 @@
-package org.eclipse.jst.validation.test.fwk.validator;
-
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jem.internal.plugin.JavaEMFNature;
-import org.eclipse.jem.java.JavaHelpers;
-import org.eclipse.jem.java.JavaRefFactory;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jst.validation.test.BVTValidationPlugin;
-import org.eclipse.jst.validation.test.fwk.TestOpConstrInputOperation;
-import org.eclipse.jst.validation.test.internal.registry.BVTValidationRegistryReader;
-import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
-
-
-/**
- * This class contains some utility methods used to 
- * access, manipulate, etc. jdt types.
- */
-public final class JDTUtility {
-	private JDTUtility() {
-		// Do not need any instances of this class.
-	}
-	
-	/**
-	 * Return the containers in the given project that contain either
-	 * .java source files or .class binary files.
-	 */
-	public static IContainer[] getJavaContainers(IJavaProject jp) {
-		if (jp == null) {
-			return null;
-		}
-
-		IProject project = jp.getProject();
-		IClasspathEntry[] classpath = null;
-		try {
-			classpath = jp.getResolvedClasspath(true); // true means ignore unresolved (missing) variables, instead of throwing an exception
-		}
-		catch (JavaModelException exc) {
-			exc.printStackTrace();
-			return null;
-		}
-
-		if (classpath == null) {
-			return null;
-		}
-
-		// Traverse the classpath, and calculate a list of just the 
-		// IFolders and IProjects (i.e., IContainers) that contain source
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		IContainer[] icontainers = new IContainer[classpath.length];
-		int validCount = 0;
-		for (int i = 0; i < classpath.length; i++) {
-			IClasspathEntry entry = classpath[i];
-			if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
-				IResource res = root.findMember(entry.getPath());
-				if(res == null) {
-					// not in the workspace
-					continue;
-				}
-
-				if(!res.getProject().equals(project)) {
-					// in a different project
-					continue;
-				}				
-
-				if (res instanceof IContainer) {
-					icontainers[validCount++] = (IContainer) res;
-				}
-			}
-		}
-
-		try {
-			IContainer outputContainer = (IContainer)root.findMember(jp.getOutputLocation());
-			IContainer[] containers = null;
-			if(outputContainer == null) {
-				containers = new IContainer[validCount];
-			}
-			else if(outputContainer.getProject().equals(project)) {
-				containers = new IContainer[validCount+1];
-				containers[validCount] = outputContainer;
-			}
-			else {
-				containers = new IContainer[validCount];
-			}
-			System.arraycopy(icontainers, 0, containers, 0, validCount);
-			return containers;
-		}
-		catch(JavaModelException exc) {
-			exc.printStackTrace();
-			return null;
-		}
-	}
-	
-	/**
-	 * Return the IType that represents this file, or null if none exists.
-	 */
-	public static IType getType(IContainer[] javaContainers, IFile file) {
-		if(file == null) {
-			return null;
-		}
-		
-		String fileExtension = file.getFileExtension();
-		if(fileExtension == null) {
-			// not a .java or a .class file
-			return null;
-		}
-		
-		if(!(fileExtension.equals("java") || fileExtension.equals("class"))) { //$NON-NLS-1$ //$NON-NLS-2$
-			return null;
-		}
-		
-		IProject project = file.getProject();
-		IJavaProject jp = JavaCore.create(project);
-		if(jp == null) {
-			return null;
-		}
-		
-		try {
-			IPath relativePath = getRelativePath(javaContainers, file);
-			if(relativePath == null) {
-				// Not a member of a source or output container
-				return null;
-			}
-
-			IPath packagePath = relativePath.removeLastSegments(1);
-			String packageName = packagePath.toString().replace(IPath.SEPARATOR, '.');
-			String typeName = relativePath.lastSegment();
-			typeName = typeName.substring(0, typeName.length() - fileExtension.length() - 1);
-			String qualifiedName = null;
-			if (packageName.length() > 0) {
-				qualifiedName = packageName + "." + typeName; //$NON-NLS-1$
-			} else {
-				qualifiedName = typeName;
-			}
-			return jp.findType(qualifiedName);
-		}
-		catch(JavaModelException exc) {
-			exc.printStackTrace();
-			return null;
-		}
-	}
-	
-	/**
-	 * Return the IPath of the resource relative to the first container that the
-	 * resource is found in. If the resource is contained in more than one container
-	 * in the array, return the first IPath found. If the resource is not a member
-	 * of any of the containers, return null.
-	 */
-	public static IPath getRelativePath(IContainer[] containers, IResource resource) {
-		for(int i=0; i<containers.length; i++) {
-			IPath path = getRelativePath(containers[i], resource);
-			if(path != null) {
-				return path;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the IPath of a resource relative to the container.
-	 * If the IResource is not a member of the container, return null. 
-	 */
-	public static IPath getRelativePath(IContainer container, IResource resource) {
-		if ((resource == null) || (container == null)) {
-			return null;
-		}
-
-		// Is the path part of the IContainer?
-		int matchingFirstSegments = container.getFullPath().matchingFirstSegments(resource.getFullPath());
-		if(matchingFirstSegments == 0) {
-			return null;
-		}
-		return resource.getFullPath().removeFirstSegments(matchingFirstSegments);
-	}
-	
-	public static JavaHelpers getJavaHelpers(IFile file) {
-		IType type = getType(file);
-		if(type == null) {
-			return null;
-		}
-		
-		return getJavaHelpers(type);
-	}
-	
-	public static IType getType(IFile file) {
-		IJavaProject jp = JavaCore.create(file.getProject());
-		IContainer[] javaContainers = (jp == null) ? null : JDTUtility.getJavaContainers(jp);
-		if(javaContainers != null) {
-			return JDTUtility.getType(javaContainers, file);
-		}
-		return null;
-	}
-
-	public static JavaHelpers getJavaHelpers(IType type) {
-		ResourceSet resourceSet = getResourceSet(type);
-		if(resourceSet == null) {
-			return null;
-		}
-		return JavaRefFactory.eINSTANCE.reflectType(type.getFullyQualifiedName(), resourceSet);
-	}
-	
-	public static ResourceSet getResourceSet(IType type) {
-		JavaEMFNature nature = getNature(type);
-		if(nature == null) {
-			return null;
-		}
-		return nature.getResourceSet();
-	}
-
-	public static JavaEMFNature getNature(IType type) {
-		IJavaProject jp = type.getJavaProject();
-		IProject project = jp.getProject();
-		
-		try {
-			JavaEMFNature nature = JavaEMFNature.createRuntime(project);
-			return nature;
-		}
-		catch(CoreException exc) {
-			exc.printStackTrace();
-			return null;
-		}
-	}
-
-	public static IResource getResource(IProject project, JavaHelpers clazz) {
-		IType type = getType(project, clazz);
-		return type.getResource();
-	}
-
-	public static IType getType(IProject project, JavaHelpers clazz) {
-		if(clazz == null) {
-			return null;
-		}
-		
-		String fullyQualifiedName = clazz.getJavaName();
-		IJavaProject jp = JavaCore.create(project);
-		try {
-			return jp.findType(fullyQualifiedName);
-		}
-		catch(JavaModelException exc) {
-			exc.printStackTrace();
-			return null;
-		}
-	}
-
-	/**
-	 * Return the three validator test cases used to test the validation framework.
-	 */
-	public static ValidatorTestcase[] getVFTests(IProgressMonitor monitor, IProject project) {
-		ValidatorTestcase[] tmds = BVTValidationRegistryReader.getReader().getAllValidatorTests(monitor, project);
-		if((tmds == null) || (tmds.length == 0)) {
-			return new ValidatorTestcase[0];
-		}
-		
-		ValidatorTestcase fwkNobuildTestTMD = null;
-		ValidatorTestcase fwkTestTMD = null;
-		ValidatorTestcase propTMD = null;
-		ValidatorTestcase[] result = new ValidatorTestcase[3];
-		int count = 0;
-		for(int i=0; i<tmds.length; i++) {
-			ValidatorTestcase tmd = tmds[i];
-			if(tmd.getValidatorClass().equals(TestOpConstrInputOperation.FWK_TEST_VALIDATOR_CLASS)) {
-				fwkTestTMD = tmd;
-				result[count++] = tmd;
-			}
-			else if(tmd.getValidatorClass().equals(TestOpConstrInputOperation.PROPERTIES_VALIDATOR_CLASS)) {
-				propTMD = tmd;
-				result[count++] = tmd;
-			}
-			else if(tmd.getValidatorClass().equals(TestOpConstrInputOperation.FWK_NOBUILD_TEST_VALIDATOR_CLASS)) {
-				fwkNobuildTestTMD = tmd;
-				result[count++] = tmd;
-			}
-			
-			if((fwkTestTMD != null) && (propTMD != null) && (fwkNobuildTestTMD != null)) {
-				break;
-			}
-		}
-		
-		if(count != result.length) {
-			// On this project, not all of the test validators are used.
-			ValidatorTestcase[] r = new ValidatorTestcase[count];
-			System.arraycopy(result, 0, r, 0, count);
-			return r;
-		}
-
-		return result;
-	}
-
-	public static void setAutoBuild(boolean autoBuildEnabled) {
-		try {
-			IWorkspaceDescription desc = ResourcesPlugin.getWorkspace().getDescription();
-			desc.setAutoBuilding(autoBuildEnabled);
-			ResourcesPlugin.getWorkspace().setDescription(desc);
-		}
-		catch(CoreException exc) {
-			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
-			if(logger.isLoggingLevel(Level.SEVERE)) {
-				logger.write(Level.SEVERE, exc);
-			}
-		}
-	}
-}
diff --git a/tests/org.eclipse.jst.validation.test/testInput/FWK/BVT/opConstr.jar b/tests/org.eclipse.jst.validation.test/testInput/FWK/BVT/opConstr.jar
deleted file mode 100644
index de4b037..0000000
--- a/tests/org.eclipse.jst.validation.test/testInput/FWK/BVT/opConstr.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.jst.validation.test/testInput/Properties/aProperties.jar b/tests/org.eclipse.jst.validation.test/testInput/Properties/aProperties.jar
deleted file mode 100644
index 096f4ce..0000000
--- a/tests/org.eclipse.jst.validation.test/testInput/Properties/aProperties.jar
+++ /dev/null
Binary files differ
