diff --git a/assembly/features/org.eclipse.jpt.sdk/.cvsignore b/assembly/features/org.eclipse.jpt.sdk/.cvsignore
deleted file mode 100644
index bc2abf7..0000000
--- a/assembly/features/org.eclipse.jpt.sdk/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-*.bin.dist.zip
-build.xml
-features
-plugins
diff --git a/assembly/features/org.eclipse.jpt.sdk/.project b/assembly/features/org.eclipse.jpt.sdk/.project
deleted file mode 100644
index 821d453..0000000
--- a/assembly/features/org.eclipse.jpt.sdk/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jpt.sdk</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/assembly/features/org.eclipse.jpt.sdk/build.properties b/assembly/features/org.eclipse.jpt.sdk/build.properties
deleted file mode 100644
index 7200939..0000000
--- a/assembly/features/org.eclipse.jpt.sdk/build.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 Oracle.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle. - initial API and implementation
-###############################################################################
-bin.includes = feature.xml,\
-               eclipse_update_120.jpg,\
-               epl-v10.html,\
-               license.html,\
-               feature.properties
diff --git a/assembly/features/org.eclipse.jpt.sdk/eclipse_update_120.jpg b/assembly/features/org.eclipse.jpt.sdk/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/assembly/features/org.eclipse.jpt.sdk/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/assembly/features/org.eclipse.jpt.sdk/epl-v10.html b/assembly/features/org.eclipse.jpt.sdk/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/assembly/features/org.eclipse.jpt.sdk/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/assembly/features/org.eclipse.jpt.sdk/feature.properties b/assembly/features/org.eclipse.jpt.sdk/feature.properties
deleted file mode 100644
index abb0c88..0000000
--- a/assembly/features/org.eclipse.jpt.sdk/feature.properties
+++ /dev/null
@@ -1,145 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 Oracle.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle. - initial API and implementation
-###############################################################################
-# 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=Dali Java Persistence API (JPA) project SDK
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
-
-# "description" property - description of the feature
-description=Dali Java Persistence API (JPA) project SDK
-
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-Copyright (c) 2006 Oracle Corporation.\n\
-All rights reserved. This program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n\
-\n\
-Contributors:\n\
-    Oracle - initial API and implementation\n
-################ end of copyright property ####################################
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-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\
-June 06, 2007\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 structured and packaged into modules to facilitate delivering,\n\
-     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-     plug-in fragments ("Fragments"), and features ("Features").\n\
-   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included 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\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories 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 EPL 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\
-    - Common Development and Distribution License (CDDL) Version 1.0 (available at http://www.sun.com/cddl/cddl.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\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/assembly/features/org.eclipse.jpt.sdk/feature.xml b/assembly/features/org.eclipse.jpt.sdk/feature.xml
deleted file mode 100644
index 4b10e05..0000000
--- a/assembly/features/org.eclipse.jpt.sdk/feature.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jpt.sdk"
-      label="%featureName"
-      version="1.0.0.qualifier"
-      provider-name="%providerName"
-      plugin="org.eclipse.jpt"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <license url="license.html">
-      %license
-   </license>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <url>
-      <update label="%updateSiteName" url="http://download.eclipse.org/webtools/updates"/>
-      <discovery label="Web Tools Platform (WTP) Updates" url="http://download.eclipse.org/webtools/updates"/>
-   </url>
-
-   <includes
-         id="org.eclipse.jpt_sdk.feature"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.jpt"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/assembly/features/org.eclipse.jpt.sdk/license.html b/assembly/features/org.eclipse.jpt.sdk/license.html
deleted file mode 100644
index 76abfb4..0000000
--- a/assembly/features/org.eclipse.jpt.sdk/license.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
-<HTML><HEAD><TITLE>Eclipse.org Software User Agreement</TITLE>
-<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<META content="MSHTML 6.00.2800.1479" name=GENERATOR></HEAD>
-<BODY lang=EN-US vLink=purple link=blue>
-<H2>Eclipse Foundation Software User Agreement</H2>
-<P>June 06, 2007</P>
-<H3>Usage Of Content</H3>
-<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION 
-AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). 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 ("EPL"). 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, "Program" 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 
-("Repository") in CVS modules ("Modules") and made available as downloadable 
-archives ("Downloads").</P>
-<P>Content may be apportioned into plug-ins ("Plug-ins"), plug-in fragments 
-("Fragments"), and features ("Features"). A Feature is a bundle of one or more 
-Plug-ins and/or Fragments and associated material. Files named "feature.xml" 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 "plugins" and Features are located in directories named "features".</P>
-<P>Features may also include other Features ("Included Features"). Files named 
-"feature.xml" 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 "about.html" ("Abouts"). The terms and conditions governing 
-Features and Included Features should be contained in files named "license.html" 
-("Feature Licenses"). 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>Plug-in and Fragment directories 
-  <LI>Subdirectories of the directory named "src" of certain Plug-ins 
-  <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 ("Feature Update 
-License") 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 "license" property of 
-files named "feature.properties". 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>Apache Software License 1.1 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>) 
-
-  <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>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>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>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>
-   
-  <LI>Common Development and Distribution License (CDDL) Version 1.0 (available at <A 
-  href="http://www.sun.com/cddl/cddl.html">http://www.sun.com/cddl/cddl.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/assembly/features/org.eclipse.jpt.tests/.cvsignore b/assembly/features/org.eclipse.jpt.tests/.cvsignore
deleted file mode 100644
index 2544693..0000000
--- a/assembly/features/org.eclipse.jpt.tests/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*.bin.dist.zip
-build.xml
-org.eclipse.jpt.tests_1.0.0.*
\ No newline at end of file
diff --git a/assembly/features/org.eclipse.jpt.tests/.project b/assembly/features/org.eclipse.jpt.tests/.project
deleted file mode 100644
index 3d1dde6..0000000
--- a/assembly/features/org.eclipse.jpt.tests/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jpt.tests</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/assembly/features/org.eclipse.jpt.tests/.settings/org.eclipse.core.resources.prefs b/assembly/features/org.eclipse.jpt.tests/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 17acb65..0000000
--- a/assembly/features/org.eclipse.jpt.tests/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 15:11:05 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/assembly/features/org.eclipse.jpt.tests/build.properties b/assembly/features/org.eclipse.jpt.tests/build.properties
deleted file mode 100644
index 7f47694..0000000
--- a/assembly/features/org.eclipse.jpt.tests/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-bin.includes = feature.xml,\
-               eclipse_update_120.jpg,\
-               epl-v10.html,\
-               license.html,\
-               feature.properties
diff --git a/assembly/features/org.eclipse.jpt.tests/eclipse_update_120.jpg b/assembly/features/org.eclipse.jpt.tests/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/assembly/features/org.eclipse.jpt.tests/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/assembly/features/org.eclipse.jpt.tests/epl-v10.html b/assembly/features/org.eclipse.jpt.tests/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/assembly/features/org.eclipse.jpt.tests/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/assembly/features/org.eclipse.jpt.tests/feature.properties b/assembly/features/org.eclipse.jpt.tests/feature.properties
deleted file mode 100644
index 6b58fe6..0000000
--- a/assembly/features/org.eclipse.jpt.tests/feature.properties
+++ /dev/null
@@ -1,145 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 Oracle.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle. - initial API and implementation
-###############################################################################
-# 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=Dali Java Persistence API (JPA) project Tests
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
-
-# "description" property - description of the feature
-description=Dali Java Persistence API (JPA) project Tests
-
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-Copyright (c) 2006 Oracle Corporation.\n\
-All rights reserved. This program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n\
-\n\
-Contributors:\n\
-    Oracle - initial API and implementation\n
-################ end of copyright property ####################################
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-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\
-June 06, 2007\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 structured and packaged into modules to facilitate delivering,\n\
-     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-     plug-in fragments ("Fragments"), and features ("Features").\n\
-   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included 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\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories 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 EPL 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\
-    - Common Development and Distribution License (CDDL) Version 1.0 (available at http://www.sun.com/cddl/cddl.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\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/assembly/features/org.eclipse.jpt.tests/feature.xml b/assembly/features/org.eclipse.jpt.tests/feature.xml
deleted file mode 100644
index e445c4c..0000000
--- a/assembly/features/org.eclipse.jpt.tests/feature.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jpt.tests"
-      label="%featureName"
-      version="1.0.0.qualifier"
-      provider-name="%providerName">
-
-   <description>
-      %description
-   </description>
-
-   <license url="license.html">
-      %license
-   </license>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <url>
-      <update label="%updateSiteName" url="http://download.eclipse.org/webtools/updates/"/>
-   </url>
-
-   <includes
-         id="org.eclipse.jpt.tests.feature"
-         version="0.0.0"/>
-     
-</feature>
diff --git a/assembly/features/org.eclipse.jpt.tests/license.html b/assembly/features/org.eclipse.jpt.tests/license.html
deleted file mode 100644
index 5644598..0000000
--- a/assembly/features/org.eclipse.jpt.tests/license.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
-<HTML><HEAD><TITLE>Eclipse.org Software User Agreement</TITLE>
-<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<META content="MSHTML 6.00.2800.1479" name=GENERATOR></HEAD>
-<BODY lang=EN-US vLink=purple link=blue>
-<H2>Eclipse Foundation Software User Agreement</H2>
-<P>June 06, 2007</P>
-<H3>Usage Of Content</H3>
-<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION 
-AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). 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 ("EPL"). 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, "Program" 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 
-("Repository") in CVS modules ("Modules") and made available as downloadable 
-archives ("Downloads").</P>
-<P>Content may be apportioned into plug-ins ("Plug-ins"), plug-in fragments 
-("Fragments"), and features ("Features"). A Feature is a bundle of one or more 
-Plug-ins and/or Fragments and associated material. Files named "feature.xml" 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 "plugins" and Features are located in directories named "features".</P>
-<P>Features may also include other Features ("Included Features"). Files named 
-"feature.xml" 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 "about.html" ("Abouts"). The terms and conditions governing 
-Features and Included Features should be contained in files named "license.html" 
-("Feature Licenses"). 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>Plug-in and Fragment directories 
-  <LI>Subdirectories of the directory named "src" of certain Plug-ins 
-  <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 ("Feature Update 
-License") 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 "license" property of 
-files named "feature.properties". 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>Apache Software License 1.1 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>) 
-
-  <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>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>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>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>
-    
-  <LI>Common Development and Distribution License (CDDL) Version 1.0 (available at <A 
-  href="http://www.sun.com/cddl/cddl.html">http://www.sun.com/cddl/cddl.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/assembly/features/org.eclipse.jpt/.cvsignore b/assembly/features/org.eclipse.jpt/.cvsignore
deleted file mode 100644
index de8b73f..0000000
--- a/assembly/features/org.eclipse.jpt/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build.xml
-org.eclipse.jpt_1.0.0.*
diff --git a/assembly/features/org.eclipse.jpt/.project b/assembly/features/org.eclipse.jpt/.project
deleted file mode 100644
index b7aaec2..0000000
--- a/assembly/features/org.eclipse.jpt/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jpt</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/assembly/features/org.eclipse.jpt/build.properties b/assembly/features/org.eclipse.jpt/build.properties
deleted file mode 100644
index 470b4bc..0000000
--- a/assembly/features/org.eclipse.jpt/build.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 Oracle.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle. - initial API and implementation
-###############################################################################
-bin.includes = feature.xml,\
-               eclipse_update_120.jpg,\
-               epl-v10.html,\
-               license.html,\
-               feature.properties
-               
\ No newline at end of file
diff --git a/assembly/features/org.eclipse.jpt/eclipse_update_120.jpg b/assembly/features/org.eclipse.jpt/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/assembly/features/org.eclipse.jpt/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/assembly/features/org.eclipse.jpt/epl-v10.html b/assembly/features/org.eclipse.jpt/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/assembly/features/org.eclipse.jpt/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/assembly/features/org.eclipse.jpt/feature.properties b/assembly/features/org.eclipse.jpt/feature.properties
deleted file mode 100644
index 0ae42bb..0000000
--- a/assembly/features/org.eclipse.jpt/feature.properties
+++ /dev/null
@@ -1,144 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 Oracle.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle. - initial API and implementation
-###############################################################################
-# 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 Persistence API Tools
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
-
-# "description" property - description of the feature
-description=Java Persistence API Tools - Runtime
-
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-Copyright (c) 2006 Oracle Corporation.\n\
-All rights reserved. This program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n\
-\n\
-Contributors:\n\
-    Oracle - initial API and implementation\n
-################ end of copyright property ####################################
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-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\
-March 17, 2005\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 structured and packaged into modules to facilitate delivering,\n\
-     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-     plug-in fragments ("Fragments"), and features ("Features").\n\
-   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included 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\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories 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 EPL 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\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/assembly/features/org.eclipse.jpt/feature.xml b/assembly/features/org.eclipse.jpt/feature.xml
deleted file mode 100644
index fdae561..0000000
--- a/assembly/features/org.eclipse.jpt/feature.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jpt"
-      label="%featureName"
-      version="1.0.0.qualifier"
-      provider-name="%providerName"
-      plugin="org.eclipse.jpt"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <license url="license.html">
-      %license
-   </license>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <url>
-      <update label="%updateSiteName" url="http://download.eclipse.org/webtools/updates"/>
-      <discovery label="Web Tools Platform (WTP) Updates" url="http://download.eclipse.org/webtools/updates"/>
-   </url>
-
-   <includes
-         id="org.eclipse.jpt.feature"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.jpt"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/assembly/features/org.eclipse.jpt/license.html b/assembly/features/org.eclipse.jpt/license.html
deleted file mode 100644
index 2347060..0000000
--- a/assembly/features/org.eclipse.jpt/license.html
+++ /dev/null
@@ -1,93 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
-<HTML><HEAD><TITLE>Eclipse.org Software User Agreement</TITLE>
-<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<META content="MSHTML 6.00.2800.1479" name=GENERATOR></HEAD>
-<BODY lang=EN-US vLink=purple link=blue>
-<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 "CONTENT"). 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 ("EPL"). 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, "Program" 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 
-("Repository") in CVS modules ("Modules") and made available as downloadable 
-archives ("Downloads").</P>
-<P>Content may be apportioned into plug-ins ("Plug-ins"), plug-in fragments 
-("Fragments"), and features ("Features"). A Feature is a bundle of one or more 
-Plug-ins and/or Fragments and associated material. Files named "feature.xml" 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 "plugins" and Features are located in directories named "features".</P>
-<P>Features may also include other Features ("Included Features"). Files named 
-"feature.xml" 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 "about.html" ("Abouts"). The terms and conditions governing 
-Features and Included Features should be contained in files named "license.html" 
-("Feature Licenses"). 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>Plug-in and Fragment directories 
-  <LI>Subdirectories of the directory named "src" of certain Plug-ins 
-  <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 ("Feature Update 
-License") 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 "license" property of 
-files named "feature.properties". 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>Apache Software License 1.1 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>) 
-
-  <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>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>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>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/assembly/plugins/org.eclipse.jpt/.cvsignore b/assembly/plugins/org.eclipse.jpt/.cvsignore
deleted file mode 100644
index c9401a2..0000000
--- a/assembly/plugins/org.eclipse.jpt/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build.xml
-org.eclipse.jpt_1.0.0.*
\ No newline at end of file
diff --git a/assembly/plugins/org.eclipse.jpt/.project b/assembly/plugins/org.eclipse.jpt/.project
deleted file mode 100644
index f51b04c..0000000
--- a/assembly/plugins/org.eclipse.jpt/.project
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jpt</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/assembly/plugins/org.eclipse.jpt/.settings/org.eclipse.core.resources.prefs b/assembly/plugins/org.eclipse.jpt/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 4aec29d..0000000
--- a/assembly/plugins/org.eclipse.jpt/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 15:10:09 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/assembly/plugins/org.eclipse.jpt/META-INF/MANIFEST.MF b/assembly/plugins/org.eclipse.jpt/META-INF/MANIFEST.MF
deleted file mode 100644
index 5ac613e..0000000
--- a/assembly/plugins/org.eclipse.jpt/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,7 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jpt; singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Localization: plugin
-Bundle-Vendor: %providerName
diff --git a/assembly/plugins/org.eclipse.jpt/about.html b/assembly/plugins/org.eclipse.jpt/about.html
deleted file mode 100644
index ca606b1..0000000
--- a/assembly/plugins/org.eclipse.jpt/about.html
+++ /dev/null
@@ -1,34 +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">
-
-<H3>About This Content</H3>
-
-<P>June 06, 2007</P>
-
-<H3>License</H3>
-
-<P>The Eclipse Foundation makes available all content in this plug-in 
-("Content"). Unless otherwise indicated below, the Content is provided to you 
-under the terms and conditions of the Eclipse Public License Version 1.0 
-("EPL"). A copy of the EPL is available at
-<A href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/org/documents/epl-v10.php</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-
-<P>If you did not receive this Content directly from the Eclipse Foundation, the 
-Content is being redistributed by another party ("Redistributor") and different 
-terms and conditions may apply to your use of any object code in the Content. 
-Check the Redistributor's license that was provided with the Content. If no such 
-license exists, contact the Redistributor. Unless otherwise indicated below, the 
-terms and conditions of the EPL still apply to any source code in the Content 
-and such source code may be obtained at
-<A href="http://www.eclipse.org/">http://www.eclipse.org/</A>.</P>
-
-</BODY>
-</HTML>
\ No newline at end of file
diff --git a/assembly/plugins/org.eclipse.jpt/about.ini b/assembly/plugins/org.eclipse.jpt/about.ini
deleted file mode 100644
index 588a325..0000000
--- a/assembly/plugins/org.eclipse.jpt/about.ini
+++ /dev/null
@@ -1,44 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 Oracle.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle. - initial API and implementation
-###############################################################################
-
-# 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
-
-# Property "tipsAndTricksHref" contains the Help topic href to a tips and tricks page 
-# optional
-tipsAndTricksHref=/org.eclipse.jpt.doc.user/tips_and_tricks.htm
-
-
diff --git a/assembly/plugins/org.eclipse.jpt/about.mappings b/assembly/plugins/org.eclipse.jpt/about.mappings
deleted file mode 100644
index bddaab4..0000000
--- a/assembly/plugins/org.eclipse.jpt/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/assembly/plugins/org.eclipse.jpt/about.properties b/assembly/plugins/org.eclipse.jpt/about.properties
deleted file mode 100644
index 159bfce..0000000
--- a/assembly/plugins/org.eclipse.jpt/about.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 Oracle.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle. - initial API and implementation
-###############################################################################
-
-# 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 Persistence API Tools\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2006.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
diff --git a/assembly/plugins/org.eclipse.jpt/build.properties b/assembly/plugins/org.eclipse.jpt/build.properties
deleted file mode 100644
index 0ccfb0e..0000000
--- a/assembly/plugins/org.eclipse.jpt/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2006, 2007 Oracle.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle. - initial API and implementation
-###############################################################################
-bin.includes = META-INF/,\
-               about.ini,\
-               about.html,\
-               about.mappings,\
-               about.properties,\
-               eclipse32.gif,\
-               eclipse32.png,\
-               plugin.properties,\
-               component.xml
diff --git a/assembly/plugins/org.eclipse.jpt/component.xml b/assembly/plugins/org.eclipse.jpt/component.xml
deleted file mode 100644
index 11f133f..0000000
--- a/assembly/plugins/org.eclipse.jpt/component.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<component  xmlns="http://eclipse.org/wtp/releng/tools/component-model" name="org.eclipse.jpt">
-<description url=""></description>
-<component-depends unrestricted="true"></component-depends>
-<plugin id="org.eclipse.jpt" fragment="false"/>
-<plugin id="org.eclipse.jpt.core" fragment="false"/>
-<plugin id="org.eclipse.jpt.db" fragment="false"/>
-<plugin id="org.eclipse.jpt.db.ui" fragment="false"/>
-<plugin id="org.eclipse.jpt.gen" fragment="false"/>
-<plugin id="org.eclipse.jpt.ui" fragment="false"/>
-<plugin id="org.eclipse.jpt.utility" fragment="false"/>
-</component>
\ No newline at end of file
diff --git a/assembly/plugins/org.eclipse.jpt/eclipse32.gif b/assembly/plugins/org.eclipse.jpt/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/assembly/plugins/org.eclipse.jpt/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/assembly/plugins/org.eclipse.jpt/eclipse32.png b/assembly/plugins/org.eclipse.jpt/eclipse32.png
deleted file mode 100644
index 568fac1..0000000
--- a/assembly/plugins/org.eclipse.jpt/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/assembly/plugins/org.eclipse.jpt/plugin.properties b/assembly/plugins/org.eclipse.jpt/plugin.properties
deleted file mode 100644
index f45a08d..0000000
--- a/assembly/plugins/org.eclipse.jpt/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 Oracle.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle. - initial API and implementation
-###############################################################################
-
-pluginName = Java Persistence API Tools
-providerName = Eclipse.org
diff --git a/jpa/features/org.eclipse.jpt.feature/.cvsignore b/jpa/features/org.eclipse.jpt.feature/.cvsignore
deleted file mode 100644
index c14487c..0000000
--- a/jpa/features/org.eclipse.jpt.feature/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-build.xml
diff --git a/jpa/features/org.eclipse.jpt.tests.feature/.cvsignore b/jpa/features/org.eclipse.jpt.tests.feature/.cvsignore
deleted file mode 100644
index c14487c..0000000
--- a/jpa/features/org.eclipse.jpt.tests.feature/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-build.xml
diff --git a/jpa/features/org.eclipse.jpt.tests.feature/feature.xml b/jpa/features/org.eclipse.jpt.tests.feature/feature.xml
index 5d0a000..2034cac 100644
--- a/jpa/features/org.eclipse.jpt.tests.feature/feature.xml
+++ b/jpa/features/org.eclipse.jpt.tests.feature/feature.xml
@@ -29,10 +29,4 @@
          install-size="0"
          version="0.0.0" />
 
-   <plugin
-         id="org.eclipse.jpt.core.tests.extension.resource"
-         download-size="0"
-         install-size="0"
-         version="0.0.0" />
-
 </feature>
diff --git a/jpa/features/org.eclipse.jpt_sdk.feature/.cvsignore b/jpa/features/org.eclipse.jpt_sdk.feature/.cvsignore
deleted file mode 100644
index 2201cc3..0000000
--- a/jpa/features/org.eclipse.jpt_sdk.feature/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-feature.temp.folder
-build.xml
-org.eclipse.jpt_sdk.feature_1.0.0.*
diff --git a/jpa/plugins/org.eclipse.jpt.core/.cvsignore b/jpa/plugins/org.eclipse.jpt.core/.cvsignore
index a196dd7..60463af 100644
--- a/jpa/plugins/org.eclipse.jpt.core/.cvsignore
+++ b/jpa/plugins/org.eclipse.jpt.core/.cvsignore
@@ -1,6 +1,2 @@
 bin
-@dot
-temp.folder
 build.xml
-javaCompiler...args
-javaCompiler...args.*
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.core/META-INF/MANIFEST.MF b/jpa/plugins/org.eclipse.jpt.core/META-INF/MANIFEST.MF
index d1d0566..3a5fa1a 100644
--- a/jpa/plugins/org.eclipse.jpt.core/META-INF/MANIFEST.MF
+++ b/jpa/plugins/org.eclipse.jpt.core/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-SymbolicName: org.eclipse.jpt.core;singleton:=true
-Bundle-Version: 1.1.0.qualifier
+Bundle-Version: 1.0.0.qualifier
 Bundle-Activator: org.eclipse.jpt.core.internal.JptCorePlugin
 Bundle-ClassPath: .
 Bundle-Localization: plugin
diff --git a/jpa/plugins/org.eclipse.jpt.core/model/old_core.ecore b/jpa/plugins/org.eclipse.jpt.core/model/old_core.ecore
index 9f78292..eaf0f0e 100644
--- a/jpa/plugins/org.eclipse.jpt.core/model/old_core.ecore
+++ b/jpa/plugins/org.eclipse.jpt.core/model/old_core.ecore
@@ -231,21 +231,10 @@
     </eClassifiers>
     <eClassifiers xsi:type="ecore:EClass" name="IColumn" abstract="true" interface="true"
         eSuperTypes="#//mappings/IAbstractColumn">
-      <eOperations name="getDefaultLength" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EInt"/>
-      <eOperations name="getDefaultPrecision" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EInt"/>
-      <eOperations name="getDefaultScale" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EInt"/>
       <eStructuralFeatures xsi:type="ecore:EAttribute" name="length" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
-          changeable="false" volatile="true" derived="true"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="specifiedLength" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EInt"
-          defaultValueLiteral="-1"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="precision" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
-          changeable="false" volatile="true" derived="true"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="specifiedPrecision" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EInt"
-          defaultValueLiteral="-1"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="scale" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
-          changeable="false" volatile="true" derived="true"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="specifiedScale" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EInt"
-          defaultValueLiteral="-1"/>
+          defaultValueLiteral="255"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="precision" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="scale" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
     </eClassifiers>
     <eClassifiers xsi:type="ecore:EClass" name="IColumnMapping" abstract="true" interface="true">
       <eOperations name="getColumn" eType="#//mappings/IColumn"/>
diff --git a/jpa/plugins/org.eclipse.jpt.core/model/old_coreModels.genmodel b/jpa/plugins/org.eclipse.jpt.core/model/old_coreModels.genmodel
index abf3828..4a0b73b 100644
--- a/jpa/plugins/org.eclipse.jpt.core/model/old_coreModels.genmodel
+++ b/jpa/plugins/org.eclipse.jpt.core/model/old_coreModels.genmodel
@@ -226,14 +226,8 @@
       </genClasses>
       <genClasses ecoreClass="old_core.ecore#//mappings/IColumn">
         <genFeatures createChild="false" ecoreFeature="ecore:EAttribute old_core.ecore#//mappings/IColumn/length"/>
-        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute old_core.ecore#//mappings/IColumn/specifiedLength"/>
         <genFeatures createChild="false" ecoreFeature="ecore:EAttribute old_core.ecore#//mappings/IColumn/precision"/>
-        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute old_core.ecore#//mappings/IColumn/specifiedPrecision"/>
         <genFeatures createChild="false" ecoreFeature="ecore:EAttribute old_core.ecore#//mappings/IColumn/scale"/>
-        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute old_core.ecore#//mappings/IColumn/specifiedScale"/>
-        <genOperations ecoreOperation="old_core.ecore#//mappings/IColumn/getDefaultLength"/>
-        <genOperations ecoreOperation="old_core.ecore#//mappings/IColumn/getDefaultPrecision"/>
-        <genOperations ecoreOperation="old_core.ecore#//mappings/IColumn/getDefaultScale"/>
       </genClasses>
       <genClasses ecoreClass="old_core.ecore#//mappings/IColumnMapping">
         <genOperations ecoreOperation="old_core.ecore#//mappings/IColumnMapping/getColumn"/>
@@ -419,8 +413,12 @@
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference old_java.ecore#//JavaPersistentAttribute/defaultMapping"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference old_java.ecore#//JavaPersistentAttribute/specifiedMapping"/>
     </genClasses>
-    <genClasses image="false" ecoreClass="old_java.ecore#//IJavaTypeMapping"/>
-    <genClasses image="false" ecoreClass="old_java.ecore#//IJavaAttributeMapping"/>
+    <genClasses image="false" ecoreClass="old_java.ecore#//IJavaTypeMapping">
+      <genOperations ecoreOperation="old_java.ecore#//IJavaTypeMapping/initialize"/>
+    </genClasses>
+    <genClasses image="false" ecoreClass="old_java.ecore#//IJavaAttributeMapping">
+      <genOperations ecoreOperation="old_java.ecore#//IJavaAttributeMapping/initialize"/>
+    </genClasses>
     <nestedGenPackages prefix="JpaJavaMappings" basePackage="org.eclipse.jpt.core.internal.content.java"
         disposableProviderFactory="true" ecorePackage="old_java.ecore#//mappings">
       <genClasses image="false" ecoreClass="old_java.ecore#//mappings/IJavaEntity"/>
diff --git a/jpa/plugins/org.eclipse.jpt.core/model/old_java.ecore b/jpa/plugins/org.eclipse.jpt.core/model/old_java.ecore
index 4140f4d..fbd55ce 100644
--- a/jpa/plugins/org.eclipse.jpt.core/model/old_java.ecore
+++ b/jpa/plugins/org.eclipse.jpt.core/model/old_java.ecore
@@ -2,7 +2,7 @@
 <ecore:EPackage 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" name="java"
-    nsURI="jpt.java.xmi" nsPrefix="org.eclipse.jpt.core.content.java">
+    nsURI="http://org.eclipse.jpt.core/old_java.ecore" nsPrefix="org.eclipse.jpt.core.content.java">
   <eClassifiers xsi:type="ecore:EClass" name="JavaEObject" abstract="true" eSuperTypes="old_core.ecore#//JpaEObject old_core.ecore#//IJpaSourceObject">
     <eOperations name="getJpaFile" eType="ecore:EClass old_core.ecore#//IJpaFile"/>
     <eOperations name="getRoot" eType="ecore:EClass old_core.ecore#//IJpaRootContentNode"/>
@@ -26,9 +26,13 @@
         eType="#//IJavaAttributeMapping" containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="IJavaTypeMapping" abstract="true" interface="true"
-      eSuperTypes="old_core.ecore#//ITypeMapping"/>
+      eSuperTypes="old_core.ecore#//ITypeMapping">
+    <eOperations name="initialize"/>
+  </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="IJavaAttributeMapping" abstract="true"
-      interface="true" eSuperTypes="old_core.ecore#//IAttributeMapping"/>
+      interface="true" eSuperTypes="old_core.ecore#//IAttributeMapping">
+    <eOperations name="initialize"/>
+  </eClassifiers>
   <eSubpackages name="mappings" nsURI="jpt.core.java.mappings.xmi" nsPrefix="jpt.core.java.mappings">
     <eClassifiers xsi:type="ecore:EClass" name="IJavaEntity" abstract="true" interface="true"
         eSuperTypes="#//IJavaTypeMapping old_core.ecore#//mappings/IEntity"/>
diff --git a/jpa/plugins/org.eclipse.jpt.core/plugin.xml b/jpa/plugins/org.eclipse.jpt.core/plugin.xml
index fdfb6a5..f645a59 100644
--- a/jpa/plugins/org.eclipse.jpt.core/plugin.xml
+++ b/jpa/plugins/org.eclipse.jpt.core/plugin.xml
@@ -184,9 +184,9 @@
  <extension
        point="org.eclipse.emf.ecore.generated_package">
     <package
-          class="org.eclipse.jpt.core.internal.content.java.JpaJavaPackage"
+          class="org.eclipse.jpt.core.internal.content.java.mappings.JpaJavaMappingsPackage"
           genModel="model/old_coreModels.genmodel"
-          uri="jpt.java.xmi">
+          uri="http://org.eclipse.jpt.core/old_java.ecore">
     </package>
  </extension>
 	
diff --git a/jpa/plugins/org.eclipse.jpt.core/property_files/jpa_core.properties b/jpa/plugins/org.eclipse.jpt.core/property_files/jpa_core.properties
index 8e0a958..f1e4174 100644
--- a/jpa/plugins/org.eclipse.jpt.core/property_files/jpa_core.properties
+++ b/jpa/plugins/org.eclipse.jpt.core/property_files/jpa_core.properties
@@ -18,5 +18,4 @@
 SYNCHRONIZE_CLASSES_JOB=Synchronizing classes
 SYNCHRONIZING_CLASSES_TASK=Synchronizing classes ...
 INVALID_PERSISTENCE_XML_CONTENT=Invalid persistence.xml content
-ERROR_SYNCHRONIZING_CLASSES_COULD_NOT_VALIDATE=Error synchronizing classes.  Could not validate.
 ERROR_WRITING_FILE=Could not write to persistence.xml
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.core/property_files/jpa_validation.properties b/jpa/plugins/org.eclipse.jpt.core/property_files/jpa_validation.properties
index 2729194..106f77e 100644
--- a/jpa/plugins/org.eclipse.jpt.core/property_files/jpa_validation.properties
+++ b/jpa/plugins/org.eclipse.jpt.core/property_files/jpa_validation.properties
@@ -45,7 +45,7 @@
 JOIN_TABLE_UNRESOLVED_SCHEMA=Schema \"{0}\" cannot be resolved for join table \"{1}\"
 VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_SCHEMA=In virtual attribute \"{0}\", schema \"{1}\" cannot be resolved for join table \"{2}\"
 JOIN_TABLE_UNRESOLVED_NAME=Join table \"{0}\" cannot be resolved
-VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_NAME=In virtual attribute \"{0}\", join table \"{1}\" cannot be resolved
+VIRTUAL_ATTRIBUTE_JOIN_TABLE_UNRESOLVED_NAME=In virtual attribute \"{0}\",, join table \"{1}\" cannot be resolved
 COLUMN_UNRESOLVED_TABLE=Table \"{0}\" for column \"{1}\" cannot be resolved
 VIRTUAL_ATTRIBUTE_COLUMN_UNRESOLVED_TABLE=In virtual attribute \"{0}\", table \"{1}\" for column \"{2}\" cannot be resolved
 VIRTUAL_ATTRIBUTE_OVERRIDE_COLUMN_UNRESOLVED_TABLE=In virtual attribute override \"{0}\", table \"{1}\" for column \"{2}\" cannot be resolved
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaContentNode.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaContentNode.java
index 5676d2e..5d83c12 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaContentNode.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaContentNode.java
@@ -1,8 +1,8 @@
 /*******************************************************************************
  * Copyright (c) 2006, 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * This program and the accompanying materials are made available under the terms of
+ * the Eclipse Public License v1.0, which accompanies this distribution and is available at
+ * http://www.eclipse.org/legal/epl-v10.html.
  * 
  * Contributors:
  *     Oracle - initial API and implementation
@@ -35,6 +35,12 @@
 	Object getId();
 
 	/**
+	 * Return the text range for this contentNode.  This is the all-inclusive
+	 * text range to be used for finding a particular content node given a source location.
+	 */
+	ITextRange fullTextRange();
+
+	/**
 	 * Return the text range to be used for selection. This is the text you want selected
 	 * when selecting the object in the editor. StructureView uses this for selection
 	 * from the structure to the source editor.
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaDataSource.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaDataSource.java
index 4aae51c..013f184 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaDataSource.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaDataSource.java
@@ -9,6 +9,7 @@
  ******************************************************************************/
 package org.eclipse.jpt.core.internal;
 
+
 /**
  * <!-- begin-user-doc -->
  * A representation of the model object '<em><b>IJpa Data Source</b></em>'.
@@ -32,6 +33,6 @@
 	void setConnectionProfileName(String newConnectionProfileName);
 
 	boolean isConnected();
-
+	
 	boolean hasAConnection();
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaFactory.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaFactory.java
index 57d388e..1e5745e 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaFactory.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaFactory.java
@@ -24,7 +24,6 @@
 import org.eclipse.jpt.core.internal.content.java.mappings.IJavaVersion;
 import org.eclipse.jpt.core.internal.jdtutility.Attribute;
 import org.eclipse.jpt.core.internal.jdtutility.Type;
-import org.eclipse.jpt.core.internal.platform.BaseJpaFactory;
 
 /**
  * Use IJpaFactory to create any IJavaTypeMapping or IJavaAttributeMappings.  This is necessary
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaPlatform.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaPlatform.java
index 17c4a1a..dc7e19c 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaPlatform.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaPlatform.java
@@ -12,7 +12,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.content.java.IDefaultJavaAttributeMappingProvider;
 import org.eclipse.jpt.core.internal.content.java.IJavaAttributeMapping;
 import org.eclipse.jpt.core.internal.content.java.IJavaAttributeMappingProvider;
@@ -98,7 +97,7 @@
 	Iterator<IJavaTypeMappingProvider> javaTypeMappingProviders();
 
 	IJavaTypeMappingProvider javaTypeMappingProvider(String typeMappingKey);
-
+	
 	/**
 	 * Return an Iterator of IJavaAttributeMappingProviders.  These define which
 	 * IJavaAttributeMappings are supported and which annotation applies. 
@@ -106,7 +105,7 @@
 	Iterator<IJavaAttributeMappingProvider> javaAttributeMappingProviders();
 
 	IJavaAttributeMappingProvider javaAttributeMappingProvider(String attributeMappingKey);
-
+	
 	/**
 	 * Return a ListIterator of IDefaultJavaAttributeMappingProvider.  This is a List
 	 * because the defaults are checked in order.
@@ -159,7 +158,7 @@
 	 * will be started upon completion.
 	 * @param contextHierarchy
 	 */
-	void resynch(IContext contextHierarchy, IProgressMonitor monitor);
+	void resynch(IContext contextHierarchy);
 
 	/**
 	 * Adds validation messages to the growing list of messages
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaProject.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaProject.java
index c7ffb1d..5d2bda5 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaProject.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/IJpaProject.java
@@ -11,6 +11,7 @@
 
 import java.util.Collection;
 import java.util.Iterator;
+
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
@@ -153,4 +154,5 @@
 	void setThreadLocalModifySharedDocumentCommandExecutor(CommandExecutor commandExecutor);
 
 	CommandExecutorProvider modifySharedDocumentCommandExecutorProvider();
+
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaDataSource.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaDataSource.java
index 0859ee2..b3389cd 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaDataSource.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaDataSource.java
@@ -12,6 +12,7 @@
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.jpt.db.internal.Connection;
 import org.eclipse.jpt.db.internal.ConnectionListener;
 import org.eclipse.jpt.db.internal.ConnectionProfile;
 import org.eclipse.jpt.db.internal.ConnectionProfileRepository;
@@ -100,27 +101,27 @@
 
 	private ConnectionListener buildConnectionListener() {
 		return new ConnectionListener() {
-			public void opened(ConnectionProfile profile) {
+			public void opened(Connection connection) {
 				getProject().resynch();
 			}
 
-			public void aboutToClose(ConnectionProfile profile) {}
+			public void aboutToClose(Connection connection) {}
 
-			public boolean okToClose(ConnectionProfile profile) {
+			public boolean okToClose(Connection connection) {
 				return true;
 			}
 
-			public void closed(ConnectionProfile profile) {
+			public void closed(Connection connection) {
 				getProject().resynch();
 			}
 
-			public void modified(ConnectionProfile profile) {}
+			public void modified(Connection connection) {}
 
-			public void databaseChanged(ConnectionProfile profile, Database database) {}
+			public void databaseChanged(Connection connection, Database database) {}
 
-			public void schemaChanged(ConnectionProfile profile, Schema schema) {}
+			public void schemaChanged(Connection connection, Schema schema) {}
 
-			public void tableChanged(ConnectionProfile profile, Table table) {}
+			public void tableChanged(Connection connection, Table table) {}
 		};
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModelManager.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModelManager.java
index f69d462..08ecf88 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModelManager.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModelManager.java
@@ -33,8 +33,6 @@
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jpt.core.internal.prefs.JpaPreferenceConstants;
 import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
-import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectEvent;
-import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectListener;
 
 public class JpaModelManager
 {
@@ -42,8 +40,6 @@
 	
 	private final IResourceChangeListener resourceChangeListener;
 	
-	private final IFacetedProjectListener facetedProjectListener;
-	
 	private final IElementChangedListener elementChangeListener;
 	
 	private final IPropertyChangeListener preferencesListener;
@@ -64,18 +60,16 @@
 	
 	private JpaModelManager() {
 		super();
-		model = JpaCoreFactory.eINSTANCE.createJpaModel();
-		resourceChangeListener = new ResourceChangeListener();
-		facetedProjectListener = new FacetedProjectListener();
-		elementChangeListener = new ElementChangeListener();
-		preferencesListener = new PreferencesListener();
+		this.model = JpaCoreFactory.eINSTANCE.createJpaModel();
+		this.resourceChangeListener = new ResourceChangeListener();
+		this.elementChangeListener = new ElementChangeListener();
+		this.preferencesListener = new PreferencesListener();
 	}
 	
 	void start() {
 		try {
 			this.buildWorkspace();
 			ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener);
-			FacetedProjectFramework.addListener(facetedProjectListener, IFacetedProjectEvent.Type.values());
 			JavaCore.addElementChangedListener(elementChangeListener);
 			JptCorePlugin.getPlugin().getPluginPreferences().addPropertyChangeListener(preferencesListener);
 		}
@@ -302,7 +296,6 @@
 				
 				switch (event.getType()){
 					case IResourceChangeEvent.PRE_DELETE :
-					case IResourceChangeEvent.PRE_CLOSE :
 						try {
 							if ((resource.getType() == IResource.PROJECT)
 									&& (FacetedProjectFramework.hasProjectFacet(
@@ -321,6 +314,9 @@
 							checkForFilesBeingAddedOrRemoved(delta);
 						}
 						return;
+						
+					case IResourceChangeEvent.PRE_CLOSE :
+						return;
 				}
 			}
 		}
@@ -407,7 +403,19 @@
 											JptCorePlugin.log(ce);
 										}
 									}
+								} 
+								else {
+									// project has been closed.  dispose jpa project if it exists.
+									if (jpaProject != null) {
+										jpaProject.dispose();
+									}
 								}
+							}
+							else if ((delta.getFlags() & IResourceDelta.DESCRIPTION) != 0) {
+								// again, not sure ...
+							} 
+							else {
+								// ...
 							}		
 							break;
 					}
@@ -473,70 +481,7 @@
 	}
 	
 	
-	// **************** faceted project listener ******************************
-	
-	private static class FacetedProjectListener 
-		implements IFacetedProjectListener
-	{
-		ThreadLocal<FacetedProjectChangeProcessor> processors = 
-				new ThreadLocal<FacetedProjectChangeProcessor>();
-		
-		FacetedProjectListener() {
-			super();
-		}
-		
-		public void handleEvent(IFacetedProjectEvent event) {
-			getProcessor().handleEvent(event);
-		}
-		
-		public FacetedProjectChangeProcessor getProcessor() {
-			FacetedProjectChangeProcessor processor = processors.get();
-			if (processor == null) { 
-				processor = new FacetedProjectChangeProcessor();
-				processors.set(processor);
-			}
-			return processor;
-		}
-	}
-	
-	
-	private static class FacetedProjectChangeProcessor
-	{
-		private JpaModel model;
-		
-		FacetedProjectChangeProcessor() {
-			model = JpaModelManager.instance().model;
-		}
-		
-		protected void handleEvent(IFacetedProjectEvent event) {
-			IProject project = event.getProject().getProject();
-			JpaProject jpaProject = (JpaProject) model.getJpaProject(project);
-			boolean jpaFacetExists = false;
-			try {
-				jpaFacetExists = FacetedProjectFramework.hasProjectFacet(project, JptCorePlugin.FACET_ID);
-			}
-			catch (CoreException ce) {
-				// nothing to do, assume facet doesn't exist
-				JptCorePlugin.log(ce);
-			}
-			
-			if (jpaFacetExists && jpaProject == null) {
-				try {
-					JpaModelManager.instance().createFilledJpaProject(project);
-				}
-				catch (CoreException ce) {
-				// nothing to do, nothing we *can* do
-				JptCorePlugin.log(ce);
-				}
-			}
-			else if (jpaProject != null && ! jpaFacetExists) {
-				jpaProject.dispose();
-			}
-		}
-	}
-	
-	
-	// **************** element change listener *******************************
+	// ********** element change listener **********	
 
 	private static class ElementChangeListener 
 		implements IElementChangedListener
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java
index 87723ad..3013a57 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java
@@ -24,11 +24,13 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
 import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 import org.eclipse.emf.common.util.EList;
@@ -146,12 +148,6 @@
 	 * This is set to false when that job is completed 
 	 */
 	boolean resynching = false;
-	
-	/**
-	 * Flag to indicate that the disposing job has been scheduled or is running
-	 * (or has been run, in some cases)
-	 */
-	boolean disposing = false;
 
 	/**
 	 * Flag to indicate that the resynchJob needs to be run.  This is
@@ -166,6 +162,8 @@
 	 */
 	Job resynchJob;
 
+	private IJobChangeListener resynchJobListener;
+
 	private CommandExecutorProvider modifySharedDocumentCommandExecutorProvider;
 
 	private ThreadLocal<CommandExecutor> threadLocalModifySharedDocumentCommandExecutor = new ThreadLocal<CommandExecutor>();
@@ -179,50 +177,39 @@
 		this();
 		this.project = project;
 		this.resynchJob = buildResynchJob();
+		this.resynchJobListener = buildResynchJobListener();
+		Job.getJobManager().addJobChangeListener(this.resynchJobListener);
 	}
 
 	private Job buildResynchJob() {
 		Job job = new Job("Resynching JPA model ...") {
 			@Override
 			protected IStatus run(IProgressMonitor monitor) {
-				try {
-					return runResynch(monitor);
-				}
-				finally {
-					JpaProject.this.resynching = false;
-					if (JpaProject.this.needsToResynch) {
+				IContext contextHierarchy = getPlatform().buildProjectContext();
+				getPlatform().resynch(contextHierarchy);
+				return Status.OK_STATUS;
+			}
+		};
+		job.setRule(project);
+		return job;
+	}
+
+	private IJobChangeListener buildResynchJobListener() {
+		return new JobChangeAdapter() {
+			@Override
+			public void done(IJobChangeEvent event) {
+				super.done(event);
+				if (event.getJob() == JpaProject.this.resynchJob) {
+					resynching = false;
+					if (event.getResult().matches(IStatus.CANCEL)) {
+						needsToResynch = false;
+					}
+					else if (needsToResynch) {
 						resynch();
 					}
 				}
 			}
-
 		};
-		if (this.project == null) {
-			throw new IllegalStateException("Project can not be null when the Resynch Job is built");
-		}
-		job.setRule(this.project);
-		return job;
-	}
-
-	private IStatus runResynch(IProgressMonitor monitor) {
-		IContext contextHierarchy = getPlatform().buildProjectContext();
-		if (monitor.isCanceled()) {
-			return Status.CANCEL_STATUS;
-		}
-		try {
-			getPlatform().resynch(contextHierarchy, monitor);
-		}
-		catch (OperationCanceledException e) {
-			return Status.CANCEL_STATUS;
-		}
-		catch (Throwable e) {
-			//exceptions can occur when this thread is running and changes are
-			//made to the java source.  our model is not yet updated to the changed java source.
-			//log these exceptions and assume they won't happen when the resynch runs again
-			//as a result of the java source changes.
-			JptCorePlugin.log(e);
-		}
-		return Status.OK_STATUS;
 	}
 
 	/**
@@ -526,12 +513,8 @@
 			}
 		};
 		getProject().accept(visitor, IResource.NONE);
-		filled = true;
 		resynch();
-	}
-
-	public boolean isFilled() {
-		return filled;
+		filled = true;
 	}
 
 	/**
@@ -590,10 +573,6 @@
 	 * Dispose and remove project
 	 */
 	void dispose() {
-		if (disposing) return;
-		
-		disposing = true;
-				
 		Job job = new Job("Disposing JPA project ...") {
 			@Override
 			protected IStatus run(IProgressMonitor monitor) {
@@ -606,6 +585,7 @@
 	}
 	
 	private void dispose_() {
+		Job.getJobManager().removeJobChangeListener(resynchJobListener);
 		for (IJpaFile jpaFile : CollectionTools.collection(getFiles())) {
 			((JpaFile) jpaFile).dispose();
 		}
@@ -716,18 +696,13 @@
 	//passing it on to the JpaModel.  We don't currently support
 	//multiple projects having cross-references
 	public void resynch() {
-		if (disposing || ! filled) return;
-		
-		if (! this.resynching) {
+		if (!this.resynching) {
 			this.resynching = true;
 			this.needsToResynch = false;
 			this.resynchJob.schedule();
 		}
 		else {
 			this.needsToResynch = true;
-			if (this.resynchJob.getState() == Job.RUNNING) {
-				this.resynchJob.cancel();
-			}
 		}
 	}
 
@@ -865,17 +840,12 @@
 		}
 		return this.modifySharedDocumentCommandExecutorProvider;
 	}
-	
-	
+
 	// ********** member class **********
-	
-	private class ModifySharedDocumentCommandExecutorProvider 
-			implements CommandExecutorProvider 
-	{
+	private class ModifySharedDocumentCommandExecutorProvider implements CommandExecutorProvider {
 		ModifySharedDocumentCommandExecutorProvider() {
 			super();
 		}
-		
 		public CommandExecutor commandExecutor() {
 			return JpaProject.this.getThreadLocalModifySharedDocumentCommandExecutor();
 		}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JptCoreMessages.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JptCoreMessages.java
index 8121ca9..fa75d97 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JptCoreMessages.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JptCoreMessages.java
@@ -38,8 +38,6 @@
 	
 	public static String INVALID_PERSISTENCE_XML_CONTENT;
 	
-	public static String ERROR_SYNCHRONIZING_CLASSES_COULD_NOT_VALIDATE;
-	
 	public static String ERROR_WRITING_FILE;
 	
 	
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/IJavaAttributeMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/IJavaAttributeMapping.java
index 5b2f5ca..918f77c 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/IJavaAttributeMapping.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/IJavaAttributeMapping.java
@@ -27,6 +27,18 @@
  */
 public interface IJavaAttributeMapping extends IAttributeMapping
 {
+	/**
+	 * <!-- begin-user-doc -->
+	 * Initialize the model after the AttributeMapping has been
+	 * created and added to its container.  Some things
+	 * can't be accessed.  Build anything that doesn't depend
+	 * on resources throughout the model being built.
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void initialize();
+
 	void updateFromJava(CompilationUnit astRoot);
 
 	/**
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/IJavaTypeMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/IJavaTypeMapping.java
index 8b99b4f..4a96464 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/IJavaTypeMapping.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/IJavaTypeMapping.java
@@ -26,6 +26,14 @@
  */
 public interface IJavaTypeMapping extends ITypeMapping
 {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void initialize();
+
 	void updateFromJava(CompilationUnit astRoot);
 
 	/**
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JavaPersistentAttribute.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JavaPersistentAttribute.java
index 25596bf..a8bb846 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JavaPersistentAttribute.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JavaPersistentAttribute.java
@@ -92,6 +92,7 @@
 		return jpaPlatform().javaAttributeMappingProviders();
 	}
 
+
 	private ListIterator<IDefaultJavaAttributeMappingProvider> defaultAttributeMappingProviders() {
 		return jpaPlatform().defaultJavaAttributeMappingProviders();
 	}
@@ -440,7 +441,7 @@
 				this.attribute.removeAnnotation(this.declarationAnnotationAdapterForAttributeMappingKey(oldKey));
 			}
 			this.attribute.newMarkerAnnotation(this.declarationAnnotationAdapterForAttributeMappingKey(newKey));
-			this.specifiedMapping.updateFromJava(getAttribute().astRoot());
+			this.specifiedMapping.initialize();
 		}
 		if (this.eNotificationRequired()) {
 			this.eNotify(new ENotificationImpl(this, Notification.SET, JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__MAPPING, old, this.getMapping()));
@@ -510,6 +511,7 @@
 			else {
 				// the mapping has changed
 				this.setSpecifiedMapping(javaProvider.buildMapping(this.attribute, jpaFactory()));
+				this.specifiedMapping.initialize();
 			}
 			if (this.eNotificationRequired()) {
 				this.eNotify(new ENotificationImpl(this, Notification.SET, JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__MAPPING, old, this.getMapping()));
@@ -524,7 +526,7 @@
 	 * return null if we can't find a mapping annotation on the attribute
 	 */
 	private IJavaAttributeMappingProvider javaAttributeMappingProvider(CompilationUnit astRoot) {
-		for (Iterator<IJavaAttributeMappingProvider> i = this.attributeMappingProviders(); i.hasNext();) {
+		for (Iterator<IJavaAttributeMappingProvider> i = this.attributeMappingProviders(); i.hasNext(); ) {
 			IJavaAttributeMappingProvider provider = i.next();
 			if (this.attribute.containsAnnotation(provider.declarationAnnotationAdapter(), astRoot)) {
 				return provider;
@@ -565,7 +567,7 @@
 		// the "default" mapping has changed
 		IJavaAttributeMapping old = this.getMapping();
 		this.setDefaultMapping(defaultProvider.buildMapping(this.attribute, jpaFactory()));
-		this.defaultMapping.updateFromJava(defaultsContext.astRoot());
+		this.defaultMapping.updateFromJava(this.attribute.astRoot());
 		if (this.eNotificationRequired()) {
 			this.eNotify(new ENotificationImpl(this, Notification.SET, JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__MAPPING, old, this.getMapping()));
 		}
@@ -576,7 +578,7 @@
 	 * return the null provider if we can't find a provider
 	 */
 	private IJavaAttributeMappingProvider defaultAttributeMappingProvider(DefaultsContext defaultsContext) {
-		for (Iterator<IDefaultJavaAttributeMappingProvider> i = this.defaultAttributeMappingProviders(); i.hasNext();) {
+		for (Iterator<IDefaultJavaAttributeMappingProvider> i = this.defaultAttributeMappingProviders(); i.hasNext(); ) {
 			IDefaultJavaAttributeMappingProvider provider = i.next();
 			if (provider.defaultApplies(this.attribute, defaultsContext)) {
 				return provider;
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JavaPersistentType.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JavaPersistentType.java
index eca2600..398108e 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JavaPersistentType.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JavaPersistentType.java
@@ -25,8 +25,8 @@
 import org.eclipse.jdt.core.IMember;
 import org.eclipse.jdt.core.IMethod;
 import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jpt.core.internal.AccessType;
 import org.eclipse.jpt.core.internal.IJpaContentNode;
 import org.eclipse.jpt.core.internal.IPersistentAttribute;
@@ -46,7 +46,6 @@
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaManyToMany;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaManyToOne;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaMultiRelationshipMapping;
-import org.eclipse.jpt.core.internal.content.java.mappings.JavaNullTypeMappingProvider;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaOneToMany;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaOneToOne;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaPrimaryKeyJoinColumn;
@@ -58,6 +57,7 @@
 import org.eclipse.jpt.core.internal.jdtutility.AttributeAnnotationTools;
 import org.eclipse.jpt.core.internal.jdtutility.DeclarationAnnotationAdapter;
 import org.eclipse.jpt.core.internal.jdtutility.FieldAttribute;
+import org.eclipse.jpt.core.internal.jdtutility.JDTTools;
 import org.eclipse.jpt.core.internal.jdtutility.MethodAttribute;
 import org.eclipse.jpt.core.internal.jdtutility.Type;
 import org.eclipse.jpt.core.internal.platform.DefaultsContext;
@@ -171,14 +171,8 @@
 	private IPersistentType parentPersistentType;
 
 	protected JavaPersistentType() {
-		throw new UnsupportedOperationException();
-	}
-
-	protected JavaPersistentType(Type type) {
 		super();
-		this.type = type;
 		this.attributeMappingAnnotationAdapters = this.buildAttributeMappingAnnotationAdapters();
-		this.setMappingGen(this.nullTypeMappingProvider().buildMapping(this.type, null));
 	}
 
 	private DeclarationAnnotationAdapter[] buildAttributeMappingAnnotationAdapters() {
@@ -358,19 +352,7 @@
 	}
 
 	private IJavaTypeMappingProvider typeMappingProvider(String typeMappingKey) {
-		IJavaTypeMappingProvider javaTypeMappingProvider = jpaPlatform().javaTypeMappingProvider(typeMappingKey);
-		if (javaTypeMappingProvider == null) {
-			javaTypeMappingProvider = nullTypeMappingProvider();
-		}
-		return javaTypeMappingProvider;
-	}
-	
-	/**
-	 * the "null" type mapping is used when the types is not modified
-	 * by a mapping annotation
-	 */
-	protected IJavaTypeMappingProvider nullTypeMappingProvider() {
-		return JavaNullTypeMappingProvider.instance();
+		return jpaPlatform().javaTypeMappingProvider(typeMappingKey);
 	}
 
 	/**
@@ -598,6 +580,12 @@
 		return this.getJpaProject().modifySharedDocumentCommandExecutorProvider();
 	}
 
+	public void setJdtType(IType iType, CompilationUnit astRoot) {
+		this.type = new Type(iType, this.modifySharedDocumentCommandExecutorProvider());
+		this.setAccess(this.javaAccessType(astRoot));
+		this.createAndSetPersistentTypeMappingFromJava(this.javaTypeMappingKey(astRoot));
+	}
+
 	public JavaPersistentAttribute addJavaPersistentAttribute(IMember jdtMember) {
 		JavaPersistentAttribute persistentAttribute = createJavaPersistentAttribute(jdtMember);
 		getAttributes().add(persistentAttribute);
@@ -674,18 +662,10 @@
 	}
 
 	private void updatePersistentFields(CompilationUnit astRoot, List<JavaPersistentAttribute> persistentAttributesToRemove) {
-		updatePersistentAttributes(astRoot, persistentAttributesToRemove, this.jdtPersistableFields());
-	}
-
-	private void updatePersistentProperties(CompilationUnit astRoot, List<JavaPersistentAttribute> persistentAttributesToRemove) {
-		updatePersistentAttributes(astRoot, persistentAttributesToRemove, this.jdtPersistableProperties());
-	}
-
-	private void updatePersistentAttributes(CompilationUnit astRoot, List<JavaPersistentAttribute> persistentAttributesToRemove, IMember[] members) {
-		for (IMember member : members) {
-			JavaPersistentAttribute persistentAttribute = persistentAttributeFor(member);
+		for (IField field : this.jdtPersistableFields()) {
+			JavaPersistentAttribute persistentAttribute = persistentAttributeFor(field);
 			if (persistentAttribute == null) {
-				persistentAttribute = addJavaPersistentAttribute(member);
+				persistentAttribute = addJavaPersistentAttribute(field);
 			}
 			else {
 				persistentAttributesToRemove.remove(persistentAttribute);
@@ -694,6 +674,19 @@
 		}
 	}
 
+	private void updatePersistentProperties(CompilationUnit astRoot, List<JavaPersistentAttribute> persistentAttributesToRemove) {
+		for (IMethod method : this.jdtPersistableProperties()) {
+			JavaPersistentAttribute persistentAttribute = persistentAttributeFor(method);
+			if (persistentAttribute == null) {
+				addJavaPersistentAttribute(method);
+			}
+			else {
+				persistentAttributesToRemove.remove(persistentAttribute);
+				persistentAttribute.updateFromJava(astRoot);
+			}
+		}
+	}
+
 	private IField[] jdtPersistableFields() {
 		return AttributeAnnotationTools.persistableFields(jdtType());
 	}
@@ -703,7 +696,7 @@
 	}
 
 	private String javaTypeMappingKey(CompilationUnit astRoot) {
-		for (Iterator<IJavaTypeMappingProvider> i = this.typeMappingProviders(); i.hasNext();) {
+		for (Iterator<IJavaTypeMappingProvider> i = this.typeMappingProviders(); i.hasNext(); ) {
 			IJavaTypeMappingProvider provider = i.next();
 			if (this.type.containsAnnotation(provider.declarationAnnotationAdapter(), astRoot)) {
 				return provider.key();
@@ -765,15 +758,7 @@
 	}
 
 	public boolean includes(int offset) {
-		ITextRange fullTextRange = this.fullTextRange();
-		if (fullTextRange == null) {
-			//This happens if the type no longer exists in the java (rename in editor).
-			//The text selection event is fired before the update from java so our
-			//model has not yet had a chance to update appropriately.  For now, avoid the NPE, 
-			//not sure of the ultimate solution to these 2 threads accessing our model
-			return false;
-		}
-		return fullTextRange.includes(offset);
+		return this.fullTextRange().includes(offset);
 	}
 
 	public ITextRange fullTextRange() {
@@ -847,6 +832,15 @@
 		return this.parentPersistentType;
 	}
 
+	private String superclassTypeSignature() {
+		try {
+			return this.jdtType().getSuperclassTypeSignature();
+		}
+		catch (JavaModelException ex) {
+			throw new RuntimeException(ex);
+		}
+	}
+
 	/**
 	 * Return the AccessType currently implied by the Java source code:
 	 *     - if only Fields are annotated => FIELD
@@ -863,7 +857,7 @@
 		boolean hasPersistableProperties = false;
 		for (IField field : AttributeAnnotationTools.persistableFields(jdtType)) {
 			hasPersistableFields = true;
-			FieldAttribute fa = new FieldAttribute(field, null); // a bit hacky...
+			FieldAttribute fa = new FieldAttribute(field, null);  // a bit hacky...
 			if (fa.containsAnyAnnotation(this.attributeMappingAnnotationAdapters, astRoot)) {
 				// any field is annotated => FIELD
 				return AccessType.FIELD;
@@ -871,7 +865,7 @@
 		}
 		for (IMethod method : AttributeAnnotationTools.persistablePropertyGetters(jdtType)) {
 			hasPersistableProperties = true;
-			MethodAttribute ma = new MethodAttribute(method, null); // a bit hacky...
+			MethodAttribute ma = new MethodAttribute(method, null);  // a bit hacky...
 			if (ma.containsAnyAnnotation(this.attributeMappingAnnotationAdapters, astRoot)) {
 				// none of the fields are annotated and a getter is annotated => PROPERTY
 				return AccessType.PROPERTY;
@@ -889,27 +883,27 @@
 	}
 
 	private void refreshParentPersistentType(DefaultsContext context) {
-		ITypeBinding typeBinding = getType().typeBinding(context.astRoot());
-		this.parentPersistentType = parentPersistentType(context, typeBinding);
-	}
-
-	public static IPersistentType parentPersistentType(DefaultsContext context, ITypeBinding typeBinding) {
-		if (typeBinding == null) {
-			return null;
+		String superclassTypeSignature = this.superclassTypeSignature();
+		if (superclassTypeSignature == null) {
+			this.parentPersistentType = null;
+			return;
 		}
-		ITypeBinding superClassTypeBinding = typeBinding.getSuperclass();
-		if (superClassTypeBinding == null) {
-			return null;
+		String fullyQualifiedTypeName = JDTTools.resolveSignature(superclassTypeSignature, this.jdtType());
+		if (fullyQualifiedTypeName == null) {
+			this.parentPersistentType = null;
+			return;
 		}
-		String fullyQualifiedTypeName = superClassTypeBinding.getQualifiedName();
 		IPersistentType possibleParent = context.persistentType(fullyQualifiedTypeName);
 		if (possibleParent == null) {
 			//TODO look to superclass
-			return null;
+			this.parentPersistentType = null;
+			return;
 		}
 		if (possibleParent.getMappingKey() != null) {
-			return possibleParent;
+			this.parentPersistentType = possibleParent;
 		}
-		return possibleParent.parentPersistentType();
+		else {
+			this.parentPersistentType = possibleParent.parentPersistentType();
+		}
 	}
 }
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JpaCompilationUnit.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JpaCompilationUnit.java
index 85f5b9e..a65a6d3 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JpaCompilationUnit.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JpaCompilationUnit.java
@@ -34,11 +34,10 @@
 import org.eclipse.jpt.core.internal.ITextRange;
 import org.eclipse.jpt.core.internal.JpaCorePackage;
 import org.eclipse.jpt.core.internal.JpaFile;
+import org.eclipse.jpt.core.internal.jdtutility.ASTNodeTextRange;
 import org.eclipse.jpt.core.internal.jdtutility.AttributeAnnotationTools;
 import org.eclipse.jpt.core.internal.jdtutility.JDTTools;
-import org.eclipse.jpt.core.internal.jdtutility.Type;
 import org.eclipse.jpt.utility.internal.BitTools;
-import org.eclipse.jpt.utility.internal.CommandExecutorProvider;
 import org.eclipse.jpt.utility.internal.Filter;
 import org.eclipse.jpt.utility.internal.iterators.EmptyIterator;
 
@@ -290,6 +289,10 @@
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
 	}
 
+	public ITextRange fullTextRange() {
+		return new ASTNodeTextRange(this.astRoot());
+	}
+
 	public ITextRange validationTextRange() {
 		return this.selectionTextRange();
 	}
@@ -322,22 +325,18 @@
 		this.synchronizePersistentTypes();
 	}
 
-	public JavaPersistentType addJavaPersistentType(IType primaryType) {
-		JavaPersistentType persistentType = createJavaPersistentType(primaryType);
-		getTypes().add(persistentType);
-		return persistentType;
+	public JavaPersistentType addJavaPersistentType(IType primaryType, CompilationUnit astRoot) {
+		return this.addJavaPersistentType(this.createJavaPersistentType(), primaryType, astRoot);
 	}
 
-	public JavaPersistentType createJavaPersistentType(IType primaryType) {
-		Type type = new Type(primaryType, this.modifySharedDocumentCommandExecutorProvider());
-		return JpaJavaFactory.eINSTANCE.createJavaPersistentType(type);
+	public JavaPersistentType createJavaPersistentType() {
+		return JpaJavaFactory.eINSTANCE.createJavaPersistentType();
 	}
-	
-	/**
-	 * delegate to the type's project (there is one provider per project)
-	 */
-	private CommandExecutorProvider modifySharedDocumentCommandExecutorProvider() {
-		return this.getJpaProject().modifySharedDocumentCommandExecutorProvider();
+
+	private JavaPersistentType addJavaPersistentType(JavaPersistentType javaPersistentType, IType primaryType, CompilationUnit astRoot) {
+		this.getTypes().add(javaPersistentType);
+		javaPersistentType.setJdtType(primaryType, astRoot);
+		return javaPersistentType;
 	}
 
 	public IJpaContentNode getContentNode(int offset) {
@@ -400,7 +399,7 @@
 			JavaPersistentType persistentType = this.persistentTypeFor(iType);
 			if (persistentType == null) {
 				if (AttributeAnnotationTools.typeIsPersistable(iType)) {
-					persistentType = this.addJavaPersistentType(iType);
+					persistentType = this.addJavaPersistentType(iType, astRoot);
 				}
 			}
 			if (persistentType != null) {
@@ -447,8 +446,8 @@
 		return EmptyIterator.instance();
 	}
 
-	private CompilationUnit astRoot() {
-		return JDTTools.buildASTRoot(this.compilationUnit);
+	public CompilationUnit astRoot() {
+		return JDTTools.createASTRoot(this.compilationUnit);
 	}
 
 	public void dispose() {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JpaJavaFactory.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JpaJavaFactory.java
index 1509894..ff55bf5 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JpaJavaFactory.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JpaJavaFactory.java
@@ -15,7 +15,6 @@
 import org.eclipse.emf.ecore.impl.EFactoryImpl;
 import org.eclipse.emf.ecore.plugin.EcorePlugin;
 import org.eclipse.jpt.core.internal.jdtutility.Attribute;
-import org.eclipse.jpt.core.internal.jdtutility.Type;
 
 /**
  * <!-- begin-user-doc -->
@@ -93,13 +92,13 @@
 		return jpaCompilationUnit;
 	}
 
-	
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public JavaPersistentType createJavaPersistentType() {
-		throw new UnsupportedOperationException();
-	}
-	
-	public JavaPersistentType createJavaPersistentType(Type type) {
-		JavaPersistentType javaPersistentType = new JavaPersistentType(type);
+		JavaPersistentType javaPersistentType = new JavaPersistentType();
 		return javaPersistentType;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JpaJavaPackage.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JpaJavaPackage.java
index 96454e5..d624b57 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JpaJavaPackage.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JpaJavaPackage.java
@@ -654,7 +654,9 @@
 		initEReference(getJavaPersistentAttribute_DefaultMapping(), this.getIJavaAttributeMapping(), null, "defaultMapping", null, 1, 1, JavaPersistentAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getJavaPersistentAttribute_SpecifiedMapping(), this.getIJavaAttributeMapping(), null, "specifiedMapping", null, 1, 1, JavaPersistentAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEClass(iJavaTypeMappingEClass, IJavaTypeMapping.class, "IJavaTypeMapping", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		addEOperation(iJavaTypeMappingEClass, null, "initialize", 0, 1, IS_UNIQUE, IS_ORDERED);
 		initEClass(iJavaAttributeMappingEClass, IJavaAttributeMapping.class, "IJavaAttributeMapping", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		addEOperation(iJavaAttributeMappingEClass, null, "initialize", 0, 1, IS_UNIQUE, IS_ORDERED);
 		// Create resource
 		createResource(eNS_URI);
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaAttributeMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaAttributeMapping.java
index c92d571..a12eeea 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaAttributeMapping.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaAttributeMapping.java
@@ -42,7 +42,6 @@
 	private final Attribute attribute;
 
 	// TODO remove?
-	@SuppressWarnings("unused")
 	private final AnnotationAdapter annotationAdapter;
 
 	protected JavaAttributeMapping() {
@@ -77,6 +76,10 @@
 		return JpaJavaMappingsPackage.Literals.JAVA_ATTRIBUTE_MAPPING;
 	}
 
+	public void initialize() {
+		this.updateFromJava(this.attribute.astRoot());
+	}
+
 	public JavaPersistentAttribute getPersistentAttribute() {
 		return (JavaPersistentAttribute) this.eContainer();
 	}
@@ -98,7 +101,7 @@
 	}
 
 	public ITextRange validationTextRange() {
-		ITextRange textRange = this.attribute.annotationTextRange(this.declarationAnnotationAdapter());
+		ITextRange textRange = attribute.annotationTextRange(this.declarationAnnotationAdapter());
 		return (textRange == null) ? this.getPersistentAttribute().validationTextRange() : textRange;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaBasic.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaBasic.java
index 94c40f9..d939946 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaBasic.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaBasic.java
@@ -15,6 +15,13 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.jdt.core.WorkingCopyOwner;
+import org.eclipse.jdt.core.dom.BooleanLiteral;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jpt.core.internal.IMappingKeys;
 import org.eclipse.jpt.core.internal.jdtutility.AnnotationAdapter;
@@ -26,6 +33,7 @@
 import org.eclipse.jpt.core.internal.jdtutility.DeclarationAnnotationAdapter;
 import org.eclipse.jpt.core.internal.jdtutility.DeclarationAnnotationElementAdapter;
 import org.eclipse.jpt.core.internal.jdtutility.EnumDeclarationAnnotationElementAdapter;
+import org.eclipse.jpt.core.internal.jdtutility.JDTTools;
 import org.eclipse.jpt.core.internal.jdtutility.MemberAnnotationAdapter;
 import org.eclipse.jpt.core.internal.jdtutility.ShortCircuitAnnotationElementAdapter;
 import org.eclipse.jpt.core.internal.jdtutility.SimpleBooleanAnnotationAdapter;
@@ -38,6 +46,7 @@
 import org.eclipse.jpt.core.internal.mappings.IColumnMapping;
 import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
 import org.eclipse.jpt.core.internal.mappings.TemporalType;
+import org.eclipse.jpt.utility.internal.CollectionTools;
 import org.eclipse.jpt.utility.internal.Filter;
 
 /**
@@ -743,13 +752,175 @@
 
 	// ********** static methods **********
 	private static DeclarationAnnotationElementAdapter<String> buildOptionalAdapter() {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(DECLARATION_ANNOTATION_ADAPTER, JPA.BASIC__OPTIONAL, false, BooleanStringExpressionConverter.instance());
+		return new ConversionDeclarationAnnotationElementAdapter<String, BooleanLiteral>(DECLARATION_ANNOTATION_ADAPTER, JPA.BASIC__OPTIONAL, false, BooleanStringExpressionConverter.instance());
 	}
 
 	private static DeclarationAnnotationElementAdapter<String> buildFetchAdapter() {
 		return new EnumDeclarationAnnotationElementAdapter(DECLARATION_ANNOTATION_ADAPTER, JPA.BASIC__FETCH, false);
 	}
 
+	/**
+	 * From the JPA spec, when the basic mapping applies:
+	 * If the type of the attribute (field or property) is one of the following
+	 * it must be mapped as @Basic:
+	 *     primitive types
+	 *     byte[]
+	 *     Byte[]
+	 *     char[]
+	 *     Character[]
+	 *     primitive wrappers
+	 *     java.lang.String
+	 *     java.math.BigInteger
+	 *     java.math.BigDecimal
+	 *     java.util.Date
+	 *     java.util.Calendar
+	 *     java.sql.Date
+	 *     java.sql.Time
+	 *     java.sql.Timestamp
+	 *     enums
+	 *     any other type that implements java.io.Serializable
+	 */
+	public static boolean signatureIsBasic(String signature, IType scope) {
+		if (JDTTools.signatureIsPrimitive(signature)) {
+			return true;
+		}
+		int arrayCount = Signature.getArrayCount(signature);
+		if (arrayCount > 1) {
+			return false; // multi-dimensional arrays are not supported
+		}
+		signature = Signature.getElementType(signature);
+		String typeName = JDTTools.resolveSignature(signature, scope);
+		if (typeName == null) {
+			return false; // unable to resolve the type
+		}
+		if (arrayCount == 1) {
+			return elementTypeIsValid(typeName);
+		}
+		if (typeIsPrimitiveWrapper(typeName)) {
+			return true;
+		}
+		if (typeIsOtherSupportedType(typeName)) {
+			return true;
+		}
+		IType type = findType(scope.getCompilationUnit().getJavaProject(), typeName);
+		if (type == null) {
+			return false; // type not found
+		}
+		if (typeIsEnum(type)) {
+			return true;
+		}
+		if (typeImplementsSerializable(type)) {
+			return true;
+		}
+		return false;
+	}
+
+	private static IType findType(IJavaProject javaProject, String typeName) {
+		try {
+			return javaProject.findType(typeName);
+		}
+		catch (JavaModelException ex) {
+			throw new RuntimeException(ex);
+		}
+	}
+
+	/**
+	 * Return whether the specified type is a valid element type for
+	 * a one-dimensional array:
+	 *     byte
+	 *     char
+	 *     java.lang.Byte
+	 *     java.lang.Character
+	 */
+	private static boolean elementTypeIsValid(String elementTypeName) {
+		return CollectionTools.contains(VALID_ELEMENT_TYPE_NAMES, elementTypeName);
+	}
+
+	private static final String[] VALID_ELEMENT_TYPE_NAMES = {
+		byte.class.getName(),
+		char.class.getName(),
+		java.lang.Byte.class.getName(),
+		java.lang.Character.class.getName()
+	};
+
+	/**
+	 * Return whether the specified type is a primitive wrapper.
+	 */
+	private static boolean typeIsPrimitiveWrapper(String typeName) {
+		return CollectionTools.contains(PRIMITIVE_WRAPPER_TYPE_NAMES, typeName);
+	}
+
+	private static final String[] PRIMITIVE_WRAPPER_TYPE_NAMES = {
+		java.lang.Byte.class.getName(),
+		java.lang.Character.class.getName(),
+		java.lang.Double.class.getName(),
+		java.lang.Float.class.getName(),
+		java.lang.Integer.class.getName(),
+		java.lang.Long.class.getName(),
+		java.lang.Short.class.getName(),
+		java.lang.Boolean.class.getName(),
+	};
+
+	/**
+	 * Return whether the specified type is among the various other types
+	 * that default to a Basic mapping.
+	 */
+	private static boolean typeIsOtherSupportedType(String typeName) {
+		return CollectionTools.contains(OTHER_SUPPORTED_TYPE_NAMES, typeName);
+	}
+
+	private static final String[] OTHER_SUPPORTED_TYPE_NAMES = {
+		java.lang.String.class.getName(),
+		java.math.BigInteger.class.getName(),
+		java.math.BigDecimal.class.getName(),
+		java.util.Date.class.getName(),
+		java.util.Calendar.class.getName(),
+		java.sql.Date.class.getName(),
+		java.sql.Time.class.getName(),
+		java.sql.Timestamp.class.getName(),
+	};
+
+	/**
+	 * Return whether the specified type is an enum.
+	 */
+	private static boolean typeIsEnum(IType type) {
+		try {
+			return type.isEnum();
+		}
+		catch (JavaModelException ex) {
+			throw new RuntimeException(ex);
+		}
+	}
+
+	/**
+	 * Return whether the specified type implements java.io.Serializable.
+	 */
+	// TODO should we be using IType.getSuperInterfaceTypeSignatures() instead?
+	// would this be less of a performance hog??
+	private static boolean typeImplementsSerializable(IType type) {
+		ITypeHierarchy hierarchy = typeHierarchy(type);
+		IType[] interfaces = hierarchy.getAllSuperInterfaces(type);
+		for (int i = interfaces.length; i-- > 0;) {
+			if (interfaces[i].getFullyQualifiedName().equals(SERIALIZABLE_TYPE_NAME)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	private static final String SERIALIZABLE_TYPE_NAME = java.io.Serializable.class.getName();
+
+	private static ITypeHierarchy typeHierarchy(IType type) {
+		// TODO hmm... what to do about the working copy, probably shouldn't pass in null;
+		// also, this looks like a performance hog, other ways to do this?
+		try {
+			return type.newSupertypeHierarchy((WorkingCopyOwner) null, null);
+		}
+		catch (JavaModelException ex) {
+			throw new RuntimeException(ex);
+		}
+	}
+
 	@Override
 	public boolean isOverridableAttributeMapping() {
 		return true;
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaBasicProvider.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaBasicProvider.java
index 444c947..956c485 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaBasicProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaBasicProvider.java
@@ -9,15 +9,19 @@
  ******************************************************************************/
 package org.eclipse.jpt.core.internal.content.java.mappings;
 
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.ITypeBinding;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.jdt.core.WorkingCopyOwner;
 import org.eclipse.jpt.core.internal.IJpaFactory;
 import org.eclipse.jpt.core.internal.IMappingKeys;
 import org.eclipse.jpt.core.internal.content.java.IDefaultJavaAttributeMappingProvider;
 import org.eclipse.jpt.core.internal.content.java.IJavaAttributeMapping;
 import org.eclipse.jpt.core.internal.jdtutility.Attribute;
 import org.eclipse.jpt.core.internal.jdtutility.DeclarationAnnotationAdapter;
+import org.eclipse.jpt.core.internal.jdtutility.JDTTools;
 import org.eclipse.jpt.core.internal.platform.DefaultsContext;
 import org.eclipse.jpt.utility.internal.CollectionTools;
 
@@ -50,8 +54,7 @@
 	}
 
 	public boolean defaultApplies(Attribute attribute, DefaultsContext defaultsContext) {
-		CompilationUnit astRoot = defaultsContext.astRoot();
-		return typeIsBasic(attribute.typeBinding(astRoot), astRoot.getAST());
+		return signatureIsBasic(attribute.typeSignature(), attribute.getDeclaringType().getJdtMember());
 	}
 
 	public IJavaAttributeMapping buildMapping(Attribute attribute, IJpaFactory factory) {
@@ -85,39 +88,49 @@
 	 *     enums
 	 *     any other type that implements java.io.Serializable
 	 */
-	public static boolean typeIsBasic(ITypeBinding typeBinding, AST ast) {
-		if (typeBinding == null) {
-			return false; // type not found
-		}
-		if (typeBinding.isPrimitive()) {
+	public static boolean signatureIsBasic(String signature, IType scope) {
+		if (JDTTools.signatureIsPrimitive(signature)) {
 			return true;
 		}
-		if (typeBinding.isArray()) {
-			if (typeBinding.getDimensions() > 1) {
-				return false; // multi-dimensional arrays are not supported
-			}
-			ITypeBinding elementTypeBinding = typeBinding.getElementType();
-			if (elementTypeBinding == null) {
-				return false;// unable to resolve the type
-			}
-			return elementTypeIsValid(elementTypeBinding.getQualifiedName());
+		int arrayCount = Signature.getArrayCount(signature);
+		if (arrayCount > 1) {
+			return false;  // multi-dimensional arrays are not supported
 		}
-		String typeName = typeBinding.getQualifiedName();
+		signature = Signature.getElementType(signature);
+		String typeName = JDTTools.resolveSignature(signature, scope);
+		if (typeName == null) {
+			return false;  // unable to resolve the type
+		}
+		if (arrayCount == 1) {
+			return elementTypeIsValid(typeName);
+		}
 		if (typeIsPrimitiveWrapper(typeName)) {
 			return true;
 		}
 		if (typeIsOtherSupportedType(typeName)) {
 			return true;
 		}
-		if (typeBinding.isEnum()) {
+		IType type = findType(scope.getCompilationUnit().getJavaProject(), typeName);
+		if (type == null) {
+			return false;  // type not found
+		}
+		if (typeIsEnum(type)) {
 			return true;
 		}
-		if (typeImplementsSerializable(typeBinding, ast)) {
+		if (typeImplementsSerializable(type)) {
 			return true;
 		}
 		return false;
 	}
 
+	private static IType findType(IJavaProject javaProject, String typeName) {
+		try {
+			return javaProject.findType(typeName);
+		} catch (JavaModelException ex) {
+			throw new RuntimeException(ex);
+		}
+	}
+
 	/**
 	 * Return whether the specified type is a valid element type for
 	 * a one-dimensional array:
@@ -173,14 +186,44 @@
 		java.sql.Time.class.getName(),
 		java.sql.Timestamp.class.getName(),
 	};
+
+	/**
+	 * Return whether the specified type is an enum.
+	 */
+	private static boolean typeIsEnum(IType type) {
+		try {
+			return type.isEnum();
+		} catch (JavaModelException ex) {
+			throw new RuntimeException(ex);
+		}
+	}
 	
 	/**
 	 * Return whether the specified type implements java.io.Serializable.
 	 */
-	private static boolean typeImplementsSerializable(ITypeBinding typeBinding, AST ast) {
-		ITypeBinding serializableTypeBinding = ast.resolveWellKnownType(SERIALIZABLE_TYPE_NAME);
-		return typeBinding.isAssignmentCompatible(serializableTypeBinding);
+	// TODO should we be using IType.getSuperInterfaceTypeSignatures() instead?
+	// would this be less of a performance hog??
+	private static boolean typeImplementsSerializable(IType type) {
+		ITypeHierarchy hierarchy = typeHierarchy(type);
+		IType[] interfaces = hierarchy.getAllSuperInterfaces(type);
+		for (int i = interfaces.length; i-- > 0; ) {
+			if (interfaces[i].getFullyQualifiedName().equals(SERIALIZABLE_TYPE_NAME)) {
+				return true;
+			}
+		}
+		return false;
 	}
 
 	private static final String SERIALIZABLE_TYPE_NAME = java.io.Serializable.class.getName();
+
+	private static ITypeHierarchy typeHierarchy(IType type) {
+		// TODO hmm... what to do about the working copy, probably shouldn't pass in null;
+		// also, this looks like a performance hog, other ways to do this?
+		try {
+			return type.newSupertypeHierarchy((WorkingCopyOwner) null, null);
+		} catch (JavaModelException ex) {
+			throw new RuntimeException(ex);
+		}
+	}
+
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaColumn.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaColumn.java
index b353416..c0f8a3c 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaColumn.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaColumn.java
@@ -42,27 +42,17 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int LENGTH_EDEFAULT = 0;
+	protected static final int LENGTH_EDEFAULT = 255;
 
 	/**
-	 * The default value of the '{@link #getSpecifiedLength() <em>Specified Length</em>}' attribute.
+	 * The cached value of the '{@link #getLength() <em>Length</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getSpecifiedLength()
+	 * @see #getLength()
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int SPECIFIED_LENGTH_EDEFAULT = -1;
-
-	/**
-	 * The cached value of the '{@link #getSpecifiedLength() <em>Specified Length</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSpecifiedLength()
-	 * @generated
-	 * @ordered
-	 */
-	protected int specifiedLength = SPECIFIED_LENGTH_EDEFAULT;
+	protected int length = LENGTH_EDEFAULT;
 
 	/**
 	 * The default value of the '{@link #getPrecision() <em>Precision</em>}' attribute.
@@ -75,24 +65,14 @@
 	protected static final int PRECISION_EDEFAULT = 0;
 
 	/**
-	 * The default value of the '{@link #getSpecifiedPrecision() <em>Specified Precision</em>}' attribute.
+	 * The cached value of the '{@link #getPrecision() <em>Precision</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getSpecifiedPrecision()
+	 * @see #getPrecision()
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int SPECIFIED_PRECISION_EDEFAULT = -1;
-
-	/**
-	 * The cached value of the '{@link #getSpecifiedPrecision() <em>Specified Precision</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSpecifiedPrecision()
-	 * @generated
-	 * @ordered
-	 */
-	protected int specifiedPrecision = SPECIFIED_PRECISION_EDEFAULT;
+	protected int precision = PRECISION_EDEFAULT;
 
 	/**
 	 * The default value of the '{@link #getScale() <em>Scale</em>}' attribute.
@@ -105,24 +85,14 @@
 	protected static final int SCALE_EDEFAULT = 0;
 
 	/**
-	 * The default value of the '{@link #getSpecifiedScale() <em>Specified Scale</em>}' attribute.
+	 * The cached value of the '{@link #getScale() <em>Scale</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getSpecifiedScale()
+	 * @see #getScale()
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int SPECIFIED_SCALE_EDEFAULT = -1;
-
-	/**
-	 * The cached value of the '{@link #getSpecifiedScale() <em>Specified Scale</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSpecifiedScale()
-	 * @generated
-	 * @ordered
-	 */
-	protected int specifiedScale = SPECIFIED_SCALE_EDEFAULT;
+	protected int scale = SCALE_EDEFAULT;
 
 	private final IntAnnotationElementAdapter lengthAdapter;
 
@@ -208,130 +178,104 @@
 		return JpaJavaMappingsPackage.Literals.JAVA_COLUMN;
 	}
 
+	/**
+	 * Returns the value of the '<em><b>Length</b></em>' attribute.
+	 * The default value is <code>"255"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Length</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Length</em>' attribute.
+	 * @see #setLength(int)
+	 * @see org.eclipse.jpt.core.internal.content.java.mappings.JpaJavaMappingsPackage#getIColumn_Length()
+	 * @model default="255"
+	 * @generated
+	 */
 	public int getLength() {
-		return (this.getSpecifiedLength() == SPECIFIED_LENGTH_EDEFAULT) ? getDefaultLength() : this.getSpecifiedLength();
+		return length;
 	}
 
 	/**
-	 * Returns the value of the '<em><b>Specified Length</b></em>' attribute.
-	 * The default value is <code>"-1"</code>.
+	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.content.java.mappings.JavaColumn#getLength <em>Length</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Length</em>' attribute.
+	 * @see #getLength()
+	 * @generated
+	 */
+	public void setLength(int newLength) {
+		int oldLength = length;
+		length = newLength;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, JpaJavaMappingsPackage.JAVA_COLUMN__LENGTH, oldLength, length));
+	}
+
+	/**
+	 * Returns the value of the '<em><b>Precision</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <p>
-	 * If the meaning of the '<em>Specified Length</em>' attribute isn't clear,
+	 * If the meaning of the '<em>Precision</em>' attribute isn't clear,
 	 * there really should be more of a description here...
 	 * </p>
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Specified Length</em>' attribute.
-	 * @see #setSpecifiedLength(int)
-	 * @see org.eclipse.jpt.core.internal.content.java.mappings.JpaJavaMappingsPackage#getIColumn_SpecifiedLength()
-	 * @model default="-1"
+	 * @return the value of the '<em>Precision</em>' attribute.
+	 * @see #setPrecision(int)
+	 * @see org.eclipse.jpt.core.internal.content.java.mappings.JpaJavaMappingsPackage#getIColumn_Precision()
+	 * @model
 	 * @generated
 	 */
-	public int getSpecifiedLength() {
-		return specifiedLength;
-	}
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.content.java.mappings.JavaColumn#getSpecifiedLength <em>Specified Length</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Specified Length</em>' attribute.
-	 * @see #getSpecifiedLength()
-	 * @generated
-	 */
-	public void setSpecifiedLength(int newSpecifiedLength) {
-		int oldSpecifiedLength = specifiedLength;
-		specifiedLength = newSpecifiedLength;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_LENGTH, oldSpecifiedLength, specifiedLength));
-	}
-
 	public int getPrecision() {
-		return (this.getSpecifiedPrecision() == SPECIFIED_PRECISION_EDEFAULT) ? getDefaultPrecision() : this.getSpecifiedPrecision();
+		return precision;
 	}
 
 	/**
-	 * Returns the value of the '<em><b>Specified Precision</b></em>' attribute.
-	 * The default value is <code>"-1"</code>.
+	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.content.java.mappings.JavaColumn#getPrecision <em>Precision</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Precision</em>' attribute.
+	 * @see #getPrecision()
+	 * @generated
+	 */
+	public void setPrecision(int newPrecision) {
+		int oldPrecision = precision;
+		precision = newPrecision;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, JpaJavaMappingsPackage.JAVA_COLUMN__PRECISION, oldPrecision, precision));
+	}
+
+	/**
+	 * Returns the value of the '<em><b>Scale</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <p>
-	 * If the meaning of the '<em>Specified Precision</em>' attribute isn't clear,
+	 * If the meaning of the '<em>Scale</em>' attribute isn't clear,
 	 * there really should be more of a description here...
 	 * </p>
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Specified Precision</em>' attribute.
-	 * @see #setSpecifiedPrecision(int)
-	 * @see org.eclipse.jpt.core.internal.content.java.mappings.JpaJavaMappingsPackage#getIColumn_SpecifiedPrecision()
-	 * @model default="-1"
+	 * @return the value of the '<em>Scale</em>' attribute.
+	 * @see #setScale(int)
+	 * @see org.eclipse.jpt.core.internal.content.java.mappings.JpaJavaMappingsPackage#getIColumn_Scale()
+	 * @model
 	 * @generated
 	 */
-	public int getSpecifiedPrecision() {
-		return specifiedPrecision;
-	}
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.content.java.mappings.JavaColumn#getSpecifiedPrecision <em>Specified Precision</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Specified Precision</em>' attribute.
-	 * @see #getSpecifiedPrecision()
-	 * @generated
-	 */
-	public void setSpecifiedPrecision(int newSpecifiedPrecision) {
-		int oldSpecifiedPrecision = specifiedPrecision;
-		specifiedPrecision = newSpecifiedPrecision;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_PRECISION, oldSpecifiedPrecision, specifiedPrecision));
-	}
-
 	public int getScale() {
-		return (this.getSpecifiedScale() == SPECIFIED_SCALE_EDEFAULT) ? getDefaultScale() : this.getSpecifiedScale();
+		return scale;
 	}
 
 	/**
-	 * Returns the value of the '<em><b>Specified Scale</b></em>' attribute.
-	 * The default value is <code>"-1"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Specified Scale</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Specified Scale</em>' attribute.
-	 * @see #setSpecifiedScale(int)
-	 * @see org.eclipse.jpt.core.internal.content.java.mappings.JpaJavaMappingsPackage#getIColumn_SpecifiedScale()
-	 * @model default="-1"
-	 * @generated
-	 */
-	public int getSpecifiedScale() {
-		return specifiedScale;
-	}
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.content.java.mappings.JavaColumn#getSpecifiedScale <em>Specified Scale</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.content.java.mappings.JavaColumn#getScale <em>Scale</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Specified Scale</em>' attribute.
-	 * @see #getSpecifiedScale()
+	 * @param value the new value of the '<em>Scale</em>' attribute.
+	 * @see #getScale()
 	 * @generated
 	 */
-	public void setSpecifiedScale(int newSpecifiedScale) {
-		int oldSpecifiedScale = specifiedScale;
-		specifiedScale = newSpecifiedScale;
+	public void setScale(int newScale) {
+		int oldScale = scale;
+		scale = newScale;
 		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_SCALE, oldSpecifiedScale, specifiedScale));
-	}
-
-	public int getDefaultLength() {
-		return DEFAULT_LENGTH;
-	}
-
-	public int getDefaultPrecision() {
-		return DEFAULT_PRECISION;
-	}
-
-	public int getDefaultScale() {
-		return DEFAULT_SCALE;
+			eNotify(new ENotificationImpl(this, Notification.SET, JpaJavaMappingsPackage.JAVA_COLUMN__SCALE, oldScale, scale));
 	}
 
 	/**
@@ -344,16 +288,10 @@
 		switch (featureID) {
 			case JpaJavaMappingsPackage.JAVA_COLUMN__LENGTH :
 				return new Integer(getLength());
-			case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_LENGTH :
-				return new Integer(getSpecifiedLength());
 			case JpaJavaMappingsPackage.JAVA_COLUMN__PRECISION :
 				return new Integer(getPrecision());
-			case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_PRECISION :
-				return new Integer(getSpecifiedPrecision());
 			case JpaJavaMappingsPackage.JAVA_COLUMN__SCALE :
 				return new Integer(getScale());
-			case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_SCALE :
-				return new Integer(getSpecifiedScale());
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -366,14 +304,14 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_LENGTH :
-				setSpecifiedLength(((Integer) newValue).intValue());
+			case JpaJavaMappingsPackage.JAVA_COLUMN__LENGTH :
+				setLength(((Integer) newValue).intValue());
 				return;
-			case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_PRECISION :
-				setSpecifiedPrecision(((Integer) newValue).intValue());
+			case JpaJavaMappingsPackage.JAVA_COLUMN__PRECISION :
+				setPrecision(((Integer) newValue).intValue());
 				return;
-			case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_SCALE :
-				setSpecifiedScale(((Integer) newValue).intValue());
+			case JpaJavaMappingsPackage.JAVA_COLUMN__SCALE :
+				setScale(((Integer) newValue).intValue());
 				return;
 		}
 		super.eSet(featureID, newValue);
@@ -387,14 +325,14 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_LENGTH :
-				setSpecifiedLength(SPECIFIED_LENGTH_EDEFAULT);
+			case JpaJavaMappingsPackage.JAVA_COLUMN__LENGTH :
+				setLength(LENGTH_EDEFAULT);
 				return;
-			case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_PRECISION :
-				setSpecifiedPrecision(SPECIFIED_PRECISION_EDEFAULT);
+			case JpaJavaMappingsPackage.JAVA_COLUMN__PRECISION :
+				setPrecision(PRECISION_EDEFAULT);
 				return;
-			case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_SCALE :
-				setSpecifiedScale(SPECIFIED_SCALE_EDEFAULT);
+			case JpaJavaMappingsPackage.JAVA_COLUMN__SCALE :
+				setScale(SCALE_EDEFAULT);
 				return;
 		}
 		super.eUnset(featureID);
@@ -409,17 +347,11 @@
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case JpaJavaMappingsPackage.JAVA_COLUMN__LENGTH :
-				return getLength() != LENGTH_EDEFAULT;
-			case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_LENGTH :
-				return specifiedLength != SPECIFIED_LENGTH_EDEFAULT;
+				return length != LENGTH_EDEFAULT;
 			case JpaJavaMappingsPackage.JAVA_COLUMN__PRECISION :
-				return getPrecision() != PRECISION_EDEFAULT;
-			case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_PRECISION :
-				return specifiedPrecision != SPECIFIED_PRECISION_EDEFAULT;
+				return precision != PRECISION_EDEFAULT;
 			case JpaJavaMappingsPackage.JAVA_COLUMN__SCALE :
-				return getScale() != SCALE_EDEFAULT;
-			case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_SCALE :
-				return specifiedScale != SPECIFIED_SCALE_EDEFAULT;
+				return scale != SCALE_EDEFAULT;
 		}
 		return super.eIsSet(featureID);
 	}
@@ -435,16 +367,10 @@
 			switch (derivedFeatureID) {
 				case JpaJavaMappingsPackage.JAVA_COLUMN__LENGTH :
 					return JpaCoreMappingsPackage.ICOLUMN__LENGTH;
-				case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_LENGTH :
-					return JpaCoreMappingsPackage.ICOLUMN__SPECIFIED_LENGTH;
 				case JpaJavaMappingsPackage.JAVA_COLUMN__PRECISION :
 					return JpaCoreMappingsPackage.ICOLUMN__PRECISION;
-				case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_PRECISION :
-					return JpaCoreMappingsPackage.ICOLUMN__SPECIFIED_PRECISION;
 				case JpaJavaMappingsPackage.JAVA_COLUMN__SCALE :
 					return JpaCoreMappingsPackage.ICOLUMN__SCALE;
-				case JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_SCALE :
-					return JpaCoreMappingsPackage.ICOLUMN__SPECIFIED_SCALE;
 				default :
 					return -1;
 			}
@@ -463,16 +389,10 @@
 			switch (baseFeatureID) {
 				case JpaCoreMappingsPackage.ICOLUMN__LENGTH :
 					return JpaJavaMappingsPackage.JAVA_COLUMN__LENGTH;
-				case JpaCoreMappingsPackage.ICOLUMN__SPECIFIED_LENGTH :
-					return JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_LENGTH;
 				case JpaCoreMappingsPackage.ICOLUMN__PRECISION :
 					return JpaJavaMappingsPackage.JAVA_COLUMN__PRECISION;
-				case JpaCoreMappingsPackage.ICOLUMN__SPECIFIED_PRECISION :
-					return JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_PRECISION;
 				case JpaCoreMappingsPackage.ICOLUMN__SCALE :
 					return JpaJavaMappingsPackage.JAVA_COLUMN__SCALE;
-				case JpaCoreMappingsPackage.ICOLUMN__SPECIFIED_SCALE :
-					return JpaJavaMappingsPackage.JAVA_COLUMN__SPECIFIED_SCALE;
 				default :
 					return -1;
 			}
@@ -490,12 +410,12 @@
 		if (eIsProxy())
 			return super.toString();
 		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (specifiedLength: ");
-		result.append(specifiedLength);
-		result.append(", specifiedPrecision: ");
-		result.append(specifiedPrecision);
-		result.append(", specifiedScale: ");
-		result.append(specifiedScale);
+		result.append(" (length: ");
+		result.append(length);
+		result.append(", precision: ");
+		result.append(precision);
+		result.append(", scale: ");
+		result.append(scale);
 		result.append(')');
 		return result.toString();
 	}
@@ -508,9 +428,9 @@
 	@Override
 	public void updateFromJava(CompilationUnit astRoot) {
 		super.updateFromJava(astRoot);
-		this.setSpecifiedLength(this.lengthAdapter.getValue(astRoot));
-		this.setSpecifiedPrecision(this.precisionAdapter.getValue(astRoot));
-		this.setSpecifiedScale(this.scaleAdapter.getValue(astRoot));
+		this.setLength(this.lengthAdapter.getValue(astRoot));
+		this.setPrecision(this.precisionAdapter.getValue(astRoot));
+		this.setScale(this.scaleAdapter.getValue(astRoot));
 	}
 
 	public void refreshDefaults(DefaultsContext defaultsContext) {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaEmbedded.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaEmbedded.java
index a66613a..0566b30 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaEmbedded.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaEmbedded.java
@@ -574,14 +574,13 @@
 
 	//******* static methods *********
 	public static IEmbeddable embeddableFor(Attribute attribute, DefaultsContext defaultsContext) {
-		CompilationUnit astRoot = defaultsContext.astRoot();
-		String resolvedTypeName = attribute.resolvedTypeName(astRoot);
+		String resolvedTypeName = attribute.resolvedTypeName();
 		if (resolvedTypeName == null) {
 			return null;
 		}
 		IPersistentType persistentType = defaultsContext.persistentType(resolvedTypeName);
 		if (persistentType != null) {
-			if (persistentType.getMappingKey() == IMappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY) {
+			if (persistentType.getMapping() instanceof IEmbeddable) {
 				return (IEmbeddable) persistentType.getMapping();
 			}
 		}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaEmbeddedProvider.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaEmbeddedProvider.java
index 6fa7b07..0d43bba 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaEmbeddedProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaEmbeddedProvider.java
@@ -11,6 +11,7 @@
 
 import org.eclipse.jpt.core.internal.IJpaFactory;
 import org.eclipse.jpt.core.internal.IMappingKeys;
+import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.content.java.IDefaultJavaAttributeMappingProvider;
 import org.eclipse.jpt.core.internal.content.java.IJavaAttributeMapping;
 import org.eclipse.jpt.core.internal.jdtutility.Attribute;
@@ -51,7 +52,15 @@
 	}
 	
 	private IEmbeddable embeddableFor(Attribute attribute, DefaultsContext defaultsContext) {
-		return JavaEmbedded.embeddableFor(attribute, defaultsContext);
+		String resolvedTypeName = attribute.resolvedTypeName();
+		if (resolvedTypeName == null) {
+			return null;
+		}
+		IPersistentType persistentType = defaultsContext.persistentType(resolvedTypeName);
+		if (persistentType != null && persistentType.getMappingKey() == IMappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY) {
+			return (IEmbeddable) persistentType.getMapping();
+		}
+		return null;
 	}
 
 	public IJavaAttributeMapping buildMapping(Attribute attribute, IJpaFactory factory) {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaEntity.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaEntity.java
index f96ea4c..be1dcd9 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaEntity.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaEntity.java
@@ -23,6 +23,7 @@
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.jdt.core.dom.Annotation;
 import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.TypeLiteral;
 import org.eclipse.jpt.core.internal.IMappingKeys;
 import org.eclipse.jpt.core.internal.IPersistentAttribute;
 import org.eclipse.jpt.core.internal.IPersistentType;
@@ -3005,6 +3006,6 @@
 
 	// ********** static methods **********
 	private static DeclarationAnnotationElementAdapter<String> buildIdClassValueAdapter() {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(ID_CLASS_ADAPTER, JPA.ID_CLASS__VALUE, false, SimpleTypeStringExpressionConverter.instance());
+		return new ConversionDeclarationAnnotationElementAdapter<String, TypeLiteral>(ID_CLASS_ADAPTER, JPA.ID_CLASS__VALUE, false, SimpleTypeStringExpressionConverter.instance());
 	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaGenerator.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaGenerator.java
index 25c53ac..8066e53 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaGenerator.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaGenerator.java
@@ -13,6 +13,7 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.NumberLiteral;
 import org.eclipse.jpt.core.internal.ITextRange;
 import org.eclipse.jpt.core.internal.content.java.JavaEObject;
 import org.eclipse.jpt.core.internal.jdtutility.AnnotationElementAdapter;
@@ -564,6 +565,6 @@
 	}
 
 	protected static DeclarationAnnotationElementAdapter<String> buildNumberAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, elementName, NumberStringExpressionConverter.instance());
+		return new ConversionDeclarationAnnotationElementAdapter<String, NumberLiteral>(annotationAdapter, elementName, NumberStringExpressionConverter.instance());
 	}
 } // JavaGenerator
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaJoinColumn.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaJoinColumn.java
index caafa4f..76b27dc 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaJoinColumn.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaJoinColumn.java
@@ -399,10 +399,6 @@
 		return (IJoinColumn.Owner) super.getOwner();
 	}
 
-	public boolean isVirtual() {
-		return getOwner().isVirtual(this);
-	}
-
 	public Table dbReferencedColumnTable() {
 		return getOwner().dbReferencedColumnTable();
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaMappedSuperclass.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaMappedSuperclass.java
index 86b4ad7..90a5383 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaMappedSuperclass.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaMappedSuperclass.java
@@ -14,6 +14,7 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.TypeLiteral;
 import org.eclipse.jpt.core.internal.IMappingKeys;
 import org.eclipse.jpt.core.internal.IPersistentAttribute;
 import org.eclipse.jpt.core.internal.jdtutility.AnnotationAdapter;
@@ -336,6 +337,6 @@
 
 	// ********** static methods **********
 	private static DeclarationAnnotationElementAdapter<String> buildIdClassValueAdapter() {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(ID_CLASS_ADAPTER, JPA.ID_CLASS__VALUE, false, SimpleTypeStringExpressionConverter.instance());
+		return new ConversionDeclarationAnnotationElementAdapter<String, TypeLiteral>(ID_CLASS_ADAPTER, JPA.ID_CLASS__VALUE, false, SimpleTypeStringExpressionConverter.instance());
 	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaMultiRelationshipMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaMultiRelationshipMapping.java
index 9ab22db..51e93a8 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaMultiRelationshipMapping.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaMultiRelationshipMapping.java
@@ -15,9 +15,9 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.core.dom.Annotation;
 import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jpt.core.internal.ITextRange;
 import org.eclipse.jpt.core.internal.ITypeMapping;
 import org.eclipse.jpt.core.internal.jdtutility.AnnotationAdapter;
@@ -785,18 +785,18 @@
 	 * another container or an array or a primitive or other Basic type)
 	 */
 	@Override
-	protected String javaDefaultTargetEntity(ITypeBinding typeBinding) {
-		String typeName = super.javaDefaultTargetEntity(typeBinding);
-		return typeNamedIsContainer(typeName) ? javaDefaultTargetEntityFromContainer(typeBinding) : null;
+	protected String javaDefaultTargetEntity(String signature) {
+		String typeName = super.javaDefaultTargetEntity(signature);
+		return typeNamedIsContainer(typeName) ? this.javaDefaultTargetEntityFromContainer(signature) : null;
 	}
 
-	public static String javaDefaultTargetEntityFromContainer(ITypeBinding typeBinding) {
-		ITypeBinding[] typeArguments = typeBinding.getTypeArguments();
-		if (typeArguments.length != 1) {
+	protected String javaDefaultTargetEntityFromContainer(String signature) {
+		String[] parmSignatures = Signature.getTypeArguments(signature);
+		if ((parmSignatures == null) || (parmSignatures.length != 1)) {
 			return null;
 		}
-		ITypeBinding elementTypeBinding = typeArguments[0];
-		String elementTypeName = buildReferenceEntityTypeName(elementTypeBinding);
+		String elementSignature = parmSignatures[0];
+		String elementTypeName = buildReferenceEntityTypeName(elementSignature, jdtType());
 		return typeNamedIsContainer(elementTypeName) ? null : elementTypeName;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaNamedColumn.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaNamedColumn.java
index 3702360..61b7da6 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaNamedColumn.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaNamedColumn.java
@@ -13,7 +13,9 @@
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.jdt.core.dom.BooleanLiteral;
 import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.NumberLiteral;
 import org.eclipse.jpt.core.internal.ITextRange;
 import org.eclipse.jpt.core.internal.content.java.JavaEObject;
 import org.eclipse.jpt.core.internal.jdtutility.AnnotationElementAdapter;
@@ -150,11 +152,11 @@
 	}
 
 	protected DeclarationAnnotationElementAdapter<String> buildBooleanElementAdapter(String elementName) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(this.daa, elementName, BooleanStringExpressionConverter.instance());
+		return new ConversionDeclarationAnnotationElementAdapter<String, BooleanLiteral>(this.daa, elementName, BooleanStringExpressionConverter.instance());
 	}
 
 	protected DeclarationAnnotationElementAdapter<String> buildIntElementAdapter(String elementName) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(this.daa, elementName, NumberStringExpressionConverter.instance());
+		return new ConversionDeclarationAnnotationElementAdapter<String, NumberLiteral>(this.daa, elementName, NumberStringExpressionConverter.instance());
 	}
 
 	protected AnnotationElementAdapter<String> buildShortCircuitElementAdapter(DeclarationAnnotationElementAdapter<String> daea) {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaPrimaryKeyJoinColumn.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaPrimaryKeyJoinColumn.java
index e4e0ea1..3232c34 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaPrimaryKeyJoinColumn.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaPrimaryKeyJoinColumn.java
@@ -454,11 +454,7 @@
 	void removeAnnotation() {
 		this.annotationAdapter.removeAnnotation();
 	}
-	
-	public boolean isVirtual() {
-		return getOwner().isVirtual(this);
-	}
-	
+
 	// ********** static methods **********
 	static JavaPrimaryKeyJoinColumn createSecondaryTableJoinColumn(DeclarationAnnotationAdapter secondaryTableAdapter, IAbstractJoinColumn.Owner owner, Member member, int index) {
 		return JpaJavaMappingsFactory.eINSTANCE.createJavaPrimaryKeyJoinColumn(owner, member, buildSecondaryTableAnnotationAdapter(secondaryTableAdapter, index));
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaRelationshipMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaRelationshipMapping.java
index 69b2d15..9deacff 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaRelationshipMapping.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaRelationshipMapping.java
@@ -15,11 +15,10 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jdt.core.dom.ASTNode;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.Expression;
-import org.eclipse.jdt.core.dom.ITypeBinding;
-import org.eclipse.jdt.core.dom.TypeLiteral;
 import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.ITypeMapping;
 import org.eclipse.jpt.core.internal.jdtutility.AnnotationElementAdapter;
@@ -30,6 +29,7 @@
 import org.eclipse.jpt.core.internal.jdtutility.EnumArrayDeclarationAnnotationElementAdapter;
 import org.eclipse.jpt.core.internal.jdtutility.EnumDeclarationAnnotationElementAdapter;
 import org.eclipse.jpt.core.internal.jdtutility.ExpressionConverter;
+import org.eclipse.jpt.core.internal.jdtutility.JDTTools;
 import org.eclipse.jpt.core.internal.jdtutility.ShortCircuitAnnotationElementAdapter;
 import org.eclipse.jpt.core.internal.jdtutility.SimpleTypeStringExpressionConverter;
 import org.eclipse.jpt.core.internal.jdtutility.StringExpressionConverter;
@@ -549,46 +549,25 @@
 		return result.toString();
 	}
 
-	public String fullyQualifiedTargetEntity(CompilationUnit astRoot) {
-		if (getSpecifiedTargetEntity() == null) {
-			return getDefaultTargetEntity(); //already fully qualified, or null which is fine
-		}
-		//not positive this is the right way to handle this
-		Expression expression = this.targetEntityAdapter.expression(astRoot);
-		if (expression.getNodeType() == ASTNode.TYPE_LITERAL) {
-			ITypeBinding resolvedTypeBinding = ((TypeLiteral) expression).getType().resolveBinding();
-			if (resolvedTypeBinding != null) {
-				return resolvedTypeBinding.getQualifiedName();
-			}
-		}
-		return null;
+	public String fullyQualifiedTargetEntity() {
+		return (getTargetEntity() == null) ? null : JDTTools.resolve(getTargetEntity(), this.jdtType());
 	}
 
 	@Override
 	public void updateFromJava(CompilationUnit astRoot) {
 		super.updateFromJava(astRoot);
-		updateDefaultTargetEntityFromJava(astRoot);
+		setDefaultTargetEntity(this.javaDefaultTargetEntity());
 		setSpecifiedTargetEntity(this.targetEntityAdapter.getValue(astRoot));
 		this.updateFetchFromJava(astRoot);
 		if (this.cascade != null) {
 			((JavaCascade) this.cascade).updateFromJava(astRoot);
 		}
-		else if (cascadeAdapter().expression(getAttribute().modifiedDeclaration(astRoot)) != null) {
+		else if (cascadeAdapter().expression(getAttribute().modifiedDeclaration()) != null) {
 			setCascade(createCascade());
 			((JavaCascade) this.cascade).updateFromJava(astRoot);
 		}
 	}
 
-	private void updateDefaultTargetEntityFromJava(CompilationUnit astRoot) {
-		ITypeBinding typeBinding = getAttribute().typeBinding(astRoot);
-		if (typeBinding != null) {
-			setDefaultTargetEntity(javaDefaultTargetEntity(typeBinding));
-		}
-		else {
-			setDefaultTargetEntity(null);
-		}
-	}
-
 	/**
 	 * delegate to subclasses because there are different 'fetch'
 	 * defaults across the subclasses
@@ -599,16 +578,20 @@
 	 * the default 'targetEntity' is calculated from the attribute type;
 	 * return null if the attribute type cannot possibly be an entity
 	 */
-	protected String javaDefaultTargetEntity(ITypeBinding typeBinding) {
-		return buildReferenceEntityTypeName(typeBinding);
+	protected String javaDefaultTargetEntity() {
+		return this.javaDefaultTargetEntity(this.getAttribute().typeSignature());
 	}
 
-	//	// TODO Embeddable???
-	public static String buildReferenceEntityTypeName(ITypeBinding typeBinding) {
-		if (!typeBinding.isArray()) { // arrays cannot be entities
-			return typeBinding.getTypeDeclaration().getQualifiedName();
+	protected String javaDefaultTargetEntity(String signature) {
+		return buildReferenceEntityTypeName(signature, jdtType());
+	}
+
+	// TODO Embeddable???
+	public static String buildReferenceEntityTypeName(String signature, IType jdtType) {
+		if (Signature.getArrayCount(signature) > 0) {
+			return null; // arrays cannot be entities
 		}
-		return null;
+		return JDTTools.resolve(Signature.toString(signature), jdtType);
 	}
 
 	public IEntity getEntity() {
@@ -622,7 +605,7 @@
 	@Override
 	public void refreshDefaults(DefaultsContext defaultsContext) {
 		super.refreshDefaults(defaultsContext);
-		String targetEntityName = fullyQualifiedTargetEntity(defaultsContext.astRoot());
+		String targetEntityName = fullyQualifiedTargetEntity();
 		if (targetEntityName != null) {
 			IPersistentType persistentType = defaultsContext.persistentType(targetEntityName);
 			if (persistentType != null) {
@@ -671,8 +654,8 @@
 		return buildAnnotationElementAdapter(annotationAdapter, elementName, StringExpressionConverter.instance());
 	}
 
-	protected static DeclarationAnnotationElementAdapter<String> buildAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName, ExpressionConverter<String> converter) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, elementName, false, converter);
+	protected static <T extends Expression> DeclarationAnnotationElementAdapter<String> buildAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName, ExpressionConverter<String, T> converter) {
+		return new ConversionDeclarationAnnotationElementAdapter<String, T>(annotationAdapter, elementName, false, converter);
 	}
 
 	protected static DeclarationAnnotationElementAdapter<String> buildEnumAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName) {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaSecondaryTable.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaSecondaryTable.java
index 4cac806..5b52f1b 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaSecondaryTable.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaSecondaryTable.java
@@ -542,10 +542,6 @@
 		return null;
 	}
 
-	public boolean isVirtual() {
-		return false;
-	}
-	
 	// ********** static methods **********
 	static JavaSecondaryTable createJavaSecondaryTable(Owner owner, Member member, int index) {
 		return JpaJavaMappingsFactory.eINSTANCE.createJavaSecondaryTable(owner, member, buildDeclarationAnnotationAdapter(index));
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaSingleRelationshipMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaSingleRelationshipMapping.java
index 0d325cb..3639e7d 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaSingleRelationshipMapping.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaSingleRelationshipMapping.java
@@ -1,8 +1,8 @@
 /*******************************************************************************
  * Copyright (c) 2006, 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * This program and the accompanying materials are made available under the terms of
+ * the Eclipse Public License v1.0, which accompanies this distribution and is available at
+ * http://www.eclipse.org/legal/epl-v10.html.
  * 
  * Contributors:
  *     Oracle - initial API and implementation
@@ -20,8 +20,8 @@
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.jdt.core.dom.BooleanLiteral;
 import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jpt.core.internal.jdtutility.AnnotationElementAdapter;
 import org.eclipse.jpt.core.internal.jdtutility.Attribute;
 import org.eclipse.jpt.core.internal.jdtutility.BooleanStringExpressionConverter;
@@ -646,8 +646,8 @@
 	 * extend to eliminate any "container" types
 	 */
 	@Override
-	protected String javaDefaultTargetEntity(ITypeBinding typeBinding) {
-		String typeName = super.javaDefaultTargetEntity(typeBinding);
+	protected String javaDefaultTargetEntity() {
+		String typeName = super.javaDefaultTargetEntity();
 		// if the attribute is a container, don't use it
 		return typeNamedIsContainer(typeName) ? null : typeName;
 	}
@@ -681,6 +681,6 @@
 
 	// ********** static methods **********
 	protected static DeclarationAnnotationElementAdapter<String> buildOptionalAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, elementName, false, BooleanStringExpressionConverter.instance());
+		return new ConversionDeclarationAnnotationElementAdapter<String, BooleanLiteral>(annotationAdapter, elementName, false, BooleanStringExpressionConverter.instance());
 	}
 } // JavaSingleRelationshipMapping
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaTypeMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaTypeMapping.java
index 9b62165..ed2ae48 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaTypeMapping.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaTypeMapping.java
@@ -101,6 +101,18 @@
 		return this.getType().getName();
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	public void initialize() {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
 	public IPersistentType getPersistentType() {
 		return (IPersistentType) this.eContainer();
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaUniqueConstraint.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaUniqueConstraint.java
index 51ec6ee..84055b9 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaUniqueConstraint.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JavaUniqueConstraint.java
@@ -17,6 +17,7 @@
 import org.eclipse.emf.ecore.util.EDataTypeEList;
 import org.eclipse.jdt.core.dom.Annotation;
 import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.Expression;
 import org.eclipse.jpt.core.internal.ITextRange;
 import org.eclipse.jpt.core.internal.content.java.JavaEObject;
 import org.eclipse.jpt.core.internal.jdtutility.AnnotationElementAdapter;
@@ -96,11 +97,11 @@
 	}
 
 	protected static DeclarationAnnotationElementAdapter<String[]> buildArrayAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName) {
-		return buildArrayAnnotationElementAdapter(annotationAdapter, elementName, AnnotationStringArrayExpressionConverter.forStrings());
+		return buildArrayAnnotationElementAdapter(annotationAdapter, elementName, AnnotationStringArrayExpressionConverter.forStringLiterals());
 	}
 
-	protected static DeclarationAnnotationElementAdapter<String[]> buildArrayAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName, ExpressionConverter<String[]> converter) {
-		return new ConversionDeclarationAnnotationElementAdapter<String[]>(annotationAdapter, elementName, false, converter);
+	protected static DeclarationAnnotationElementAdapter<String[]> buildArrayAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName, ExpressionConverter<String[], Expression> converter) {
+		return new ConversionDeclarationAnnotationElementAdapter<String[], Expression>(annotationAdapter, elementName, false, converter);
 	}
 
 	@Override
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JpaJavaMappingsPackage.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JpaJavaMappingsPackage.java
index 0bc3cea..a56ff77 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JpaJavaMappingsPackage.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/mappings/JpaJavaMappingsPackage.java
@@ -3421,31 +3421,13 @@
 	public static final int JAVA_COLUMN__LENGTH = ABSTRACT_JAVA_COLUMN_FEATURE_COUNT + 0;
 
 	/**
-	 * The feature id for the '<em><b>Specified Length</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	public static final int JAVA_COLUMN__SPECIFIED_LENGTH = ABSTRACT_JAVA_COLUMN_FEATURE_COUNT + 1;
-
-	/**
 	 * The feature id for the '<em><b>Precision</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	public static final int JAVA_COLUMN__PRECISION = ABSTRACT_JAVA_COLUMN_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Specified Precision</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	public static final int JAVA_COLUMN__SPECIFIED_PRECISION = ABSTRACT_JAVA_COLUMN_FEATURE_COUNT + 3;
+	public static final int JAVA_COLUMN__PRECISION = ABSTRACT_JAVA_COLUMN_FEATURE_COUNT + 1;
 
 	/**
 	 * The feature id for the '<em><b>Scale</b></em>' attribute.
@@ -3454,16 +3436,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	public static final int JAVA_COLUMN__SCALE = ABSTRACT_JAVA_COLUMN_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Specified Scale</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	public static final int JAVA_COLUMN__SPECIFIED_SCALE = ABSTRACT_JAVA_COLUMN_FEATURE_COUNT + 5;
+	public static final int JAVA_COLUMN__SCALE = ABSTRACT_JAVA_COLUMN_FEATURE_COUNT + 2;
 
 	/**
 	 * The number of structural features of the '<em>Java Column</em>' class.
@@ -3472,7 +3445,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	public static final int JAVA_COLUMN_FEATURE_COUNT = ABSTRACT_JAVA_COLUMN_FEATURE_COUNT + 6;
+	public static final int JAVA_COLUMN_FEATURE_COUNT = ABSTRACT_JAVA_COLUMN_FEATURE_COUNT + 3;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmPackage.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmPackage.java
index 10e5d2d..6494a6e 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmPackage.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/OrmPackage.java
@@ -3582,31 +3582,13 @@
 	public static final int XML_COLUMN__LENGTH = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 0;
 
 	/**
-	 * The feature id for the '<em><b>Specified Length</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	public static final int XML_COLUMN__SPECIFIED_LENGTH = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 1;
-
-	/**
 	 * The feature id for the '<em><b>Precision</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	public static final int XML_COLUMN__PRECISION = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Specified Precision</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	public static final int XML_COLUMN__SPECIFIED_PRECISION = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 3;
+	public static final int XML_COLUMN__PRECISION = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 1;
 
 	/**
 	 * The feature id for the '<em><b>Scale</b></em>' attribute.
@@ -3615,16 +3597,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	public static final int XML_COLUMN__SCALE = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Specified Scale</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	public static final int XML_COLUMN__SPECIFIED_SCALE = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 5;
+	public static final int XML_COLUMN__SCALE = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 2;
 
 	/**
 	 * The feature id for the '<em><b>Length For Xml</b></em>' attribute.
@@ -3633,7 +3606,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	public static final int XML_COLUMN__LENGTH_FOR_XML = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 6;
+	public static final int XML_COLUMN__LENGTH_FOR_XML = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 3;
 
 	/**
 	 * The feature id for the '<em><b>Precision For Xml</b></em>' attribute.
@@ -3642,7 +3615,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	public static final int XML_COLUMN__PRECISION_FOR_XML = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 7;
+	public static final int XML_COLUMN__PRECISION_FOR_XML = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 4;
 
 	/**
 	 * The feature id for the '<em><b>Scale For Xml</b></em>' attribute.
@@ -3651,7 +3624,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	public static final int XML_COLUMN__SCALE_FOR_XML = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 8;
+	public static final int XML_COLUMN__SCALE_FOR_XML = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 5;
 
 	/**
 	 * The number of structural features of the '<em>Xml Column</em>' class.
@@ -3660,7 +3633,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	public static final int XML_COLUMN_FEATURE_COUNT = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 9;
+	public static final int XML_COLUMN_FEATURE_COUNT = ABSTRACT_XML_COLUMN_FEATURE_COUNT + 6;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.jpt.core.internal.content.orm.XmlJoinColumn <em>Xml Join Column</em>}' class.
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlAttributeMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlAttributeMapping.java
index 234a8b0..f548a58 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlAttributeMapping.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlAttributeMapping.java
@@ -314,6 +314,10 @@
 	 */
 	public abstract int xmlSequence();
 
+	public void initialize() {
+	//do nothing as this will be handle by the Xml Translators
+	}
+
 	public void refreshDefaults(DefaultsContext defaultsContext) {
 	// do nothing
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlColumn.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlColumn.java
index eddc97a..009f658 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlColumn.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlColumn.java
@@ -9,7 +9,6 @@
  ******************************************************************************/
 package org.eclipse.jpt.core.internal.content.orm;
 
-import java.util.Set;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -48,27 +47,17 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int LENGTH_EDEFAULT = 0;
+	protected static final int LENGTH_EDEFAULT = 255;
 
 	/**
-	 * The default value of the '{@link #getSpecifiedLength() <em>Specified Length</em>}' attribute.
+	 * The cached value of the '{@link #getLength() <em>Length</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getSpecifiedLength()
+	 * @see #getLength()
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int SPECIFIED_LENGTH_EDEFAULT = -1;
-
-	/**
-	 * The cached value of the '{@link #getSpecifiedLength() <em>Specified Length</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSpecifiedLength()
-	 * @generated
-	 * @ordered
-	 */
-	protected int specifiedLength = SPECIFIED_LENGTH_EDEFAULT;
+	protected int length = LENGTH_EDEFAULT;
 
 	/**
 	 * The default value of the '{@link #getPrecision() <em>Precision</em>}' attribute.
@@ -81,24 +70,14 @@
 	protected static final int PRECISION_EDEFAULT = 0;
 
 	/**
-	 * The default value of the '{@link #getSpecifiedPrecision() <em>Specified Precision</em>}' attribute.
+	 * The cached value of the '{@link #getPrecision() <em>Precision</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getSpecifiedPrecision()
+	 * @see #getPrecision()
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int SPECIFIED_PRECISION_EDEFAULT = -1;
-
-	/**
-	 * The cached value of the '{@link #getSpecifiedPrecision() <em>Specified Precision</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSpecifiedPrecision()
-	 * @generated
-	 * @ordered
-	 */
-	protected int specifiedPrecision = SPECIFIED_PRECISION_EDEFAULT;
+	protected int precision = PRECISION_EDEFAULT;
 
 	/**
 	 * The default value of the '{@link #getScale() <em>Scale</em>}' attribute.
@@ -111,24 +90,14 @@
 	protected static final int SCALE_EDEFAULT = 0;
 
 	/**
-	 * The default value of the '{@link #getSpecifiedScale() <em>Specified Scale</em>}' attribute.
+	 * The cached value of the '{@link #getScale() <em>Scale</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getSpecifiedScale()
+	 * @see #getScale()
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int SPECIFIED_SCALE_EDEFAULT = -1;
-
-	/**
-	 * The cached value of the '{@link #getSpecifiedScale() <em>Specified Scale</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSpecifiedScale()
-	 * @generated
-	 * @ordered
-	 */
-	protected int specifiedScale = SPECIFIED_SCALE_EDEFAULT;
+	protected int scale = SCALE_EDEFAULT;
 
 	/**
 	 * The default value of the '{@link #getLengthForXml() <em>Length For Xml</em>}' attribute.
@@ -173,14 +142,6 @@
 		super(owner);
 	}
 
-	@Override
-	protected void addInsignificantXmlFeatureIdsTo(Set<Integer> insignificantXmlFeatureIds) {
-		super.addInsignificantXmlFeatureIdsTo(insignificantXmlFeatureIds);
-		insignificantXmlFeatureIds.add(JpaCoreMappingsPackage.ICOLUMN__LENGTH);
-		insignificantXmlFeatureIds.add(JpaCoreMappingsPackage.ICOLUMN__SCALE);
-		insignificantXmlFeatureIds.add(JpaCoreMappingsPackage.ICOLUMN__PRECISION);
-	}
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -191,148 +152,134 @@
 		return OrmPackage.Literals.XML_COLUMN;
 	}
 
+	/**
+	 * Returns the value of the '<em><b>Length</b></em>' attribute.
+	 * The default value is <code>"255"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Length</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Length</em>' attribute.
+	 * @see #setLength(int)
+	 * @see org.eclipse.jpt.core.internal.content.orm.OrmPackage#getIColumn_Length()
+	 * @model default="255"
+	 * @generated
+	 */
 	public int getLength() {
-		return (this.getSpecifiedLength() == SPECIFIED_LENGTH_EDEFAULT) ? getDefaultLength() : this.getSpecifiedLength();
+		return length;
 	}
 
 	/**
-	 * Returns the value of the '<em><b>Specified Length</b></em>' attribute.
-	 * The default value is <code>"-1"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Specified Length</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Specified Length</em>' attribute.
-	 * @see #setSpecifiedLength(int)
-	 * @see org.eclipse.jpt.core.internal.content.orm.OrmPackage#getIColumn_SpecifiedLength()
-	 * @model default="-1"
-	 * @generated
-	 */
-	public int getSpecifiedLength() {
-		return specifiedLength;
-	}
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.content.orm.XmlColumn#getSpecifiedLength <em>Specified Length</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.content.orm.XmlColumn#getLength <em>Length</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Specified Length</em>' attribute.
-	 * @see #getSpecifiedLength()
+	 * @param value the new value of the '<em>Length</em>' attribute.
+	 * @see #getLength()
 	 * @generated
 	 */
-	public void setSpecifiedLengthGen(int newSpecifiedLength) {
-		int oldSpecifiedLength = specifiedLength;
-		specifiedLength = newSpecifiedLength;
+	public void setLengthGen(int newLength) {
+		int oldLength = length;
+		length = newLength;
 		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, OrmPackage.XML_COLUMN__SPECIFIED_LENGTH, oldSpecifiedLength, specifiedLength));
+			eNotify(new ENotificationImpl(this, Notification.SET, OrmPackage.XML_COLUMN__LENGTH, oldLength, length));
 	}
 
-	public void setSpecifiedLength(int newSpecifiedLength) {
-		setSpecifiedLengthGen(newSpecifiedLength);
-		if (newSpecifiedLength != LENGTH_EDEFAULT) {
+	public void setLength(int newLength) {
+		setLengthGen(newLength);
+		if (newLength != LENGTH_EDEFAULT) {
 			getColumnMapping().makeColumnForXmlNonNull();
 		}
-		setLengthForXml(newSpecifiedLength);
+		setLengthForXml(newLength);
 		if (isAllFeaturesUnset()) {
 			getColumnMapping().makeColumnForXmlNull();
 		}
 	}
 
+	/**
+	 * Returns the value of the '<em><b>Precision</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Precision</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Precision</em>' attribute.
+	 * @see #setPrecision(int)
+	 * @see org.eclipse.jpt.core.internal.content.orm.OrmPackage#getIColumn_Precision()
+	 * @model
+	 * @generated
+	 */
 	public int getPrecision() {
-		return (this.getSpecifiedPrecision() == SPECIFIED_PRECISION_EDEFAULT) ? getDefaultPrecision() : this.getSpecifiedPrecision();
+		return precision;
 	}
 
 	/**
-	 * Returns the value of the '<em><b>Specified Precision</b></em>' attribute.
-	 * The default value is <code>"-1"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Specified Precision</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Specified Precision</em>' attribute.
-	 * @see #setSpecifiedPrecision(int)
-	 * @see org.eclipse.jpt.core.internal.content.orm.OrmPackage#getIColumn_SpecifiedPrecision()
-	 * @model default="-1"
-	 * @generated
-	 */
-	public int getSpecifiedPrecision() {
-		return specifiedPrecision;
-	}
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.content.orm.XmlColumn#getSpecifiedPrecision <em>Specified Precision</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.content.orm.XmlColumn#getPrecision <em>Precision</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Specified Precision</em>' attribute.
-	 * @see #getSpecifiedPrecision()
+	 * @param value the new value of the '<em>Precision</em>' attribute.
+	 * @see #getPrecision()
 	 * @generated
 	 */
-	public void setSpecifiedPrecisionGen(int newSpecifiedPrecision) {
-		int oldSpecifiedPrecision = specifiedPrecision;
-		specifiedPrecision = newSpecifiedPrecision;
+	public void setPrecisionGen(int newPrecision) {
+		int oldPrecision = precision;
+		precision = newPrecision;
 		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, OrmPackage.XML_COLUMN__SPECIFIED_PRECISION, oldSpecifiedPrecision, specifiedPrecision));
+			eNotify(new ENotificationImpl(this, Notification.SET, OrmPackage.XML_COLUMN__PRECISION, oldPrecision, precision));
 	}
 
-	public void setSpecifiedPrecision(int newSpecifiedPrecision) {
-		setSpecifiedPrecisionGen(newSpecifiedPrecision);
-		if (newSpecifiedPrecision != PRECISION_EDEFAULT) {
+	public void setPrecision(int newPrecision) {
+		setPrecisionGen(newPrecision);
+		if (newPrecision != PRECISION_EDEFAULT) {
 			getColumnMapping().makeColumnForXmlNonNull();
 		}
-		setPrecisionForXml(newSpecifiedPrecision);
+		setPrecisionForXml(newPrecision);
 		if (isAllFeaturesUnset()) {
 			getColumnMapping().makeColumnForXmlNull();
 		}
 	}
 
-	public int getScale() {
-		return (this.getSpecifiedScale() == SPECIFIED_SCALE_EDEFAULT) ? getDefaultScale() : this.getSpecifiedScale();
-	}
-
 	/**
-	 * Returns the value of the '<em><b>Specified Scale</b></em>' attribute.
-	 * The default value is <code>"-1"</code>.
+	 * Returns the value of the '<em><b>Scale</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <p>
-	 * If the meaning of the '<em>Specified Scale</em>' attribute isn't clear,
+	 * If the meaning of the '<em>Scale</em>' attribute isn't clear,
 	 * there really should be more of a description here...
 	 * </p>
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Specified Scale</em>' attribute.
-	 * @see #setSpecifiedScale(int)
-	 * @see org.eclipse.jpt.core.internal.content.orm.OrmPackage#getIColumn_SpecifiedScale()
-	 * @model default="-1"
+	 * @return the value of the '<em>Scale</em>' attribute.
+	 * @see #setScale(int)
+	 * @see org.eclipse.jpt.core.internal.content.orm.OrmPackage#getIColumn_Scale()
+	 * @model
 	 * @generated
 	 */
-	public int getSpecifiedScale() {
-		return specifiedScale;
+	public int getScale() {
+		return scale;
 	}
 
 	/**
-	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.content.orm.XmlColumn#getSpecifiedScale <em>Specified Scale</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.content.orm.XmlColumn#getScale <em>Scale</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Specified Scale</em>' attribute.
-	 * @see #getSpecifiedScale()
+	 * @param value the new value of the '<em>Scale</em>' attribute.
+	 * @see #getScale()
 	 * @generated
 	 */
-	public void setSpecifiedScaleGen(int newSpecifiedScale) {
-		int oldSpecifiedScale = specifiedScale;
-		specifiedScale = newSpecifiedScale;
+	public void setScaleGen(int newScale) {
+		int oldScale = scale;
+		scale = newScale;
 		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, OrmPackage.XML_COLUMN__SPECIFIED_SCALE, oldSpecifiedScale, specifiedScale));
+			eNotify(new ENotificationImpl(this, Notification.SET, OrmPackage.XML_COLUMN__SCALE, oldScale, scale));
 	}
 
-	public void setSpecifiedScale(int newSpecifiedScale) {
-		setSpecifiedScaleGen(newSpecifiedScale);
-		if (newSpecifiedScale != SCALE_EDEFAULT) {
+	public void setScale(int newScale) {
+		setScaleGen(newScale);
+		if (newScale != SCALE_EDEFAULT) {
 			getColumnMapping().makeColumnForXmlNonNull();
 		}
-		setScaleForXml(newSpecifiedScale);
+		setScaleForXml(newScale);
 		if (isAllFeaturesUnset()) {
 			getColumnMapping().makeColumnForXmlNull();
 		}
@@ -366,7 +313,7 @@
 	 * @generated NOT
 	 */
 	public void setLengthForXml(int newLengthForXml) {
-		setSpecifiedLengthGen(newLengthForXml);
+		setLengthGen(newLengthForXml);
 		if (eNotificationRequired())
 			//pass in oldValue of null because we don't store the value from the xml, see super.eNotify()
 			eNotify(new ENotificationImpl(this, Notification.SET, OrmPackage.XML_COLUMN__LENGTH_FOR_XML, null, newLengthForXml));
@@ -399,7 +346,7 @@
 	 * @generated NOT
 	 */
 	public void setPrecisionForXml(int newPrecisionForXml) {
-		setSpecifiedPrecisionGen(newPrecisionForXml);
+		setPrecisionGen(newPrecisionForXml);
 		if (eNotificationRequired())
 			//pass in oldValue of null because we don't store the value from the xml, see super.eNotify()
 			eNotify(new ENotificationImpl(this, Notification.SET, OrmPackage.XML_COLUMN__PRECISION_FOR_XML, null, newPrecisionForXml));
@@ -432,24 +379,12 @@
 	 * @generated NOT
 	 */
 	public void setScaleForXml(int newScaleForXml) {
-		setSpecifiedScaleGen(newScaleForXml);
+		setScaleGen(newScaleForXml);
 		if (eNotificationRequired())
 			//pass in oldValue of null because we don't store the value from the xml, see super.eNotify()
 			eNotify(new ENotificationImpl(this, Notification.SET, OrmPackage.XML_COLUMN__SCALE_FOR_XML, null, newScaleForXml));
 	}
 
-	public int getDefaultLength() {
-		return DEFAULT_LENGTH;
-	}
-
-	public int getDefaultPrecision() {
-		return DEFAULT_PRECISION;
-	}
-
-	public int getDefaultScale() {
-		return DEFAULT_SCALE;
-	}
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -460,16 +395,10 @@
 		switch (featureID) {
 			case OrmPackage.XML_COLUMN__LENGTH :
 				return new Integer(getLength());
-			case OrmPackage.XML_COLUMN__SPECIFIED_LENGTH :
-				return new Integer(getSpecifiedLength());
 			case OrmPackage.XML_COLUMN__PRECISION :
 				return new Integer(getPrecision());
-			case OrmPackage.XML_COLUMN__SPECIFIED_PRECISION :
-				return new Integer(getSpecifiedPrecision());
 			case OrmPackage.XML_COLUMN__SCALE :
 				return new Integer(getScale());
-			case OrmPackage.XML_COLUMN__SPECIFIED_SCALE :
-				return new Integer(getSpecifiedScale());
 			case OrmPackage.XML_COLUMN__LENGTH_FOR_XML :
 				return new Integer(getLengthForXml());
 			case OrmPackage.XML_COLUMN__PRECISION_FOR_XML :
@@ -488,14 +417,14 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case OrmPackage.XML_COLUMN__SPECIFIED_LENGTH :
-				setSpecifiedLength(((Integer) newValue).intValue());
+			case OrmPackage.XML_COLUMN__LENGTH :
+				setLength(((Integer) newValue).intValue());
 				return;
-			case OrmPackage.XML_COLUMN__SPECIFIED_PRECISION :
-				setSpecifiedPrecision(((Integer) newValue).intValue());
+			case OrmPackage.XML_COLUMN__PRECISION :
+				setPrecision(((Integer) newValue).intValue());
 				return;
-			case OrmPackage.XML_COLUMN__SPECIFIED_SCALE :
-				setSpecifiedScale(((Integer) newValue).intValue());
+			case OrmPackage.XML_COLUMN__SCALE :
+				setScale(((Integer) newValue).intValue());
 				return;
 			case OrmPackage.XML_COLUMN__LENGTH_FOR_XML :
 				setLengthForXml(((Integer) newValue).intValue());
@@ -518,14 +447,14 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case OrmPackage.XML_COLUMN__SPECIFIED_LENGTH :
-				setSpecifiedLength(SPECIFIED_LENGTH_EDEFAULT);
+			case OrmPackage.XML_COLUMN__LENGTH :
+				setLength(LENGTH_EDEFAULT);
 				return;
-			case OrmPackage.XML_COLUMN__SPECIFIED_PRECISION :
-				setSpecifiedPrecision(SPECIFIED_PRECISION_EDEFAULT);
+			case OrmPackage.XML_COLUMN__PRECISION :
+				setPrecision(PRECISION_EDEFAULT);
 				return;
-			case OrmPackage.XML_COLUMN__SPECIFIED_SCALE :
-				setSpecifiedScale(SPECIFIED_SCALE_EDEFAULT);
+			case OrmPackage.XML_COLUMN__SCALE :
+				setScale(SCALE_EDEFAULT);
 				return;
 			case OrmPackage.XML_COLUMN__LENGTH_FOR_XML :
 				setLengthForXml(LENGTH_FOR_XML_EDEFAULT);
@@ -549,17 +478,11 @@
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case OrmPackage.XML_COLUMN__LENGTH :
-				return getLength() != LENGTH_EDEFAULT;
-			case OrmPackage.XML_COLUMN__SPECIFIED_LENGTH :
-				return specifiedLength != SPECIFIED_LENGTH_EDEFAULT;
+				return length != LENGTH_EDEFAULT;
 			case OrmPackage.XML_COLUMN__PRECISION :
-				return getPrecision() != PRECISION_EDEFAULT;
-			case OrmPackage.XML_COLUMN__SPECIFIED_PRECISION :
-				return specifiedPrecision != SPECIFIED_PRECISION_EDEFAULT;
+				return precision != PRECISION_EDEFAULT;
 			case OrmPackage.XML_COLUMN__SCALE :
-				return getScale() != SCALE_EDEFAULT;
-			case OrmPackage.XML_COLUMN__SPECIFIED_SCALE :
-				return specifiedScale != SPECIFIED_SCALE_EDEFAULT;
+				return scale != SCALE_EDEFAULT;
 			case OrmPackage.XML_COLUMN__LENGTH_FOR_XML :
 				return getLengthForXml() != LENGTH_FOR_XML_EDEFAULT;
 			case OrmPackage.XML_COLUMN__PRECISION_FOR_XML :
@@ -581,16 +504,10 @@
 			switch (derivedFeatureID) {
 				case OrmPackage.XML_COLUMN__LENGTH :
 					return JpaCoreMappingsPackage.ICOLUMN__LENGTH;
-				case OrmPackage.XML_COLUMN__SPECIFIED_LENGTH :
-					return JpaCoreMappingsPackage.ICOLUMN__SPECIFIED_LENGTH;
 				case OrmPackage.XML_COLUMN__PRECISION :
 					return JpaCoreMappingsPackage.ICOLUMN__PRECISION;
-				case OrmPackage.XML_COLUMN__SPECIFIED_PRECISION :
-					return JpaCoreMappingsPackage.ICOLUMN__SPECIFIED_PRECISION;
 				case OrmPackage.XML_COLUMN__SCALE :
 					return JpaCoreMappingsPackage.ICOLUMN__SCALE;
-				case OrmPackage.XML_COLUMN__SPECIFIED_SCALE :
-					return JpaCoreMappingsPackage.ICOLUMN__SPECIFIED_SCALE;
 				default :
 					return -1;
 			}
@@ -609,16 +526,10 @@
 			switch (baseFeatureID) {
 				case JpaCoreMappingsPackage.ICOLUMN__LENGTH :
 					return OrmPackage.XML_COLUMN__LENGTH;
-				case JpaCoreMappingsPackage.ICOLUMN__SPECIFIED_LENGTH :
-					return OrmPackage.XML_COLUMN__SPECIFIED_LENGTH;
 				case JpaCoreMappingsPackage.ICOLUMN__PRECISION :
 					return OrmPackage.XML_COLUMN__PRECISION;
-				case JpaCoreMappingsPackage.ICOLUMN__SPECIFIED_PRECISION :
-					return OrmPackage.XML_COLUMN__SPECIFIED_PRECISION;
 				case JpaCoreMappingsPackage.ICOLUMN__SCALE :
 					return OrmPackage.XML_COLUMN__SCALE;
-				case JpaCoreMappingsPackage.ICOLUMN__SPECIFIED_SCALE :
-					return OrmPackage.XML_COLUMN__SPECIFIED_SCALE;
 				default :
 					return -1;
 			}
@@ -636,12 +547,12 @@
 		if (eIsProxy())
 			return super.toString();
 		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (specifiedLength: ");
-		result.append(specifiedLength);
-		result.append(", specifiedPrecision: ");
-		result.append(specifiedPrecision);
-		result.append(", specifiedScale: ");
-		result.append(specifiedScale);
+		result.append(" (length: ");
+		result.append(length);
+		result.append(", precision: ");
+		result.append(precision);
+		result.append(", scale: ");
+		result.append(scale);
 		result.append(')');
 		return result.toString();
 	}
@@ -655,10 +566,10 @@
 		eUnset(OrmPackage.XML_COLUMN__SPECIFIED_TABLE);
 		eUnset(OrmPackage.XML_COLUMN__COLUMN_DEFINITION);
 		eUnset(OrmPackage.XML_COLUMN__INSERTABLE);
-		eUnset(OrmPackage.XML_COLUMN__SPECIFIED_LENGTH);
+		eUnset(OrmPackage.XML_COLUMN__LENGTH);
 		eUnset(OrmPackage.XML_COLUMN__NULLABLE);
-		eUnset(OrmPackage.XML_COLUMN__SPECIFIED_PRECISION);
-		eUnset(OrmPackage.XML_COLUMN__SPECIFIED_SCALE);
+		eUnset(OrmPackage.XML_COLUMN__PRECISION);
+		eUnset(OrmPackage.XML_COLUMN__SCALE);
 		eUnset(OrmPackage.XML_COLUMN__UNIQUE);
 		eUnset(OrmPackage.XML_COLUMN__UPDATABLE);
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlEmbedded.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlEmbedded.java
index 02b874b..844d79e 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlEmbedded.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlEmbedded.java
@@ -22,7 +22,7 @@
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.jpt.core.internal.IMappingKeys;
 import org.eclipse.jpt.core.internal.IPersistentAttribute;
-import org.eclipse.jpt.core.internal.content.java.mappings.JavaEmbedded;
+import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.jdtutility.Attribute;
 import org.eclipse.jpt.core.internal.mappings.IAttributeOverride;
 import org.eclipse.jpt.core.internal.mappings.IEmbeddable;
@@ -366,6 +366,16 @@
 		if (attribute == null) {
 			return null;
 		}
-		return JavaEmbedded.embeddableFor(attribute, defaultsContext);
+		String resolvedTypeName = attribute.resolvedTypeName();
+		if (resolvedTypeName == null) {
+			return null;
+		}
+		IPersistentType persistentType = defaultsContext.persistentType(resolvedTypeName);
+		if (persistentType != null) {
+			if (persistentType.getMapping() instanceof IEmbeddable) {
+				return (IEmbeddable) persistentType.getMapping();
+			}
+		}
+		return null;
 	}
 } // XmlEmbedded
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlJoinColumn.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlJoinColumn.java
index aa06b04..97ba346 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlJoinColumn.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlJoinColumn.java
@@ -424,10 +424,6 @@
 		setSpecifiedTableForXml(newSpecifiedTable);
 	}
 
-	public boolean isVirtual() {
-		return getOwner().isVirtual(this);
-	}
-	
 	public IJoinColumn.Owner getOwner() {
 		return (IJoinColumn.Owner) this.owner;
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlMultiRelationshipMappingInternal.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlMultiRelationshipMappingInternal.java
index 6e0eb00..91bba67 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlMultiRelationshipMappingInternal.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlMultiRelationshipMappingInternal.java
@@ -16,10 +16,10 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jdt.core.dom.ITypeBinding;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.Signature;
 import org.eclipse.jpt.core.internal.ITextRange;
 import org.eclipse.jpt.core.internal.ITypeMapping;
-import org.eclipse.jpt.core.internal.content.java.mappings.JavaMultiRelationshipMapping;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaRelationshipMapping;
 import org.eclipse.jpt.core.internal.content.orm.resource.OrmXmlMapper;
 import org.eclipse.jpt.core.internal.emfutility.DOMUtilities;
@@ -825,12 +825,22 @@
 	 * another container or an array or a primitive or other Basic type)
 	 */
 	@Override
-	protected String javaDefaultTargetEntity(ITypeBinding typeBinding) {
-		String typeName = super.javaDefaultTargetEntity(typeBinding);
-		return JavaRelationshipMapping.typeNamedIsContainer(typeName) ? this.javaDefaultTargetEntityFromContainer(typeBinding) : null;
+	public String javaDefaultTargetEntity(String signature) {
+		String typeName = super.javaDefaultTargetEntity(signature);
+		return JavaRelationshipMapping.typeNamedIsContainer(typeName) ? this.javaDefaultTargetEntityFromContainer(signature) : null;
 	}
 
-	protected String javaDefaultTargetEntityFromContainer(ITypeBinding typeBinding) {
-		return JavaMultiRelationshipMapping.javaDefaultTargetEntityFromContainer(typeBinding);
+	protected String javaDefaultTargetEntityFromContainer(String signature) {
+		String[] parmSignatures = Signature.getTypeArguments(signature);
+		if ((parmSignatures == null) || (parmSignatures.length != 1)) {
+			return null;
+		}
+		IType iType = getPersistentType().findJdtType();
+		if (iType == null) {
+			return null;
+		}
+		String elementSignature = parmSignatures[0];
+		String elementTypeName = buildReferenceEntityTypeName(elementSignature, iType);
+		return JavaRelationshipMapping.typeNamedIsContainer(elementTypeName) ? null : elementTypeName;
 	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlOverride.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlOverride.java
index fb07765..5b66e1f 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlOverride.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlOverride.java
@@ -221,7 +221,9 @@
 		if (node == null) {
 			return getOwner().validationTextRange();
 		}
-		return super.validationTextRange();
+		else {
+			return super.validationTextRange();
+		}
 	}
 
 	public Owner getOwner() {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlPersistentType.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlPersistentType.java
index 3ccedd5..223ff1c 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlPersistentType.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlPersistentType.java
@@ -25,7 +25,7 @@
 import org.eclipse.emf.ecore.util.EObjectEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.dom.ITypeBinding;
+import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jpt.core.internal.IJpaContentNode;
 import org.eclipse.jpt.core.internal.IJpaFile;
 import org.eclipse.jpt.core.internal.IPersistentAttribute;
@@ -829,6 +829,19 @@
 		return this.parentPersistentType;
 	}
 
+	private String superclassTypeSignature() {
+		IType javaType = this.findJdtType();
+		if (javaType == null) {
+			return null;
+		}
+		try {
+			return javaType.getSuperclassTypeSignature();
+		}
+		catch (JavaModelException ex) {
+			throw new RuntimeException(ex);
+		}
+	}
+
 	public IJpaContentNode getContentNode(int offset) {
 		for (XmlAttributeMapping mapping : this.getSpecifiedAttributeMappings()) {
 			if (mapping.getNode().contains(offset)) {
@@ -843,17 +856,33 @@
 	}
 
 	private void refreshParentPersistentType(DefaultsContext context) {
-		JavaPersistentType javaPersistentType = findJavaPersistentType();
-		if (javaPersistentType == null) {
+		String superclassTypeSignature = this.superclassTypeSignature();
+		if (superclassTypeSignature == null) {
 			this.parentPersistentType = null;
 			return;
 		}
-		//TODO need to fix the performance issue that results here
-		//setting this back for now because of bug 200957 in the M1 release
-		ITypeBinding typeBinding = javaPersistentType.getType().typeBinding(javaPersistentType.getType().astRoot());
-		IPersistentType parentPersistentType = JavaPersistentType.parentPersistentType(context, typeBinding);
-		this.parentPersistentType = parentPersistentType;
-		return;
+		IType jdtType = this.findJdtType();
+		if (jdtType == null) {
+			this.parentPersistentType = null;
+			return;
+		}
+		String fullyQualifiedTypeName = JDTTools.resolveSignature(superclassTypeSignature, jdtType);
+		if (fullyQualifiedTypeName == null) {
+			this.parentPersistentType = null;
+			return;
+		}
+		IPersistentType possibleParent = context.persistentType(fullyQualifiedTypeName);
+		if (possibleParent != null) {
+			if (possibleParent.getMappingKey() != null) {
+				this.parentPersistentType = possibleParent;
+			}
+			else {
+				this.parentPersistentType = possibleParent.parentPersistentType();
+			}
+		}
+		else {
+			this.parentPersistentType = null;
+		}
 	}
 
 	protected Iterator<XmlPersistentAttribute> attributesNamed(final String attributeName) {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlPrimaryKeyJoinColumn.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlPrimaryKeyJoinColumn.java
index 053d369..73ce0d5 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlPrimaryKeyJoinColumn.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlPrimaryKeyJoinColumn.java
@@ -427,8 +427,4 @@
 		setDefaultReferencedColumnName((String) defaultsContext.getDefault(BaseJpaPlatform.DEFAULT_JOIN_COLUMN_REFERENCED_COLUMN_NAME_KEY));
 		setDefaultName((String) defaultsContext.getDefault(BaseJpaPlatform.DEFAULT_JOIN_COLUMN_NAME_KEY));
 	}
-	
-	public boolean isVirtual() {
-		return getOwner().isVirtual(this);
-	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlRelationshipMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlRelationshipMapping.java
index 96debff..2f52b03 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlRelationshipMapping.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlRelationshipMapping.java
@@ -14,11 +14,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.ITypeBinding;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.Signature;
 import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.ITypeMapping;
-import org.eclipse.jpt.core.internal.content.java.mappings.JavaRelationshipMapping;
+import org.eclipse.jpt.core.internal.jdtutility.JDTTools;
 import org.eclipse.jpt.core.internal.mappings.ICascade;
 import org.eclipse.jpt.core.internal.mappings.IEntity;
 import org.eclipse.jpt.core.internal.mappings.IRelationshipMapping;
@@ -511,7 +511,7 @@
 		return null;
 	}
 
-	public String fullyQualifiedTargetEntity(CompilationUnit astRoot) {
+	public String fullyQualifiedTargetEntity() {
 		if (getTargetEntity() == null) {
 			return null;
 		}
@@ -542,7 +542,7 @@
 	public void refreshDefaults(DefaultsContext defaultsContext) {
 		super.refreshDefaults(defaultsContext);
 		setDefaultTargetEntity((String) defaultsContext.getDefault(BaseJpaPlatform.DEFAULT_TARGET_ENTITY_KEY));
-		String targetEntity = fullyQualifiedTargetEntity(defaultsContext.astRoot());
+		String targetEntity = fullyQualifiedTargetEntity();
 		if (targetEntity != null) {
 			IPersistentType persistentType = defaultsContext.persistentType(targetEntity);
 			if (persistentType != null) {
@@ -559,19 +559,23 @@
 	 * the default 'targetEntity' is calculated from the attribute type;
 	 * return null if the attribute type cannot possibly be an entity
 	 */
-	public String javaDefaultTargetEntity(CompilationUnit astRoot) {
-		ITypeBinding typeBinding = this.getPersistentAttribute().getAttribute().typeBinding(astRoot);
-		if (typeBinding != null) {
-			return this.javaDefaultTargetEntity(typeBinding);
+	public String javaDefaultTargetEntity() {
+		return this.javaDefaultTargetEntity(this.getPersistentAttribute().getAttribute().typeSignature());
+	}
+
+	protected String javaDefaultTargetEntity(String signature) {
+		IType iType = getPersistentType().findJdtType();
+		if (iType != null) {
+			return buildReferenceEntityTypeName(signature, iType);
 		}
 		return null;
 	}
 
-	protected String javaDefaultTargetEntity(ITypeBinding typeBinding) {
-		return buildReferenceEntityTypeName(typeBinding);
-	}
-
-	protected String buildReferenceEntityTypeName(ITypeBinding typeBinding) {
-		return JavaRelationshipMapping.buildReferenceEntityTypeName(typeBinding);
+	// TODO Embeddable???
+	public static String buildReferenceEntityTypeName(String signature, IType jdtType) {
+		if (Signature.getArrayCount(signature) > 0) {
+			return null; // arrays cannot be entities
+		}
+		return JDTTools.resolve(Signature.toString(signature), jdtType);
 	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlSecondaryTable.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlSecondaryTable.java
index 7baeead..cdde614 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlSecondaryTable.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlSecondaryTable.java
@@ -54,7 +54,6 @@
 	 */
 	protected EList<IPrimaryKeyJoinColumn> defaultPrimaryKeyJoinColumns;
 
-	@SuppressWarnings("unused")
 	private XmlSecondaryTable() {
 		super();
 	}
@@ -284,8 +283,4 @@
 	public IPrimaryKeyJoinColumn createPrimaryKeyJoinColumn(int index) {
 		return OrmFactory.eINSTANCE.createXmlPrimaryKeyJoinColumn(new ISecondaryTable.PrimaryKeyJoinColumnOwner(this));
 	}
-	
-	public boolean isVirtual() {
-		return entity().getVirtualSecondaryTables().contains(this);
-	}
 } // XmlSecondaryTable
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlTypeMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlTypeMapping.java
index 0609f9e..35a78f1 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlTypeMapping.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/XmlTypeMapping.java
@@ -593,6 +593,10 @@
 		return result.toString();
 	}
 
+	public void initialize() {
+	//do nothing as this will be handle by the Xml Translators
+	}
+
 	/**
 	 * ITypeMapping is changed and various ITypeMappings may have
 	 * common settings.  In this method initialize the new ITypeMapping (this)
@@ -624,7 +628,9 @@
 		if (classNode != null) {
 			return buildTextRange(classNode);
 		}
-		return validationTextRange();
+		else {
+			return validationTextRange();
+		}
 	}
 
 	public ITextRange attributesTextRange() {
@@ -632,7 +638,9 @@
 		if (attributesNode != null) {
 			return buildTextRange(attributesNode);
 		}
-		return validationTextRange();
+		else {
+			return validationTextRange();
+		}
 	}
 
 	/**
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/AttributeMappingsTranslator.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/AttributeMappingsTranslator.java
index 61dd650..71d37e5 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/AttributeMappingsTranslator.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/AttributeMappingsTranslator.java
@@ -132,6 +132,8 @@
 		if (delegate != null) {
 			return delegate.basicGetDependencyObject(parent);
 		}
-		return super.basicGetDependencyObject(parent);
+		else {
+			return super.basicGetDependencyObject(parent);
+		}
 	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/BasicTranslator.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/BasicTranslator.java
index 2d36121..9168a09 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/BasicTranslator.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/orm/resource/BasicTranslator.java
@@ -9,6 +9,7 @@
 package org.eclipse.jpt.core.internal.content.orm.resource;
 
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.jpt.core.internal.mappings.IBasic;
 import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
 import org.eclipse.wst.common.internal.emf.resource.IDTranslator;
@@ -54,6 +55,10 @@
 		};
 	}
 
+	private Translator createPlaceHolderTranslator(String domNameAndPath) {
+		return new Translator(domNameAndPath, (EStructuralFeature) null);
+	}	
+
 	private Translator createFetchTypeTranslator() {
 		return new EnumeratorTranslator(FETCH, JpaCoreMappingsPackage.eINSTANCE.getIBasic_Fetch(), DOM_ATTRIBUTE);
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceTranslator.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceTranslator.java
index f74260b..1e8e0b9 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceTranslator.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/persistence/resource/PersistenceTranslator.java
@@ -26,7 +26,7 @@
 	
 	
 	public PersistenceTranslator() {
-		super(PERSISTENCE, PersistencePackage.eINSTANCE.getPersistence());
+		super(PERSISTENCE, PERSISTENCE_PKG.eINSTANCE.getPersistence());
 	}
 	
 	public Translator[] getChildren(Object target, int versionID) {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/facet/JpaFacetUtils.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/facet/JpaFacetUtils.java
index c48c2b5..1445304 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/facet/JpaFacetUtils.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/facet/JpaFacetUtils.java
@@ -20,6 +20,7 @@
 import org.eclipse.jpt.core.internal.JpaProject;
 import org.eclipse.jpt.core.internal.JptCorePlugin;
 import org.eclipse.jpt.core.internal.platform.generic.GenericPlatform;
+import org.eclipse.jpt.db.internal.ConnectionProfileRepository;
 import org.osgi.service.prefs.BackingStoreException;
 
 public class JpaFacetUtils
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/AbstractExpressionConverter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/AbstractExpressionConverter.java
index 11f4ad3..cd87259 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/AbstractExpressionConverter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/AbstractExpressionConverter.java
@@ -14,35 +14,26 @@
 import org.eclipse.jpt.utility.internal.StringTools;
 
 /**
- * Gather together the common implementation behavior.
+ * Gather together just the tiniest bit of common behavior.
+ * E is the expression type.
  * T is the type of the object to be converted to and from an expression.
- * 
- * We're still figuring out Java Generics here.... The methods in this abstract
- * class work fine with any subclass of Expression E; but a ClassCastException
- * will occur as soon as we call any method implemented by a subclass
- * (e.g. StringExpressionConverter) that expects a particular subclass of
- * Expression (e.g. StringLiteral).
  */
-public abstract class AbstractExpressionConverter<T>
-	implements ExpressionConverter<T>
+public abstract class AbstractExpressionConverter<T, E extends Expression>
+	implements ExpressionConverter<T, E>
 {
 
 	protected AbstractExpressionConverter() {
 		super();
 	}
 
-
-	// ********** object -> expression **********
-
-	public Expression convert(T object, AST ast) {
-		return (object == null) ? this.convertNull(ast) : this.convertObject(object, ast);
+	public E convert(T object, AST ast) {
+		return (object == null) ? this.convertNull(ast) : this.convert_(object, ast);
 	}
 
 	/**
-	 * Return the expression for a null object. By default, a null object will
-	 * be converted into a null expression.
+	 * Return the expression for a null object.
 	 */
-	protected Expression convertNull(AST ast) {
+	protected E convertNull(AST ast) {
 		return null;
 	}
 
@@ -50,18 +41,14 @@
 	 * The specified object is not null.
 	 * @see #convert(T, AST)
 	 */
-	protected abstract Expression convertObject(T object, AST ast);
+	protected abstract E convert_(T object, AST ast);
 
-
-	// ********** expression -> object **********
-
-	public T convert(Expression expression) {
-		return (expression == null) ? this.convertNull() : this.convertExpression(expression);
+	public T convert(E expression) {
+		return (expression == null) ? this.convertNull() : this.convert_(expression);
 	}
 
 	/**
-	 * Return the object for a null expression. By default, a null expression will
-	 * be converted into a null object.
+	 * Return the object for a null expression.
 	 */
 	protected T convertNull() {
 		return null;
@@ -71,7 +58,7 @@
 	 * The specified expression is not null.
 	 * @see #convert(Expression)
 	 */
-	protected abstract T convertExpression(Expression expression);
+	protected abstract T convert_(E expression);
 
 	@Override
 	public String toString() {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/AnnotationStringArrayExpressionConverter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/AnnotationStringArrayExpressionConverter.java
index 21557f6..ad49351 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/AnnotationStringArrayExpressionConverter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/AnnotationStringArrayExpressionConverter.java
@@ -13,6 +13,8 @@
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.ArrayInitializer;
 import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.Name;
+import org.eclipse.jdt.core.dom.StringLiteral;
 
 /**
  * Convert an array initializer or single expression to/from an array of
@@ -20,24 +22,24 @@
  * E is the type of the expressions to be found either standalone or
  * as elements in the array initializer.
  */
-public class AnnotationStringArrayExpressionConverter
-	extends AbstractExpressionConverter<String[]>
+public class AnnotationStringArrayExpressionConverter<E extends Expression>
+	extends AbstractExpressionConverter<String[], Expression>
 {
-	private final ExpressionConverter<String> elementConverter;
-	private final StringArrayExpressionConverter arrayConverter;
+	private final ExpressionConverter<String, E> elementConverter;
+	private final StringArrayExpressionConverter<E> arrayConverter;
 
 
 	/**
 	 * The default behavior is to remove the array initializer if it is empty.
 	 */
-	public AnnotationStringArrayExpressionConverter(ExpressionConverter<String> elementConverter) {
+	public AnnotationStringArrayExpressionConverter(ExpressionConverter<String, E> elementConverter) {
 		this(elementConverter, true);
 	}
 
-	public AnnotationStringArrayExpressionConverter(ExpressionConverter<String> elementConverter, boolean removeArrayInitializerWhenEmpty) {
+	public AnnotationStringArrayExpressionConverter(ExpressionConverter<String, E> elementConverter, boolean removeArrayInitializerWhenEmpty) {
 		super();
 		this.elementConverter = elementConverter;
-		this.arrayConverter = new StringArrayExpressionConverter(elementConverter, removeArrayInitializerWhenEmpty);
+		this.arrayConverter = new StringArrayExpressionConverter<E>(elementConverter, removeArrayInitializerWhenEmpty);
 	}
 
 	/**
@@ -45,11 +47,11 @@
 	 * without braces, instead of an array initializer
 	 */
 	@Override
-	protected Expression convertObject(String[] strings, AST ast) {
+	protected Expression convert_(String[] strings, AST ast) {
 		return (strings.length == 1) ?
 				this.elementConverter.convert(strings[0], ast)
 			:
-				this.arrayConverter.convertObject(strings, ast);
+				this.arrayConverter.convert_(strings, ast);
 	}
 
 	@Override
@@ -62,11 +64,16 @@
 	 * single-entry array
 	 */
 	@Override
-	protected String[] convertExpression(Expression expression) {
+	protected String[] convert_(Expression expression) {
 		return (expression.getNodeType() == ASTNode.ARRAY_INITIALIZER) ?
-				this.arrayConverter.convertArrayInitializer((ArrayInitializer) expression)
+				this.arrayConverter.convert_((ArrayInitializer) expression)
 			:
-				new String[] {this.elementConverter.convert(expression)};
+				new String[] {this.elementConverter.convert(this.downcastExpression(expression))};
+	}
+
+	@SuppressWarnings("unchecked")
+	private E downcastExpression(Expression expression) {
+		return (E) expression;
 	}
 
 
@@ -78,8 +85,8 @@
 	 * or
 	 *     @Foo(bar="text0")
 	 */
-	public static AnnotationStringArrayExpressionConverter forStrings() {
-		return new AnnotationStringArrayExpressionConverter(StringExpressionConverter.instance());
+	public static AnnotationStringArrayExpressionConverter<StringLiteral> forStringLiterals() {
+		return new AnnotationStringArrayExpressionConverter<StringLiteral>(StringExpressionConverter.instance());
 	}
 
 	/**
@@ -88,8 +95,8 @@
 	 * or
 	 *     @Foo(bar=BAZ)
 	 */
-	public static AnnotationStringArrayExpressionConverter forNames() {
-		return new AnnotationStringArrayExpressionConverter(NameStringExpressionConverter.instance());
+	public static AnnotationStringArrayExpressionConverter<Name> forNames() {
+		return new AnnotationStringArrayExpressionConverter<Name>(NameStringExpressionConverter.instance());
 	}
 
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/Attribute.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/Attribute.java
index 60dc958..9fb6f8b 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/Attribute.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/Attribute.java
@@ -10,8 +10,6 @@
 package org.eclipse.jpt.core.internal.jdtutility;
 
 import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jpt.utility.internal.CommandExecutorProvider;
 
 /**
@@ -33,8 +31,14 @@
 
 	public abstract String attributeName();
 
-	public boolean typeIs(String fullyQualifiedTypeName, CompilationUnit astRoot) {
-		return fullyQualifiedTypeName.equals(this.resolvedTypeName(astRoot));
+	public abstract String typeSignature();
+
+	public boolean isPrimitiveType() {
+		return JDTTools.signatureIsPrimitive(this.typeSignature());
+	}
+
+	public boolean typeIs(String fullyQualifiedTypeName) {
+		return fullyQualifiedTypeName.equals(this.resolvedTypeName());
 	}
 
 	/**
@@ -42,14 +46,8 @@
 	 * Return the fully-qualified type name or return null if it cannot be
 	 * resolved unambiguously.
 	 */
-	public String resolvedTypeName(CompilationUnit astRoot) {
-		ITypeBinding typeBinding = typeBinding(astRoot);
-		if (typeBinding != null) {
-			return typeBinding.getQualifiedName();
-		}
-		return null;
+	public String resolvedTypeName() {
+		return JDTTools.resolveSignature(this.typeSignature(), this.getJdtMember().getDeclaringType());
 	}
 
-
-	public abstract ITypeBinding typeBinding(CompilationUnit astRoot);
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/BooleanStringExpressionConverter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/BooleanStringExpressionConverter.java
index f7bf5d6..0f5854e 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/BooleanStringExpressionConverter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/BooleanStringExpressionConverter.java
@@ -10,22 +10,22 @@
 package org.eclipse.jpt.core.internal.jdtutility;
 
 import org.eclipse.jdt.core.dom.AST;
+import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.BooleanLiteral;
-import org.eclipse.jdt.core.dom.Expression;
 
 /**
  * Convert a boolean literal to/from a string representation of a boolean
  * (e.g. "true").
  */
 public final class BooleanStringExpressionConverter
-	extends AbstractExpressionConverter<String>
+	extends AbstractExpressionConverter<String, BooleanLiteral>
 {
-	private static ExpressionConverter<String> INSTANCE;
+	private static ExpressionConverter<String, BooleanLiteral> INSTANCE;
 
 	/**
 	 * Return the singleton.
 	 */
-	public static ExpressionConverter<String> instance() {
+	public static ExpressionConverter<String, BooleanLiteral> instance() {
 		if (INSTANCE == null) {
 			INSTANCE = new BooleanStringExpressionConverter();
 		}
@@ -40,14 +40,16 @@
 	}
 
 	@Override
-	protected BooleanLiteral convertObject(String string, AST ast) {
+	protected BooleanLiteral convert_(String string, AST ast) {
 		return ast.newBooleanLiteral(Boolean.valueOf(string).booleanValue());
 	}
 
 	@Override
-	protected String convertExpression(Expression expression) {
-		Object value = expression.resolveConstantExpressionValue();
-		return (value instanceof Boolean) ? ((Boolean) value).toString() : null;
+	protected String convert_(BooleanLiteral booleanLiteral) {
+		return (booleanLiteral.getNodeType() == ASTNode.BOOLEAN_LITERAL) ?
+			Boolean.toString(booleanLiteral.booleanValue())
+		:
+			null;
 	}
 
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/CharacterStringExpressionConverter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/CharacterStringExpressionConverter.java
index dfc2fdc..1fa055d 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/CharacterStringExpressionConverter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/CharacterStringExpressionConverter.java
@@ -10,22 +10,22 @@
 package org.eclipse.jpt.core.internal.jdtutility;
 
 import org.eclipse.jdt.core.dom.AST;
+import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.CharacterLiteral;
-import org.eclipse.jdt.core.dom.Expression;
 
 /**
  * Convert a character literal to/from a string representation of a character
  * (e.g. "A").
  */
 public final class CharacterStringExpressionConverter
-	extends AbstractExpressionConverter<String>
+	extends AbstractExpressionConverter<String, CharacterLiteral>
 {
-	private static ExpressionConverter<String> INSTANCE;
+	private static ExpressionConverter<String, CharacterLiteral> INSTANCE;
 
 	/**
 	 * Return the singleton.
 	 */
-	public static ExpressionConverter<String> instance() {
+	public static ExpressionConverter<String, CharacterLiteral> instance() {
 		if (INSTANCE == null) {
 			INSTANCE = new CharacterStringExpressionConverter();
 		}
@@ -40,16 +40,18 @@
 	}
 	
 	@Override
-	protected CharacterLiteral convertObject(String string, AST ast) {
+	protected CharacterLiteral convert_(String string, AST ast) {
 		CharacterLiteral characterLiteral = ast.newCharacterLiteral();
 		characterLiteral.setCharValue(string.charAt(0));
 		return characterLiteral;
 	}
 
 	@Override
-	protected String convertExpression(Expression expression) {
-		Object value = expression.resolveConstantExpressionValue();
-		return (value instanceof Character) ? ((Character) value).toString() : null;
+	protected String convert_(CharacterLiteral characterLiteral) {
+		return (characterLiteral.getNodeType() == ASTNode.CHARACTER_LITERAL) ?
+			Character.toString(characterLiteral.charValue())
+		:
+			null;
 	}
 
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/ConversionDeclarationAnnotationElementAdapter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/ConversionDeclarationAnnotationElementAdapter.java
index f6cf010..088fa0c 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/ConversionDeclarationAnnotationElementAdapter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/ConversionDeclarationAnnotationElementAdapter.java
@@ -11,51 +11,78 @@
 
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.StringLiteral;
 import org.eclipse.jpt.utility.internal.StringTools;
 
 /**
  * Wrap a declaration annotation element adapter that deals with AST
  * expressions, converting them to/from various other objects.
  * T is the type of the object to be passed to and returned by the adapter.
+ * E is the type of the expression to be converted by the converter.
  */
-public class ConversionDeclarationAnnotationElementAdapter<T>
+public class ConversionDeclarationAnnotationElementAdapter<T, E extends Expression>
 	implements DeclarationAnnotationElementAdapter<T>
 {
 	/**
 	 * The wrapped adapter that returns and takes AST expressions.
 	 */
-	private final DeclarationAnnotationElementAdapter<Expression> adapter;
+	private final DeclarationAnnotationElementAdapter<E> adapter;
 
 	/**
 	 * The converter that converts AST expressions to other objects
 	 * (e.g. Strings).
 	 */
-	private final ExpressionConverter<T> converter;
+	private final ExpressionConverter<T, E> converter;
 
 
 	// ********** constructors **********
 
 	/**
 	 * The default element name is "value"; the default behavior is to
+	 * remove the annotation when the last element is removed;
+	 * the default expression converter expects string literals.
+	 */
+	public static ConversionDeclarationAnnotationElementAdapter<String, StringLiteral> forStrings(DeclarationAnnotationAdapter annotationAdapter) {
+		return new ConversionDeclarationAnnotationElementAdapter<String, StringLiteral>(annotationAdapter, StringExpressionConverter.instance());
+	}
+
+	/**
+	 * The default element name is "value"; the default behavior is to
 	 * remove the annotation when the last element is removed.
 	 */
-	public ConversionDeclarationAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, ExpressionConverter<T> converter) {
-		this(new ExpressionDeclarationAnnotationElementAdapter<Expression>(annotationAdapter), converter);
+	public ConversionDeclarationAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, ExpressionConverter<T, E> converter) {
+		this(new ExpressionDeclarationAnnotationElementAdapter<E>(annotationAdapter), converter);
+	}
+
+	/**
+	 * The default behavior is to remove the annotation when the last
+	 * element is removed; the default expression converter expects
+	 * string literals.
+	 */
+	public static ConversionDeclarationAnnotationElementAdapter<String, StringLiteral> forStrings(DeclarationAnnotationAdapter annotationAdapter, String elementName) {
+		return new ConversionDeclarationAnnotationElementAdapter<String, StringLiteral>(annotationAdapter, elementName, StringExpressionConverter.instance());
 	}
 
 	/**
 	 * The default behavior is to remove the annotation when the last
 	 * element is removed.
 	 */
-	public ConversionDeclarationAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName, ExpressionConverter<T> converter) {
-		this(new ExpressionDeclarationAnnotationElementAdapter<Expression>(annotationAdapter, elementName), converter);
+	public ConversionDeclarationAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName, ExpressionConverter<T, E> converter) {
+		this(new ExpressionDeclarationAnnotationElementAdapter<E>(annotationAdapter, elementName), converter);
 	}
 
-	public ConversionDeclarationAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName, boolean removeAnnotationWhenEmpty, ExpressionConverter<T> converter) {
-		this(new ExpressionDeclarationAnnotationElementAdapter<Expression>(annotationAdapter, elementName, removeAnnotationWhenEmpty), converter);
+	/**
+	 * The default expression converter expects string literals.
+	 */
+	public static ConversionDeclarationAnnotationElementAdapter<String, StringLiteral> forStrings(DeclarationAnnotationAdapter annotationAdapter, String elementName, boolean removeAnnotationWhenEmpty) {
+		return new ConversionDeclarationAnnotationElementAdapter<String, StringLiteral>(annotationAdapter, elementName, removeAnnotationWhenEmpty, StringExpressionConverter.instance());
 	}
 
-	public ConversionDeclarationAnnotationElementAdapter(DeclarationAnnotationElementAdapter<Expression> adapter, ExpressionConverter<T> converter) {
+	public ConversionDeclarationAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName, boolean removeAnnotationWhenEmpty, ExpressionConverter<T, E> converter) {
+		this(new ExpressionDeclarationAnnotationElementAdapter<E>(annotationAdapter, elementName, removeAnnotationWhenEmpty), converter);
+	}
+
+	public ConversionDeclarationAnnotationElementAdapter(DeclarationAnnotationElementAdapter<E> adapter, ExpressionConverter<T, E> converter) {
 		super();
 		this.adapter = adapter;
 		this.converter = converter;
@@ -85,107 +112,4 @@
 		return StringTools.buildToStringFor(this, this.adapter);
 	}
 
-
-	// ********** factory static methods **********
-
-	/**
-	 * The default element name is "value"; the default behavior is to
-	 * remove the annotation when the last element is removed;
-	 * the default expression converter expects string constant expressions.
-	 */
-	public static ConversionDeclarationAnnotationElementAdapter<String> forStrings(DeclarationAnnotationAdapter annotationAdapter) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, StringExpressionConverter.instance());
-	}
-
-	/**
-	 * The default behavior is to remove the annotation when the last
-	 * element is removed; the default expression converter expects
-	 * string constant expressions.
-	 */
-	public static ConversionDeclarationAnnotationElementAdapter<String> forStrings(DeclarationAnnotationAdapter annotationAdapter, String elementName) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, elementName, StringExpressionConverter.instance());
-	}
-
-	/**
-	 * The default expression converter expects string constant expressions.
-	 */
-	public static ConversionDeclarationAnnotationElementAdapter<String> forStrings(DeclarationAnnotationAdapter annotationAdapter, String elementName, boolean removeAnnotationWhenEmpty) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, elementName, removeAnnotationWhenEmpty, StringExpressionConverter.instance());
-	}
-
-	/**
-	 * The default element name is "value"; the default behavior is to
-	 * remove the annotation when the last element is removed;
-	 * the default expression converter expects number constant expressions.
-	 */
-	public static ConversionDeclarationAnnotationElementAdapter<String> forNumbers(DeclarationAnnotationAdapter annotationAdapter) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, NumberStringExpressionConverter.instance());
-	}
-
-	/**
-	 * The default behavior is to remove the annotation when the last
-	 * element is removed; the default expression converter expects
-	 * number constant expressions.
-	 */
-	public static ConversionDeclarationAnnotationElementAdapter<String> forNumbers(DeclarationAnnotationAdapter annotationAdapter, String elementName) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, elementName, NumberStringExpressionConverter.instance());
-	}
-
-	/**
-	 * The default expression converter expects number constant expressions.
-	 */
-	public static ConversionDeclarationAnnotationElementAdapter<String> forNumbers(DeclarationAnnotationAdapter annotationAdapter, String elementName, boolean removeAnnotationWhenEmpty) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, elementName, removeAnnotationWhenEmpty, NumberStringExpressionConverter.instance());
-	}
-
-	/**
-	 * The default element name is "value"; the default behavior is to
-	 * remove the annotation when the last element is removed;
-	 * the default expression converter expects boolean constant expressions.
-	 */
-	public static ConversionDeclarationAnnotationElementAdapter<String> forBooleans(DeclarationAnnotationAdapter annotationAdapter) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, BooleanStringExpressionConverter.instance());
-	}
-
-	/**
-	 * The default behavior is to remove the annotation when the last
-	 * element is removed; the default expression converter expects
-	 * boolean constant expressions.
-	 */
-	public static ConversionDeclarationAnnotationElementAdapter<String> forBooleans(DeclarationAnnotationAdapter annotationAdapter, String elementName) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, elementName, BooleanStringExpressionConverter.instance());
-	}
-
-	/**
-	 * The default expression converter expects boolean constant expressions.
-	 */
-	public static ConversionDeclarationAnnotationElementAdapter<String> forBooleans(DeclarationAnnotationAdapter annotationAdapter, String elementName, boolean removeAnnotationWhenEmpty) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, elementName, removeAnnotationWhenEmpty, BooleanStringExpressionConverter.instance());
-	}
-
-	/**
-	 * The default element name is "value"; the default behavior is to
-	 * remove the annotation when the last element is removed;
-	 * the default expression converter expects character constant expressions.
-	 */
-	public static ConversionDeclarationAnnotationElementAdapter<String> forCharacters(DeclarationAnnotationAdapter annotationAdapter) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, CharacterStringExpressionConverter.instance());
-	}
-
-	/**
-	 * The default behavior is to remove the annotation when the last
-	 * element is removed; the default expression converter expects
-	 * character constant expressions.
-	 */
-	public static ConversionDeclarationAnnotationElementAdapter<String> forCharacters(DeclarationAnnotationAdapter annotationAdapter, String elementName) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, elementName, CharacterStringExpressionConverter.instance());
-	}
-
-	/**
-	 * The default expression converter expects character constant expressions.
-	 */
-	public static ConversionDeclarationAnnotationElementAdapter<String> forCharacters(DeclarationAnnotationAdapter annotationAdapter, String elementName, boolean removeAnnotationWhenEmpty) {
-		return new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, elementName, removeAnnotationWhenEmpty, CharacterStringExpressionConverter.instance());
-	}
-
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/DefaultAnnotationEditFormatter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/DefaultAnnotationEditFormatter.java
index ff2e215..8b886d1 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/DefaultAnnotationEditFormatter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/DefaultAnnotationEditFormatter.java
@@ -18,8 +18,8 @@
 import org.eclipse.text.edits.TextEdit;
 
 /**
- * This implementation will clean up some of the nasty Eclipse annotation
- * formatting (or lack thereof); e.g. arrays of annotations.
+ * This will apply TextEdit's to a doc and do some extra work to cleanup some
+ * of the nasty Eclipse annotation formatting (e.g. arrays of annotations).
  */
 public final class DefaultAnnotationEditFormatter
 	implements AnnotationEditFormatter
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/EnumArrayDeclarationAnnotationElementAdapter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/EnumArrayDeclarationAnnotationElementAdapter.java
index 6330885..de08d4a 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/EnumArrayDeclarationAnnotationElementAdapter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/EnumArrayDeclarationAnnotationElementAdapter.java
@@ -14,6 +14,7 @@
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.ArrayInitializer;
 import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.Name;
 
 /**
  * Wrap a declaration annotation element adapter and simply
@@ -25,7 +26,7 @@
 	/**
 	 * The wrapped adapter that returns and takes name strings (enums).
 	 */
-	private final ConversionDeclarationAnnotationElementAdapter<String[]> adapter;
+	private final ConversionDeclarationAnnotationElementAdapter<String[], Expression> adapter;
 
 	private static final String[] EMPTY_STRING_ARRAY = new String[0];
 
@@ -56,14 +57,14 @@
 	}
 
 	public EnumArrayDeclarationAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName, boolean removeAnnotationWhenEmpty, boolean removeArrayInitializerWhenEmpty) {
-		this(new ConversionDeclarationAnnotationElementAdapter<String[]>(annotationAdapter, elementName, removeAnnotationWhenEmpty, buildExpressionConverter(removeArrayInitializerWhenEmpty)));
+		this(new ConversionDeclarationAnnotationElementAdapter<String[], Expression>(annotationAdapter, elementName, removeAnnotationWhenEmpty, buildExpressionConverter(removeArrayInitializerWhenEmpty)));
 	}
 
-	private static ExpressionConverter<String[]> buildExpressionConverter(boolean removeArrayInitializerWhenEmpty) {
-		return new AnnotationStringArrayExpressionConverter(NameStringExpressionConverter.instance(), removeArrayInitializerWhenEmpty);
+	private static ExpressionConverter<String[], Expression> buildExpressionConverter(boolean removeArrayInitializerWhenEmpty) {
+		return new AnnotationStringArrayExpressionConverter<Name>(NameStringExpressionConverter.instance(), removeArrayInitializerWhenEmpty);
 	}
 
-	protected EnumArrayDeclarationAnnotationElementAdapter(ConversionDeclarationAnnotationElementAdapter<String[]> adapter) {
+	protected EnumArrayDeclarationAnnotationElementAdapter(ConversionDeclarationAnnotationElementAdapter<String[], Expression> adapter) {
 		super();
 		this.adapter = adapter;
 	}
@@ -99,13 +100,13 @@
 	 * or
 	 *     FOO
 	 */
-	protected String[] resolve(Expression expression, ModifiedDeclaration declaration) {
-		if (expression == null) {
+	protected String[] resolve(Expression enumsExpression, ModifiedDeclaration declaration) {
+		if (enumsExpression == null) {
 			return EMPTY_STRING_ARRAY;
-		} else if (expression.getNodeType() == ASTNode.ARRAY_INITIALIZER) {
-			return this.resolveArray((ArrayInitializer) expression, declaration);
+		} else if (enumsExpression.getNodeType() == ASTNode.ARRAY_INITIALIZER) {
+			return this.resolveArray((ArrayInitializer) enumsExpression, declaration);
 		} else {
-			return this.resolveSingleElement(expression, declaration);
+			return this.resolveSingleElement(enumsExpression, declaration);
 		}
 	}
 
@@ -114,17 +115,17 @@
 		int len = expressions.size();
 		String[] enums = new String[len];
 		for (int i = len; i-- > 0; ) {
-			enums[i] = this.resolveEnum(expressions.get(i));
+			enums[i] = this.resolveEnum(expressions.get(i), declaration);
 		}
 		return enums;
 	}
 
 	protected String[] resolveSingleElement(Expression enumExpression, ModifiedDeclaration declaration) {
-		return new String[] {this.resolveEnum(enumExpression)};
+		return new String[] {this.resolveEnum(enumExpression, declaration)};
 	}
 
-	protected String resolveEnum(Expression expression) {
-		return JDTTools.resolveEnum(expression);
+	protected String resolveEnum(Expression enumExpression, ModifiedDeclaration declaration) {
+		return JDTTools.resolveEnum(declaration.iCompilationUnit(), enumExpression);
 	}
 
 	@SuppressWarnings("unchecked")
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/EnumDeclarationAnnotationElementAdapter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/EnumDeclarationAnnotationElementAdapter.java
index eda5853..838860f 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/EnumDeclarationAnnotationElementAdapter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/EnumDeclarationAnnotationElementAdapter.java
@@ -11,6 +11,7 @@
 
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.Name;
 
 /**
  * Wrap a declaration annotation element adapter and simply
@@ -22,7 +23,7 @@
 	/**
 	 * The wrapped adapter that returns and takes name strings (enums).
 	 */
-	private final ConversionDeclarationAnnotationElementAdapter<String> adapter;
+	private final ConversionDeclarationAnnotationElementAdapter<String, Name> adapter;
 
 
 	// ********** constructors **********
@@ -44,10 +45,10 @@
 	}
 
 	public EnumDeclarationAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName, boolean removeAnnotationWhenEmpty) {
-		this(new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, elementName, removeAnnotationWhenEmpty, NameStringExpressionConverter.instance()));
+		this(new ConversionDeclarationAnnotationElementAdapter<String, Name>(annotationAdapter, elementName, removeAnnotationWhenEmpty, NameStringExpressionConverter.instance()));
 	}
 
-	protected EnumDeclarationAnnotationElementAdapter(ConversionDeclarationAnnotationElementAdapter<String> adapter) {
+	protected EnumDeclarationAnnotationElementAdapter(ConversionDeclarationAnnotationElementAdapter<String, Name> adapter) {
 		super();
 		this.adapter = adapter;
 	}
@@ -56,7 +57,7 @@
 	// ********** DeclarationAnnotationElementAdapter implementation **********
 
 	public String getValue(ModifiedDeclaration declaration) {
-		return this.resolve(this.adapter.expression(declaration));
+		return this.resolve(this.adapter.expression(declaration), declaration);
 	}
 
 	public void setValue(String value, ModifiedDeclaration declaration) {
@@ -77,8 +78,8 @@
 	/**
 	 * resolve the enum
 	 */
-	protected String resolve(Expression expression) {
-		return JDTTools.resolveEnum(expression);
+	protected String resolve(Expression enumExpression, ModifiedDeclaration declaration) {
+		return (enumExpression == null) ? null : JDTTools.resolveEnum(declaration.iCompilationUnit(), enumExpression);
 	}
 
 	/**
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/ExpressionConverter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/ExpressionConverter.java
index fce8284..4bce434 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/ExpressionConverter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/ExpressionConverter.java
@@ -15,9 +15,10 @@
 /**
  * Define the protocol for converting an AST expression back and forth
  * from an arbitrary type (e.g. StringLiteral <=> String).
+ * E is the expression type.
  * T is the type of the object to be converted to and from an expression.
  */
-public interface ExpressionConverter<T> {
+public interface ExpressionConverter<T, E extends Expression> {
 
 	/**
 	 * Convert the specified object to an
@@ -25,12 +26,12 @@
 	 * The type of the object is determined by the
 	 * contract specified by the client.
 	 */
-	Expression convert(T object, AST ast);
+	E convert(T object, AST ast);
 
 	/**
 	 * Convert the specified expression to an object of some
 	 * pre-determined type.
 	 */
-	T convert(Expression expression);
+	T convert(E expression);
 
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/FieldAttribute.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/FieldAttribute.java
index 62f6360..c59cda3 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/FieldAttribute.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/FieldAttribute.java
@@ -10,10 +10,11 @@
 package org.eclipse.jpt.core.internal.jdtutility;
 
 import java.util.List;
+
 import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.FieldDeclaration;
-import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
 import org.eclipse.jpt.utility.internal.CommandExecutorProvider;
 
@@ -33,6 +34,11 @@
 		return (IField) super.getJdtMember();
 	}
 
+	@Override
+	public FieldDeclaration bodyDeclaration() {
+		return (FieldDeclaration) super.bodyDeclaration();
+	}
+
 
 	// ********** Member implementation **********
 
@@ -65,10 +71,15 @@
 	}
 
 	@Override
-	public ITypeBinding typeBinding(CompilationUnit astRoot) {
-		return bodyDeclaration(astRoot).getType().resolveBinding();
+	public String typeSignature() {
+		try {
+			return this.getJdtMember().getTypeSignature();
+		} catch (JavaModelException ex) {
+			throw new RuntimeException(ex);
+		}
 	}
 
+
 	// ********** miscellaneous **********
 
 	@SuppressWarnings("unchecked")
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/JDTTools.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/JDTTools.java
index cf1b284..3491df0 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/JDTTools.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/JDTTools.java
@@ -9,109 +9,211 @@
  ******************************************************************************/
 package org.eclipse.jpt.core.internal.jdtutility;
 
+import org.eclipse.jdt.core.Flags;
 import org.eclipse.jdt.core.IClassFile;
 import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IImportDeclaration;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.IMember;
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.jdt.core.compiler.CategorizedProblem;
 import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.ASTParser;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.Expression;
-import org.eclipse.jdt.core.dom.IBinding;
-import org.eclipse.jdt.core.dom.IVariableBinding;
-import org.eclipse.jdt.core.dom.Name;
+import org.eclipse.jdt.internal.codeassist.ISelectionRequestor;
+import org.eclipse.jdt.internal.codeassist.SelectionEngine;
+import org.eclipse.jdt.internal.core.DefaultWorkingCopyOwner;
+import org.eclipse.jdt.internal.core.JavaProject;
+import org.eclipse.jdt.internal.core.SearchableEnvironment;
 import org.eclipse.jpt.core.internal.JptCorePlugin;
 
 public class JDTTools {
 
-	// TODO get rid of the "lightweight" methods after reworking how
-	// ValidationMessages determine line numbers
 	/**
-	 * Build an AST for the specified member's compilation unit or
-	 * (source-attached) class file. Build the AST without its bindings
-	 * resolved.
+	 * add a "normal" import, as opposed to a "static" import
 	 */
-	public static CompilationUnit buildLightweightASTRoot(IMember member) {
-		return buildASTRoot(member, false);
+	public static IImportDeclaration addImport(ICompilationUnit compilationUnit, String importElement) {
+		return addImport(compilationUnit, importElement, Flags.AccDefault);
 	}
 
 	/**
-	 * Build an AST for the specified member's compilation unit or
-	 * (source-attached) class file. Build the AST with its bindings
-	 * resolved (and the resultant performance hit).
+	 * this doesn't work yet... see eclipse bugzilla 143684
 	 */
-	public static CompilationUnit buildASTRoot(IMember member) {
-		return buildASTRoot(member, true);
+	public static IImportDeclaration addStaticImport(ICompilationUnit compilationUnit, String importElement) {
+		return addImport(compilationUnit, importElement, Flags.AccStatic);
+	}
+
+	public static IImportDeclaration addImport(ICompilationUnit compilationUnit, String importElement, int flags) {
+		try {
+			return compilationUnit.createImport(importElement, null, flags, null);  // null = place at end of import list; null = no progress monitor
+		} catch (JavaModelException ex) {
+			throw new RuntimeException(ex);
+		}
 	}
 
 	/**
-	 * Build an AST for the specified member's compilation unit or
-	 * (source-attached) class file.
+	 * Build an AST for the specified member's compilation unit or class file.
 	 */
-	private static CompilationUnit buildASTRoot(IMember member, boolean resolveBindings) {
+	public static CompilationUnit createASTRoot(IMember member) {
 		return (member.isBinary()) ?
-			buildASTRoot(member.getClassFile(), resolveBindings)  // the class file must have a source attachment
+			createASTRoot(member.getClassFile())  // the class file must have a source attachment
 		:
-			buildASTRoot(member.getCompilationUnit(), resolveBindings);
+			createASTRoot(member.getCompilationUnit());
 	}
 	
-	public static CompilationUnit buildASTRoot(IClassFile classFile) {
-		return buildASTRoot(classFile, true);
-	}
-	
-	private static CompilationUnit buildASTRoot(IClassFile classFile, boolean resolveBindings) {
+	public static CompilationUnit createASTRoot(IClassFile classFile) {
 		ASTParser parser = ASTParser.newParser(AST.JLS3);
 		parser.setSource(classFile);
-		parser.setResolveBindings(resolveBindings);
 		return (CompilationUnit) parser.createAST(null);
+		
 	}
 	
-	public static CompilationUnit buildASTRoot(ICompilationUnit compilationUnit) {
-		return buildASTRoot(compilationUnit, true);
-	}
-	
-	private static CompilationUnit buildASTRoot(ICompilationUnit compilationUnit, boolean resolveBindings) {
+	public static CompilationUnit createASTRoot(ICompilationUnit compilationUnit) {
 		ASTParser parser = ASTParser.newParser(AST.JLS3);
 		parser.setSource(compilationUnit);
-		parser.setResolveBindings(resolveBindings);
 		return (CompilationUnit) parser.createAST(null);
 	}
 	
 	public static IType findType(String packageName, String qualifiedTypeName, IJavaProject javaProject) {
 		try {
-			return javaProject.findType(packageName, qualifiedTypeName.replace('$', '.'));
+			if (javaProject != null) {
+				return javaProject.findType(packageName, qualifiedTypeName.replace('$', '.'));
+			}
+		} 
+		catch (JavaModelException jme) {
+			JptCorePlugin.log(jme);
+		}
+		return null;
+	}
+
+	/**
+	 * Resolve the specified signature in the scope of the specified jdt type.
+	 * Return the fully-qualified type name or return null if it cannot be
+	 * resolved unambiguously.
+	 */
+	public static String resolveSignature(String signature, IType type) {
+		String elementSignature = Signature.getElementType(signature);
+		if (signatureIsPrimitive(elementSignature)) {
+			return Signature.toString(signature);  // no need to resolve primitives
+		}
+		String elementTypeName = Signature.toString(elementSignature);
+		elementTypeName = resolve(elementTypeName, type);
+		if (elementTypeName == null) {
+			return null;  // unable to resolve type
+		}
+		int arrayCount = Signature.getArrayCount(signature);
+		if (arrayCount == 0) {
+			return elementTypeName;
+		}
+		StringBuffer sb = new StringBuffer(elementTypeName.length() + 2*arrayCount);
+		sb.append(elementTypeName);
+		for (int i = arrayCount; i-- > 0; ) {
+			sb.append('[').append(']');
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Resolve the specified type name in the scope of the specified jdt type.
+	 * Return the fully-qualified type name or return null if it cannot be
+	 * resolved unambiguously.
+	 */
+	public static String resolve(String typeName, IType type) {
+		try {
+			return resolve_(typeName, type);
 		} catch (JavaModelException ex) {
-			JptCorePlugin.log(ex);
-			return null;
+			throw new RuntimeException(ex);
 		}
 	}
 
-	public static String resolveEnum(Expression expression) {
-		if (expression == null) {
+	private static String resolve_(String typeName, IType type) throws JavaModelException {
+		String[][] resolvedTypes = type.resolveType(typeName);
+		// if more than one resolved type is returned, the type name is ambiguous
+		if (resolvedTypes == null) {
 			return null;
 		}
-		switch (expression.getNodeType()) {
-			case ASTNode.QUALIFIED_NAME:
-			case ASTNode.SIMPLE_NAME:
-				return resolveEnum((Name) expression);
-			default:
-				return null;
+		if (resolvedTypes.length > 1) {
+			return null;
+		}
+		if (resolvedTypes[0][0].length() == 0) {
+			//handle Default package case - bug #193618
+			return resolvedTypes[0][1];
+		}
+		return resolvedTypes[0][0] + "." + resolvedTypes[0][1];
+	}
+
+	public static boolean signatureIsPrimitive(String signature) {
+		return Signature.getTypeSignatureKind(signature) == Signature.BASE_TYPE_SIGNATURE;
+	}
+
+	public static String resolveEnum(ICompilationUnit sourceUnit, Expression enumExpression) {
+		return resolveEnum(sourceUnit, enumExpression.getStartPosition(), enumExpression.getStartPosition() + enumExpression.getLength() - 1);
+	}
+
+	public static String resolveEnum(ICompilationUnit sourceUnit, int enumSourceStart, int enumSourceEnd) {
+		try {
+			return resolveEnum_(sourceUnit, enumSourceStart, enumSourceEnd);
+		} catch (JavaModelException ex) {
+			throw new RuntimeException(ex);
 		}
 	}
 
-	public static String resolveEnum(Name enumExpression) {
-		IBinding binding = enumExpression.resolveBinding();
-		if (binding == null) {
-			return null;  // TODO figure why this is null sometimes
-		}
-		if (binding.getKind() != IBinding.VARIABLE) {
+	private static String resolveEnum_(ICompilationUnit sourceUnit, int enumSourceStart, int enumSourceEnd) throws JavaModelException {
+		String[][] resolvedEnums = resolveField_((org.eclipse.jdt.internal.core.CompilationUnit) sourceUnit, enumSourceStart, enumSourceEnd);
+		// if more than one resolved enum is returned, the enum name is ambiguous
+		if (resolvedEnums == null) {
 			return null;
 		}
-		IVariableBinding variableBinding = (IVariableBinding) binding;
-		return variableBinding.getType().getQualifiedName() + "." + variableBinding.getName();
+		if (resolvedEnums.length > 1) {
+			return null;
+		}
+		return resolvedEnums[0][0] + "." + resolvedEnums[0][1] + "." + resolvedEnums[0][2];
 	}
 
+	// code lifted from SourceType.resolveType(String, WorkingCopyOwner)
+	private static String[][] resolveField_(org.eclipse.jdt.internal.core.CompilationUnit sourceUnit, int selectionSourceStart, int selectionSourceEnd) throws JavaModelException {
+		class TypeResolveRequestor implements ISelectionRequestor {
+			String[][] answers = null;
+			public void acceptType(char[] packageName, char[] tName, int modifiers, boolean isDeclaration, char[] uniqueKey, int start, int end) {
+				// ignore
+			}
+			public void acceptError(CategorizedProblem error) {
+				// ignore
+			}
+			public void acceptField(char[] declaringTypePackageName, char[] declaringTypeName, char[] fieldName, boolean isDeclaration, char[] uniqueKey, int start, int end) {
+				String[] answer = new String[]  {new String(declaringTypePackageName), new String(declaringTypeName), new String(fieldName) };
+				if (this.answers == null) {
+					this.answers = new String[][]{ answer };
+				} else {
+					int len = this.answers.length;
+					System.arraycopy(this.answers, 0, this.answers = new String[len+1][], 0, len);
+					this.answers[len] = answer;
+				}
+			}
+			public void acceptMethod(char[] declaringTypePackageName, char[] declaringTypeName, String enclosingDeclaringTypeSignature, char[] selector, char[][] parameterPackageNames, char[][] parameterTypeNames, String[] parameterSignatures, char[][] typeParameterNames, char[][][] typeParameterBoundNames, boolean isConstructor, boolean isDeclaration, char[] uniqueKey, int start, int end) {
+				// ignore
+			}
+			public void acceptPackage(char[] packageName){
+				// ignore
+			}
+			public void acceptTypeParameter(char[] declaringTypePackageName, char[] declaringTypeName, char[] typeParameterName, boolean isDeclaration, int start, int end) {
+				// ignore
+			}
+			public void acceptMethodTypeParameter(char[] declaringTypePackageName, char[] declaringTypeName, char[] selector, int selectorStart, int selcetorEnd, char[] typeParameterName, boolean isDeclaration, int start, int end) {
+				// ignore
+			}
+	
+		}
+		TypeResolveRequestor requestor = new TypeResolveRequestor();
+		JavaProject project = (JavaProject) sourceUnit.getJavaProject();
+		SearchableEnvironment environment = project.newSearchableNameEnvironment(DefaultWorkingCopyOwner.PRIMARY);
+	
+		SelectionEngine engine = new SelectionEngine(environment, requestor, project.getOptions(true));
+			
+		engine.select(sourceUnit, selectionSourceStart, selectionSourceEnd);
+		return requestor.answers;
+	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/Member.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/Member.java
index fca7ebd..2ea7212 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/Member.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/Member.java
@@ -96,14 +96,7 @@
 	 * note: this creates a *new* AST
 	 */
 	public CompilationUnit astRoot() {
-		return JDTTools.buildASTRoot(this.jdtMember);
-	}
-
-	/**
-	 * note: this creates a *new* AST
-	 */
-	private CompilationUnit lightweightASTRoot() {
-		return JDTTools.buildLightweightASTRoot(this.jdtMember);
+		return JDTTools.createASTRoot(this.jdtMember);
 	}
 
 	public ModifiedDeclaration modifiedDeclaration() {
@@ -114,8 +107,12 @@
 		return new ModifiedDeclaration(this.bodyDeclaration(astRoot));
 	}
 
+	public BodyDeclaration bodyDeclaration() {
+		return this.bodyDeclaration(this.astRoot());
+	}
+
 	public ITextRange textRange() {
-		return this.textRange(this.lightweightASTRoot());
+		return this.textRange(this.astRoot());
 	}
 
 	public ITextRange textRange(CompilationUnit astRoot) {
@@ -127,23 +124,23 @@
 	}
 
 	public ITextRange nameTextRange() {
-		return this.nameTextRange(this.lightweightASTRoot());
+		return this.nameTextRange(this.astRoot());
 	}
 	
 	public ITextRange nameTextRange(CompilationUnit astRoot) {
 		ISourceRange sourceRange = this.nameSourceRange();
-		return
+		return 
 			new SimpleTextRange(
 				sourceRange.getOffset(), 
 				sourceRange.getLength(),
-				astRoot.getLineNumber(sourceRange.getOffset())
-			);
+				astRoot.getLineNumber(sourceRange.getOffset()));
 	}
 	
 	private ISourceRange nameSourceRange() {
 		try {
-			return this.jdtMember.getNameRange();
-		} catch (JavaModelException ex) {
+			return getJdtMember().getNameRange();
+		}
+		catch (JavaModelException ex) {
 			throw new RuntimeException(ex);
 		}
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/MethodAttribute.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/MethodAttribute.java
index f636ad6..d013fc1 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/MethodAttribute.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/MethodAttribute.java
@@ -10,10 +10,10 @@
 package org.eclipse.jpt.core.internal.jdtutility;
 
 import java.beans.Introspector;
+
 import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.IMethodBinding;
-import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jdt.core.dom.MethodDeclaration;
 import org.eclipse.jpt.utility.internal.CommandExecutorProvider;
 
@@ -41,6 +41,11 @@
 		return (IMethod) super.getJdtMember();
 	}
 
+	@Override
+	public MethodDeclaration bodyDeclaration() {
+		return (MethodDeclaration) super.bodyDeclaration();
+	}
+
 
 	// ********** Member implementation **********
 
@@ -78,13 +83,14 @@
 		}
 		return Introspector.decapitalize(methodName.substring(beginIndex));
 	}
-	
+
 	@Override
-	public ITypeBinding typeBinding(CompilationUnit astRoot) {
-		IMethodBinding methodBinding = bodyDeclaration(astRoot).resolveBinding();
-		if (methodBinding != null) {
-			return methodBinding.getReturnType();
+	public String typeSignature() {
+		try {
+			return this.getJdtMember().getReturnType();
+		} catch (JavaModelException ex) {
+			throw new RuntimeException(ex);
 		}
-		return null;
 	}
+
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/ModifiedDeclaration.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/ModifiedDeclaration.java
index 9af69a2..18c8520 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/ModifiedDeclaration.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/ModifiedDeclaration.java
@@ -20,7 +20,6 @@
 import org.eclipse.jdt.core.dom.BodyDeclaration;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.IExtendedModifier;
-import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jdt.core.dom.ImportDeclaration;
 import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
 import org.eclipse.jdt.core.dom.VariableDeclarationExpression;
@@ -72,7 +71,7 @@
 	 * Return the "declaration" AST node.
 	 */
 	public ASTNode getDeclaration() {
-		return this.adapter.declaration();
+		return this.adapter.getDeclaration();
 	}
 
 	/**
@@ -278,30 +277,19 @@
 	}
 
 	private String qualifiedName(Annotation annotation) {
-		ITypeBinding typeBinding = annotation.resolveTypeBinding();
-		if (typeBinding != null) {
-			String resolvedName = typeBinding.getQualifiedName();
-			if (resolvedName != null) {
-				return resolvedName;
-			}
+		String name = annotation.getTypeName().getFullyQualifiedName();
+		if (name.indexOf('.') != -1) {
+			return name;  // name is already qualified
+		}
+		String resolvedName = JDTTools.resolve(name, this.type());
+		if (resolvedName != null) {
+			return resolvedName;
 		}
 		// hack(?): check for a matching import because when moving a stand-alone
 		// annotation to its container in CombinationIndexedDeclarationAnnotationAdapter
 		// the container's import is added but then it won't "resolve" upon
 		// subsequent lookups... :-(
-		return this.importFor(annotation.getTypeName().getFullyQualifiedName());  // look for a matching import
-
-		// OLD METHOD SOURCE:
-//		String name = annotation.getTypeName().getFullyQualifiedName();
-//		if (name.indexOf('.') != -1) {
-//			return name;  // name is already qualified
-//		}
-//		String resolvedName = JDTTools.resolve(name, this.type());
-//		// hack(?): check for a matching import because when moving a stand-alone
-//		// annotation to its container in CombinationIndexedDeclarationAnnotationAdapter
-//		// the container's import is added but then it won't "resolve" upon
-//		// subsequent lookups... :-(
-//		return this.importFor(name);  // look for a matching import
+		return this.importFor(name);  // look for a matching import
 	}
 
 	/**
@@ -365,7 +353,7 @@
 		/**
 		 * Return the adapted "declaration".
 		 */
-		ASTNode declaration();
+		ASTNode getDeclaration();
 
 		/**
 		 * Return the "declaration"'s list of modifiers.
@@ -381,7 +369,7 @@
 			super();
 			this.declaration = declaration;
 		}
-		public ASTNode declaration() {
+		public ASTNode getDeclaration() {
 			return this.declaration;
 		}
 		@SuppressWarnings("unchecked")
@@ -400,7 +388,7 @@
 			super();
 			this.declaration = declaration;
 		}
-		public ASTNode declaration() {
+		public ASTNode getDeclaration() {
 			return this.declaration;
 		}
 		@SuppressWarnings("unchecked")
@@ -419,7 +407,7 @@
 			super();
 			this.declaration = declaration;
 		}
-		public ASTNode declaration() {
+		public ASTNode getDeclaration() {
 			return this.declaration;
 		}
 		@SuppressWarnings("unchecked")
@@ -438,7 +426,7 @@
 			super();
 			this.declaration = declaration;
 		}
-		public ASTNode declaration() {
+		public ASTNode getDeclaration() {
 			return this.declaration;
 		}
 		@SuppressWarnings("unchecked")
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/NameStringExpressionConverter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/NameStringExpressionConverter.java
index 0aaa703..078835e 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/NameStringExpressionConverter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/NameStringExpressionConverter.java
@@ -11,7 +11,6 @@
 
 import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.Expression;
 import org.eclipse.jdt.core.dom.Name;
 
 /**
@@ -19,14 +18,14 @@
  * (e.g. "com.xxx.Foo.VALUE1" or "value").
  */
 public final class NameStringExpressionConverter
-	extends AbstractExpressionConverter<String>
+	extends AbstractExpressionConverter<String, Name>
 {
-	private static ExpressionConverter<String> INSTANCE;
+	private static ExpressionConverter<String, Name> INSTANCE;
 
 	/**
 	 * Return the singleton.
 	 */
-	public static ExpressionConverter<String> instance() {
+	public static ExpressionConverter<String, Name> instance() {
 		if (INSTANCE == null) {
 			INSTANCE = new NameStringExpressionConverter();
 		}
@@ -41,16 +40,16 @@
 	}
 
 	@Override
-	protected Name convertObject(String string, AST ast) {
+	protected Name convert_(String string, AST ast) {
 		return ast.newName(string);
 	}
 
 	@Override
-	protected String convertExpression(Expression expression) {
-		switch (expression.getNodeType()) {
+	protected String convert_(Name name) {
+		switch (name.getNodeType()) {
 			case ASTNode.QUALIFIED_NAME:
 			case ASTNode.SIMPLE_NAME:
-				return ((Name) expression).getFullyQualifiedName();
+				return name.getFullyQualifiedName();
 			default:
 				return null;
 		}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/NullExpressionConverter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/NullExpressionConverter.java
index b45c0ce..e58f3af 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/NullExpressionConverter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/NullExpressionConverter.java
@@ -17,16 +17,16 @@
  * No conversion.
  */
 public final class NullExpressionConverter
-	implements ExpressionConverter<Expression>
+	implements ExpressionConverter<Expression, Expression>
 {
 
 	// singleton
-	private static ExpressionConverter<Expression> INSTANCE = new NullExpressionConverter();
+	private static ExpressionConverter<Expression, Expression> INSTANCE = new NullExpressionConverter();
 
 	/**
 	 * Return the singleton.
 	 */
-	public static ExpressionConverter<Expression> instance() {
+	public static ExpressionConverter<Expression, Expression> instance() {
 		if (INSTANCE == null) {
 			INSTANCE = new NullExpressionConverter();
 		}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/NumberStringExpressionConverter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/NumberStringExpressionConverter.java
index ead2da9..0b312fb 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/NumberStringExpressionConverter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/NumberStringExpressionConverter.java
@@ -10,7 +10,7 @@
 package org.eclipse.jpt.core.internal.jdtutility;
 
 import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.NumberLiteral;
 
 /**
@@ -18,14 +18,14 @@
  * (e.g. "48").
  */
 public final class NumberStringExpressionConverter
-	extends AbstractExpressionConverter<String>
+	extends AbstractExpressionConverter<String, NumberLiteral>
 {
-	private static ExpressionConverter<String> INSTANCE;
+	private static ExpressionConverter<String, NumberLiteral> INSTANCE;
 
 	/**
 	 * Return the singleton.
 	 */
-	public static ExpressionConverter<String> instance() {
+	public static ExpressionConverter<String, NumberLiteral> instance() {
 		if (INSTANCE == null) {
 			INSTANCE = new NumberStringExpressionConverter();
 		}
@@ -40,14 +40,16 @@
 	}
 	
 	@Override
-	protected NumberLiteral convertObject(String string, AST ast) {
+	protected NumberLiteral convert_(String string, AST ast) {
 		return ast.newNumberLiteral(string);
 	}
 
 	@Override
-	protected String convertExpression(Expression expression) {
-		Object value = expression.resolveConstantExpressionValue();
-		return (value instanceof Number) ? ((Number) value).toString() : null;
+	protected String convert_(NumberLiteral numberLiteral) {
+		return (numberLiteral.getNodeType() == ASTNode.NUMBER_LITERAL) ?
+			numberLiteral.getToken()
+		:
+			null;
 	}
 
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/PrimitiveTypeStringExpressionConverter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/PrimitiveTypeStringExpressionConverter.java
index 910d735..49f6d99 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/PrimitiveTypeStringExpressionConverter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/PrimitiveTypeStringExpressionConverter.java
@@ -11,7 +11,6 @@
 
 import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.Expression;
 import org.eclipse.jdt.core.dom.PrimitiveType;
 import org.eclipse.jdt.core.dom.TypeLiteral;
 
@@ -20,14 +19,14 @@
  * (e.g. "int").
  */
 public final class PrimitiveTypeStringExpressionConverter
-	extends AbstractExpressionConverter<String>
+	extends AbstractExpressionConverter<String, TypeLiteral>
 {
-	private static ExpressionConverter<String> INSTANCE;
+	private static ExpressionConverter<String, TypeLiteral> INSTANCE;
 
 	/**
 	 * Return the singleton.
 	 */
-	public static ExpressionConverter<String> instance() {
+	public static ExpressionConverter<String, TypeLiteral> instance() {
 		if (INSTANCE == null) {
 			INSTANCE = new PrimitiveTypeStringExpressionConverter();
 		}
@@ -42,7 +41,7 @@
 	}
 
 	@Override
-	protected TypeLiteral convertObject(String string, AST ast) {
+	protected TypeLiteral convert_(String string, AST ast) {
 		org.eclipse.jdt.core.dom.Type type = ast.newPrimitiveType(PrimitiveType.toCode(string));
 		TypeLiteral typeLiteral = ast.newTypeLiteral();
 		typeLiteral.setType(type);
@@ -50,9 +49,9 @@
 	}
 
 	@Override
-	protected String convertExpression(Expression expression) {
-		if (expression.getNodeType() == ASTNode.TYPE_LITERAL) {
-			org.eclipse.jdt.core.dom.Type type = ((TypeLiteral) expression).getType();
+	protected String convert_(TypeLiteral typeLiteral) {
+		if (typeLiteral.getNodeType() == ASTNode.TYPE_LITERAL) {
+			org.eclipse.jdt.core.dom.Type type = typeLiteral.getType();
 			if (type.getNodeType() == ASTNode.PRIMITIVE_TYPE) {
 				return ((PrimitiveType) type).getPrimitiveTypeCode().toString();
 			}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/SimpleTypeStringExpressionConverter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/SimpleTypeStringExpressionConverter.java
index e596a33..43566cb 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/SimpleTypeStringExpressionConverter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/SimpleTypeStringExpressionConverter.java
@@ -11,7 +11,6 @@
 
 import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.Expression;
 import org.eclipse.jdt.core.dom.Name;
 import org.eclipse.jdt.core.dom.SimpleType;
 import org.eclipse.jdt.core.dom.TypeLiteral;
@@ -21,14 +20,14 @@
  * (e.g. "java.lang.Object").
  */
 public final class SimpleTypeStringExpressionConverter
-	extends AbstractExpressionConverter<String>
+	extends AbstractExpressionConverter<String, TypeLiteral>
 {
-	private static ExpressionConverter<String> INSTANCE;
+	private static ExpressionConverter<String, TypeLiteral> INSTANCE;
 
 	/**
 	 * Return the singleton.
 	 */
-	public static ExpressionConverter<String> instance() {
+	public static ExpressionConverter<String, TypeLiteral> instance() {
 		if (INSTANCE == null) {
 			INSTANCE = new SimpleTypeStringExpressionConverter();
 		}
@@ -43,7 +42,7 @@
 	}
 
 	@Override
-	protected TypeLiteral convertObject(String string, AST ast) {
+	protected TypeLiteral convert_(String string, AST ast) {
 		Name name = ast.newName(string);
 		org.eclipse.jdt.core.dom.Type type = ast.newSimpleType(name);
 		TypeLiteral typeLiteral = ast.newTypeLiteral();
@@ -52,9 +51,9 @@
 	}
 
 	@Override
-	protected String convertExpression(Expression expression) {
-		if (expression.getNodeType() == ASTNode.TYPE_LITERAL) {
-			org.eclipse.jdt.core.dom.Type type = ((TypeLiteral) expression).getType();
+	protected String convert_(TypeLiteral typeLiteral) {
+		if (typeLiteral.getNodeType() == ASTNode.TYPE_LITERAL) {
+			org.eclipse.jdt.core.dom.Type type = typeLiteral.getType();
 			if (type.getNodeType() == ASTNode.SIMPLE_TYPE) {
 				return ((SimpleType) type).getName().getFullyQualifiedName();
 			}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/StringArrayExpressionConverter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/StringArrayExpressionConverter.java
index 31d61ab..02d081a 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/StringArrayExpressionConverter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/StringArrayExpressionConverter.java
@@ -10,28 +10,23 @@
 package org.eclipse.jpt.core.internal.jdtutility;
 
 import java.util.List;
-
 import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.ArrayInitializer;
 import org.eclipse.jdt.core.dom.Expression;
 
 /**
  * Convert an array initializer to/from an array of strings (e.g. {"text0", "text1"}).
+ * E is the type of the expressions to be found in the array initializer.
  * 
  * Do NOT use this class for converting array initializers in annotation elements.
  * Java5 has a bit of syntactic sugar that allows a single-element array
- * initializer to not have curly braces. This converter will return null if it encounters
+ * initializer to not have curly braces. This converter will barf if it encounters
  * anything other than an array initializer.
- * 
- * Invalid entries in the array initializer will result in null elements in the
- * resulting string array. This allows clients to manipulate elements at
- * the appropriate index.
  */
-public class StringArrayExpressionConverter
-	extends AbstractExpressionConverter<String[]>
+public class StringArrayExpressionConverter<E extends Expression>
+	extends AbstractExpressionConverter<String[], ArrayInitializer>
 {
-	private final ExpressionConverter<String> elementConverter;
+	private final ExpressionConverter<String, E> elementConverter;
 	private final boolean removeArrayInitializerWhenEmpty;
 
 	private static final String[] EMPTY_STRING_ARRAY = new String[0];
@@ -40,11 +35,11 @@
 	/**
 	 * The default behavior is to remove the array initializer if it is empty.
 	 */
-	public StringArrayExpressionConverter(ExpressionConverter<String> elementConverter) {
+	public StringArrayExpressionConverter(ExpressionConverter<String, E> elementConverter) {
 		this(elementConverter, true);
 	}
 
-	public StringArrayExpressionConverter(ExpressionConverter<String> elementConverter, boolean removeArrayInitializerWhenEmpty) {
+	public StringArrayExpressionConverter(ExpressionConverter<String, E> elementConverter, boolean removeArrayInitializerWhenEmpty) {
 		super();
 		this.elementConverter = elementConverter;
 		this.removeArrayInitializerWhenEmpty = removeArrayInitializerWhenEmpty;
@@ -55,7 +50,7 @@
 	 * this method is 'public' so it can be called by
 	 * AnnotationStringArrayExpressionConverter
 	 */
-	public ArrayInitializer convertObject(String[] strings, AST ast) {
+	public ArrayInitializer convert_(String[] strings, AST ast) {
 		if ((strings.length == 0) && this.removeArrayInitializerWhenEmpty) {
 			return null;
 		}
@@ -72,29 +67,21 @@
 		return arrayInitializer.expressions();
 	}
 
+	@Override
 	/*
 	 * this method is 'public' so it can be called by
 	 * AnnotationStringArrayExpressionConverter
 	 */
-	@Override
 	public String[] convertNull() {
 		return EMPTY_STRING_ARRAY;
 	}
 
 	@Override
-	protected String[] convertExpression(Expression expression) {
-		return (expression.getNodeType() == ASTNode.ARRAY_INITIALIZER) ?
-				this.convertArrayInitializer((ArrayInitializer) expression)
-			:
-				EMPTY_STRING_ARRAY;
-	}
-
 	/*
-	 * this method is 'public' so it can be called by
-	 * AnnotationStringArrayExpressionConverter
+	 * 'public' in support of AnnotationStringArrayExpressionConverter
 	 */
-	public String[] convertArrayInitializer(ArrayInitializer arrayInitializer) {
-		List<Expression> expressions = this.downcastExpressions(arrayInitializer);
+	public String[] convert_(ArrayInitializer arrayInitializer) {
+		List<E> expressions = this.downcastExpressions(arrayInitializer);
 		int len = expressions.size();
 		String[] strings = new String[len];
 		for (int i = len; i-- > 0; ) {
@@ -104,7 +91,7 @@
 	}
 
 	@SuppressWarnings("unchecked")
-	private List<Expression> downcastExpressions(ArrayInitializer arrayInitializer) {
+	private List<E> downcastExpressions(ArrayInitializer arrayInitializer) {
 		return arrayInitializer.expressions();
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/StringExpressionConverter.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/StringExpressionConverter.java
index 9560ca2..444650f 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/StringExpressionConverter.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/StringExpressionConverter.java
@@ -10,21 +10,21 @@
 package org.eclipse.jpt.core.internal.jdtutility;
 
 import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.StringLiteral;
 
 /**
  * Convert a string literal to/from a string (e.g. "text").
  */
 public final class StringExpressionConverter
-	extends AbstractExpressionConverter<String>
+	extends AbstractExpressionConverter<String, StringLiteral>
 {
-	private static ExpressionConverter<String> INSTANCE;
+	private static ExpressionConverter<String, StringLiteral> INSTANCE;
 
 	/**
 	 * Return the singleton.
 	 */
-	public static ExpressionConverter<String> instance() {
+	public static ExpressionConverter<String, StringLiteral> instance() {
 		if (INSTANCE == null) {
 			INSTANCE = new StringExpressionConverter();
 		}
@@ -39,16 +39,18 @@
 	}
 
 	@Override
-	protected StringLiteral convertObject(String string, AST ast) {
+	protected StringLiteral convert_(String string, AST ast) {
 		StringLiteral stringLiteral = ast.newStringLiteral();
 		stringLiteral.setLiteralValue(string);
 		return stringLiteral;
 	}
 
 	@Override
-	protected String convertExpression(Expression expression) {
-		Object value = expression.resolveConstantExpressionValue();
-		return (value instanceof String) ? (String) value : null;
+	protected String convert_(StringLiteral stringLiteral) {
+		return (stringLiteral.getNodeType() == ASTNode.STRING_LITERAL) ?
+			stringLiteral.getLiteralValue()
+		:
+			null;
 	}
 
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/Type.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/Type.java
index b721f4f..58f10a5 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/Type.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jdtutility/Type.java
@@ -16,7 +16,6 @@
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
 import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jdt.core.dom.TypeDeclaration;
 import org.eclipse.jpt.utility.internal.CommandExecutorProvider;
 
@@ -31,6 +30,11 @@
 		return (IType) super.getJdtMember();
 	}
 
+	@Override
+	public TypeDeclaration bodyDeclaration() {
+		return (TypeDeclaration) super.bodyDeclaration();
+	}
+
 	public boolean isAbstract() {
 		try {
 			return Flags.isAbstract(this.getJdtMember().getFlags());
@@ -49,10 +53,6 @@
 	}
 
 
-	public ITypeBinding typeBinding(CompilationUnit astRoot) {
-		return bodyDeclaration(astRoot).resolveBinding();
-	}
-
 	// ********** Member implementation **********
 
 	@Override
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IAbstractJoinColumn.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IAbstractJoinColumn.java
index 7e989bb..8cdd52f 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IAbstractJoinColumn.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IAbstractJoinColumn.java
@@ -2,7 +2,7 @@
  * <copyright>
  * </copyright>
  *
- * $Id: IAbstractJoinColumn.java,v 1.10 2007/09/05 15:14:59 kmoore Exp $
+ * $Id: IAbstractJoinColumn.java,v 1.9 2007/05/30 20:39:02 pfullbright Exp $
  */
 package org.eclipse.jpt.core.internal.mappings;
 
@@ -110,7 +110,6 @@
 	 */
 	IAbstractJoinColumn.Owner getOwner();
 
-	boolean isVirtual();
 
 	interface Owner extends INamedColumn.Owner
 	{
@@ -123,9 +122,5 @@
 		 * return the list of join columns containing the join column
 		 */
 		List<? extends IAbstractJoinColumn> joinColumns();
-		
-		int indexOf(IAbstractJoinColumn joinColumn);
-		
-		boolean isVirtual(IAbstractJoinColumn joinColumn);
 	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IAssociationOverride.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IAssociationOverride.java
index 8f1105d..494a0e3 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IAssociationOverride.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IAssociationOverride.java
@@ -110,10 +110,6 @@
 			return this.associationOverride.getJoinColumns();
 		}
 
-		public int indexOf(IAbstractJoinColumn joinColumn) {
-			return joinColumns().indexOf(joinColumn);
-		}
-		
 		public IEntity targetEntity() {
 			return getRelationshipMapping().getResolvedTargetEntity();
 		}
@@ -154,10 +150,5 @@
 			IEntity targetEntity = targetEntity();
 			return (targetEntity == null) ? null : targetEntity().primaryDbTable();
 		}
-		
-		public boolean isVirtual(IAbstractJoinColumn joinColumn) {
-			return this.associationOverride.getDefaultJoinColumns().contains(joinColumn);
-		}
-
 	}
 }
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IColumn.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IColumn.java
index 9abbc8f..aaf8467 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IColumn.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IColumn.java
@@ -20,11 +20,8 @@
  * The following features are supported:
  * <ul>
  *   <li>{@link org.eclipse.jpt.core.internal.mappings.IColumn#getLength <em>Length</em>}</li>
- *   <li>{@link org.eclipse.jpt.core.internal.mappings.IColumn#getSpecifiedLength <em>Specified Length</em>}</li>
  *   <li>{@link org.eclipse.jpt.core.internal.mappings.IColumn#getPrecision <em>Precision</em>}</li>
- *   <li>{@link org.eclipse.jpt.core.internal.mappings.IColumn#getSpecifiedPrecision <em>Specified Precision</em>}</li>
  *   <li>{@link org.eclipse.jpt.core.internal.mappings.IColumn#getScale <em>Scale</em>}</li>
- *   <li>{@link org.eclipse.jpt.core.internal.mappings.IColumn#getSpecifiedScale <em>Specified Scale</em>}</li>
  * </ul>
  * </p>
  *
@@ -34,14 +31,9 @@
  */
 public interface IColumn extends IAbstractColumn
 {
-	int DEFAULT_LENGTH = 255;
-
-	int DEFAULT_PRECISION = 0;
-
-	int DEFAULT_SCALE = 0;
-
 	/**
 	 * Returns the value of the '<em><b>Length</b></em>' attribute.
+	 * The default value is <code>"255"</code>.
 	 * <!-- begin-user-doc -->
 	 * <p>
 	 * If the meaning of the '<em>Length</em>' attribute isn't clear,
@@ -49,38 +41,22 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Length</em>' attribute.
+	 * @see #setLength(int)
 	 * @see org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage#getIColumn_Length()
-	 * @model changeable="false" volatile="true" derived="true"
+	 * @model default="255"
 	 * @generated
 	 */
 	int getLength();
 
 	/**
-	 * Returns the value of the '<em><b>Specified Length</b></em>' attribute.
-	 * The default value is <code>"-1"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Specified Length</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Specified Length</em>' attribute.
-	 * @see #setSpecifiedLength(int)
-	 * @see org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage#getIColumn_SpecifiedLength()
-	 * @model default="-1"
-	 * @generated
-	 */
-	int getSpecifiedLength();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.mappings.IColumn#getSpecifiedLength <em>Specified Length</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.mappings.IColumn#getLength <em>Length</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Specified Length</em>' attribute.
-	 * @see #getSpecifiedLength()
+	 * @param value the new value of the '<em>Length</em>' attribute.
+	 * @see #getLength()
 	 * @generated
 	 */
-	void setSpecifiedLength(int value);
+	void setLength(int value);
 
 	/**
 	 * Returns the value of the '<em><b>Precision</b></em>' attribute.
@@ -91,38 +67,22 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Precision</em>' attribute.
+	 * @see #setPrecision(int)
 	 * @see org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage#getIColumn_Precision()
-	 * @model changeable="false" volatile="true" derived="true"
+	 * @model
 	 * @generated
 	 */
 	int getPrecision();
 
 	/**
-	 * Returns the value of the '<em><b>Specified Precision</b></em>' attribute.
-	 * The default value is <code>"-1"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Specified Precision</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Specified Precision</em>' attribute.
-	 * @see #setSpecifiedPrecision(int)
-	 * @see org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage#getIColumn_SpecifiedPrecision()
-	 * @model default="-1"
-	 * @generated
-	 */
-	int getSpecifiedPrecision();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.mappings.IColumn#getSpecifiedPrecision <em>Specified Precision</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.mappings.IColumn#getPrecision <em>Precision</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Specified Precision</em>' attribute.
-	 * @see #getSpecifiedPrecision()
+	 * @param value the new value of the '<em>Precision</em>' attribute.
+	 * @see #getPrecision()
 	 * @generated
 	 */
-	void setSpecifiedPrecision(int value);
+	void setPrecision(int value);
 
 	/**
 	 * Returns the value of the '<em><b>Scale</b></em>' attribute.
@@ -133,62 +93,22 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Scale</em>' attribute.
+	 * @see #setScale(int)
 	 * @see org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage#getIColumn_Scale()
-	 * @model changeable="false" volatile="true" derived="true"
+	 * @model
 	 * @generated
 	 */
 	int getScale();
 
 	/**
-	 * Returns the value of the '<em><b>Specified Scale</b></em>' attribute.
-	 * The default value is <code>"-1"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Specified Scale</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Specified Scale</em>' attribute.
-	 * @see #setSpecifiedScale(int)
-	 * @see org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage#getIColumn_SpecifiedScale()
-	 * @model default="-1"
-	 * @generated
-	 */
-	int getSpecifiedScale();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.mappings.IColumn#getSpecifiedScale <em>Specified Scale</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.mappings.IColumn#getScale <em>Scale</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Specified Scale</em>' attribute.
-	 * @see #getSpecifiedScale()
+	 * @param value the new value of the '<em>Scale</em>' attribute.
+	 * @see #getScale()
 	 * @generated
 	 */
-	void setSpecifiedScale(int value);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model kind="operation"
-	 * @generated
-	 */
-	int getDefaultLength();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model kind="operation"
-	 * @generated
-	 */
-	int getDefaultPrecision();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model kind="operation"
-	 * @generated
-	 */
-	int getDefaultScale();
+	void setScale(int value);
 
 	void refreshDefaults(DefaultsContext defaultsContext);
 
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IEntity.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IEntity.java
index efb7880..78b1453 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IEntity.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IEntity.java
@@ -682,13 +682,5 @@
 		public List<IPrimaryKeyJoinColumn> joinColumns() {
 			return this.entity.getPrimaryKeyJoinColumns();
 		}
-		
-		public boolean isVirtual(IAbstractJoinColumn joinColumn) {
-			return this.entity.getDefaultPrimaryKeyJoinColumns().contains(joinColumn);
-		}
-		
-		public int indexOf(IAbstractJoinColumn joinColumn) {
-			return joinColumns().indexOf(joinColumn);
-		}
 	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IJoinColumn.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IJoinColumn.java
index 141b55e..fe07763 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IJoinColumn.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IJoinColumn.java
@@ -23,6 +23,7 @@
 {
 	IJoinColumn.Owner getOwner();
 
+
 	/**
 	 * interface allowing join columns to be used in multiple places
 	 * (e.g. 1:1 mappings and join tables)
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IJoinTable.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IJoinTable.java
index a89d7e9..98c56f0 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IJoinTable.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IJoinTable.java
@@ -213,10 +213,6 @@
 		public List<IJoinColumn> joinColumns() {
 			return getJoinTable().getInverseJoinColumns();
 		}
-		
-		public int indexOf(IAbstractJoinColumn joinColumn) {
-			return joinColumns().indexOf(joinColumn);
-		}
 
 		public IEntity targetEntity() {
 			return getJoinTable().relationshipMapping().getResolvedTargetEntity();
@@ -240,10 +236,6 @@
 			IEntity targetEntity = targetEntity();
 			return (targetEntity == null) ? null : targetEntity.primaryDbTable();
 		}
-		
-		public boolean isVirtual(IAbstractJoinColumn joinColumn) {
-			return getJoinTable().getDefaultInverseJoinColumns().contains(joinColumn);
-		}
 	}
 
 
@@ -260,10 +252,6 @@
 		public List<IJoinColumn> joinColumns() {
 			return getJoinTable().getJoinColumns();
 		}
-		
-		public int indexOf(IAbstractJoinColumn joinColumn) {
-			return joinColumns().indexOf(joinColumn);
-		}
 
 		public IEntity targetEntity() {
 			return getJoinTable().relationshipMapping().getEntity();
@@ -300,9 +288,5 @@
 		public Table dbReferencedColumnTable() {
 			return getTypeMapping().primaryDbTable();
 		}
-		
-		public boolean isVirtual(IAbstractJoinColumn joinColumn) {
-			return getJoinTable().getDefaultJoinColumns().contains(joinColumn);
-		}
 	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IRelationshipMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IRelationshipMapping.java
index f1da127..3b75797 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IRelationshipMapping.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/IRelationshipMapping.java
@@ -9,7 +9,6 @@
  ******************************************************************************/
 package org.eclipse.jpt.core.internal.mappings;
 
-import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jpt.core.internal.IAttributeMapping;
 
 /**
@@ -152,7 +151,7 @@
 	 * as fully qualified then just return that.
 	 * @return
 	 */
-	String fullyQualifiedTargetEntity(CompilationUnit astRoot);
+	String fullyQualifiedTargetEntity();
 
 	/**
 	 * Return the Entity that owns this relationship mapping
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/ISecondaryTable.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/ISecondaryTable.java
index dd02c7c..19758b2 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/ISecondaryTable.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/ISecondaryTable.java
@@ -98,7 +98,6 @@
 
 	boolean containsSpecifiedPrimaryKeyJoinColumns();
 
-	boolean isVirtual();
 
 	class PrimaryKeyJoinColumnOwner implements IAbstractJoinColumn.Owner
 	{
@@ -127,13 +126,5 @@
 		public List<IPrimaryKeyJoinColumn> joinColumns() {
 			return this.secondaryTable.getPrimaryKeyJoinColumns();
 		}
-		
-		public boolean isVirtual(IAbstractJoinColumn joinColumn) {
-			return this.secondaryTable.getDefaultPrimaryKeyJoinColumns().contains(joinColumn);
-		}
-		
-		public int indexOf(IAbstractJoinColumn joinColumn) {
-			return joinColumns().indexOf(joinColumn);
-		}
 	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/ISingleRelationshipMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/ISingleRelationshipMapping.java
index 612b45f..a49d0ac 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/ISingleRelationshipMapping.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/ISingleRelationshipMapping.java
@@ -167,10 +167,6 @@
 		public List<IJoinColumn> joinColumns() {
 			return this.singleRelationshipMapping.getJoinColumns();
 		}
-		
-		public int indexOf(IAbstractJoinColumn joinColumn) {
-			return joinColumns().indexOf(joinColumn);
-		}
 
 		public IEntity targetEntity() {
 			return this.singleRelationshipMapping.getResolvedTargetEntity();
@@ -211,9 +207,5 @@
 			IEntity targetEntity = targetEntity();
 			return (targetEntity == null) ? null : targetEntity().primaryDbTable();
 		}
-		
-		public boolean isVirtual(IAbstractJoinColumn joinColumn) {
-			return this.singleRelationshipMapping.getDefaultJoinColumns().contains(joinColumn);
-		}
 	}
 }
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/JpaCoreMappingsPackage.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/JpaCoreMappingsPackage.java
index 2cd8c08..35eb236 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/JpaCoreMappingsPackage.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/mappings/JpaCoreMappingsPackage.java
@@ -827,31 +827,13 @@
 	public static final int ICOLUMN__LENGTH = IABSTRACT_COLUMN_FEATURE_COUNT + 0;
 
 	/**
-	 * The feature id for the '<em><b>Specified Length</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	public static final int ICOLUMN__SPECIFIED_LENGTH = IABSTRACT_COLUMN_FEATURE_COUNT + 1;
-
-	/**
 	 * The feature id for the '<em><b>Precision</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	public static final int ICOLUMN__PRECISION = IABSTRACT_COLUMN_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Specified Precision</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	public static final int ICOLUMN__SPECIFIED_PRECISION = IABSTRACT_COLUMN_FEATURE_COUNT + 3;
+	public static final int ICOLUMN__PRECISION = IABSTRACT_COLUMN_FEATURE_COUNT + 1;
 
 	/**
 	 * The feature id for the '<em><b>Scale</b></em>' attribute.
@@ -860,16 +842,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	public static final int ICOLUMN__SCALE = IABSTRACT_COLUMN_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Specified Scale</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	public static final int ICOLUMN__SPECIFIED_SCALE = IABSTRACT_COLUMN_FEATURE_COUNT + 5;
+	public static final int ICOLUMN__SCALE = IABSTRACT_COLUMN_FEATURE_COUNT + 2;
 
 	/**
 	 * The number of structural features of the '<em>IColumn</em>' class.
@@ -878,7 +851,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	public static final int ICOLUMN_FEATURE_COUNT = IABSTRACT_COLUMN_FEATURE_COUNT + 6;
+	public static final int ICOLUMN_FEATURE_COUNT = IABSTRACT_COLUMN_FEATURE_COUNT + 3;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.jpt.core.internal.mappings.IColumnMapping <em>IColumn Mapping</em>}' class.
@@ -4760,19 +4733,6 @@
 	}
 
 	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jpt.core.internal.mappings.IColumn#getSpecifiedLength <em>Specified Length</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Specified Length</em>'.
-	 * @see org.eclipse.jpt.core.internal.mappings.IColumn#getSpecifiedLength()
-	 * @see #getIColumn()
-	 * @generated
-	 */
-	public EAttribute getIColumn_SpecifiedLength() {
-		return (EAttribute) iColumnEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
 	 * Returns the meta object for the attribute '{@link org.eclipse.jpt.core.internal.mappings.IColumn#getPrecision <em>Precision</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4782,20 +4742,7 @@
 	 * @generated
 	 */
 	public EAttribute getIColumn_Precision() {
-		return (EAttribute) iColumnEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jpt.core.internal.mappings.IColumn#getSpecifiedPrecision <em>Specified Precision</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Specified Precision</em>'.
-	 * @see org.eclipse.jpt.core.internal.mappings.IColumn#getSpecifiedPrecision()
-	 * @see #getIColumn()
-	 * @generated
-	 */
-	public EAttribute getIColumn_SpecifiedPrecision() {
-		return (EAttribute) iColumnEClass.getEStructuralFeatures().get(3);
+		return (EAttribute) iColumnEClass.getEStructuralFeatures().get(1);
 	}
 
 	/**
@@ -4808,20 +4755,7 @@
 	 * @generated
 	 */
 	public EAttribute getIColumn_Scale() {
-		return (EAttribute) iColumnEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jpt.core.internal.mappings.IColumn#getSpecifiedScale <em>Specified Scale</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Specified Scale</em>'.
-	 * @see org.eclipse.jpt.core.internal.mappings.IColumn#getSpecifiedScale()
-	 * @see #getIColumn()
-	 * @generated
-	 */
-	public EAttribute getIColumn_SpecifiedScale() {
-		return (EAttribute) iColumnEClass.getEStructuralFeatures().get(5);
+		return (EAttribute) iColumnEClass.getEStructuralFeatures().get(2);
 	}
 
 	/**
@@ -6660,11 +6594,8 @@
 		createEAttribute(iAbstractColumnEClass, IABSTRACT_COLUMN__DEFAULT_TABLE);
 		iColumnEClass = createEClass(ICOLUMN);
 		createEAttribute(iColumnEClass, ICOLUMN__LENGTH);
-		createEAttribute(iColumnEClass, ICOLUMN__SPECIFIED_LENGTH);
 		createEAttribute(iColumnEClass, ICOLUMN__PRECISION);
-		createEAttribute(iColumnEClass, ICOLUMN__SPECIFIED_PRECISION);
 		createEAttribute(iColumnEClass, ICOLUMN__SCALE);
-		createEAttribute(iColumnEClass, ICOLUMN__SPECIFIED_SCALE);
 		iColumnMappingEClass = createEClass(ICOLUMN_MAPPING);
 		iBasicEClass = createEClass(IBASIC);
 		createEAttribute(iBasicEClass, IBASIC__FETCH);
@@ -6941,15 +6872,9 @@
 		initEAttribute(getIAbstractColumn_SpecifiedTable(), ecorePackage.getEString(), "specifiedTable", null, 0, 1, IAbstractColumn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getIAbstractColumn_DefaultTable(), ecorePackage.getEString(), "defaultTable", null, 0, 1, IAbstractColumn.class, !IS_TRANSIENT, !IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEClass(iColumnEClass, IColumn.class, "IColumn", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getIColumn_Length(), ecorePackage.getEInt(), "length", null, 0, 1, IColumn.class, !IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getIColumn_SpecifiedLength(), theEcorePackage.getEInt(), "specifiedLength", "-1", 0, 1, IColumn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getIColumn_Precision(), ecorePackage.getEInt(), "precision", null, 0, 1, IColumn.class, !IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getIColumn_SpecifiedPrecision(), theEcorePackage.getEInt(), "specifiedPrecision", "-1", 0, 1, IColumn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getIColumn_Scale(), ecorePackage.getEInt(), "scale", null, 0, 1, IColumn.class, !IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getIColumn_SpecifiedScale(), theEcorePackage.getEInt(), "specifiedScale", "-1", 0, 1, IColumn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		addEOperation(iColumnEClass, theEcorePackage.getEInt(), "getDefaultLength", 0, 1, IS_UNIQUE, IS_ORDERED);
-		addEOperation(iColumnEClass, theEcorePackage.getEInt(), "getDefaultPrecision", 0, 1, IS_UNIQUE, IS_ORDERED);
-		addEOperation(iColumnEClass, theEcorePackage.getEInt(), "getDefaultScale", 0, 1, IS_UNIQUE, IS_ORDERED);
+		initEAttribute(getIColumn_Length(), ecorePackage.getEInt(), "length", "255", 0, 1, IColumn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getIColumn_Precision(), ecorePackage.getEInt(), "precision", null, 0, 1, IColumn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getIColumn_Scale(), ecorePackage.getEInt(), "scale", null, 0, 1, IColumn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEClass(iColumnMappingEClass, IColumnMapping.class, "IColumnMapping", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		addEOperation(iColumnMappingEClass, this.getIColumn(), "getColumn", 0, 1, IS_UNIQUE, IS_ORDERED);
 		initEClass(iBasicEClass, IBasic.class, "IBasic", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
@@ -7608,14 +7533,6 @@
 		public static final EAttribute ICOLUMN__LENGTH = eINSTANCE.getIColumn_Length();
 
 		/**
-		 * The meta object literal for the '<em><b>Specified Length</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		public static final EAttribute ICOLUMN__SPECIFIED_LENGTH = eINSTANCE.getIColumn_SpecifiedLength();
-
-		/**
 		 * The meta object literal for the '<em><b>Precision</b></em>' attribute feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -7624,14 +7541,6 @@
 		public static final EAttribute ICOLUMN__PRECISION = eINSTANCE.getIColumn_Precision();
 
 		/**
-		 * The meta object literal for the '<em><b>Specified Precision</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		public static final EAttribute ICOLUMN__SPECIFIED_PRECISION = eINSTANCE.getIColumn_SpecifiedPrecision();
-
-		/**
 		 * The meta object literal for the '<em><b>Scale</b></em>' attribute feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -7640,14 +7549,6 @@
 		public static final EAttribute ICOLUMN__SCALE = eINSTANCE.getIColumn_Scale();
 
 		/**
-		 * The meta object literal for the '<em><b>Specified Scale</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		public static final EAttribute ICOLUMN__SPECIFIED_SCALE = eINSTANCE.getIColumn_SpecifiedScale();
-
-		/**
 		 * The meta object literal for the '{@link org.eclipse.jpt.core.internal.mappings.IColumnMapping <em>IColumn Mapping</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/AbstractJoinColumnContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/AbstractJoinColumnContext.java
index cf4dc2f..3f266f4 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/AbstractJoinColumnContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/AbstractJoinColumnContext.java
@@ -8,7 +8,7 @@
  *******************************************************************************/
 package org.eclipse.jpt.core.internal.platform;
 
-import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.mappings.IAbstractJoinColumn;
 
 public abstract class AbstractJoinColumnContext<E extends IAbstractJoinColumn> extends BaseContext
@@ -27,14 +27,12 @@
 		return this.column;
 	}
 	
-	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaults(DefaultsContext defaultsContext) {
 		this.column.refreshDefaults(wrapDefaultsContext(defaultsContext));
 	}
 	
-	public DefaultsContext wrapDefaultsContext(DefaultsContext defaultsContext) {
-		return new DefaultsContextWrapper(defaultsContext) {
+	public DefaultsContext wrapDefaultsContext(final DefaultsContext defaultsContext) {
+		return new DefaultsContext() {
 			public Object getDefault(String key) {
 				if (key.equals(BaseJpaPlatform.DEFAULT_JOIN_COLUMN_NAME_KEY)) {
 					return buildDefaultName();
@@ -42,7 +40,11 @@
 				if (key.equals(BaseJpaPlatform.DEFAULT_JOIN_COLUMN_REFERENCED_COLUMN_NAME_KEY)) {
 					return buildDefaultReferencedColumnName();
 				}
-				return super.getDefault(key);
+				return defaultsContext.getDefault(key);
+			}
+		
+			public IPersistentType persistentType(String fullyQualifiedTypeName) {
+				return defaultsContext.persistentType(fullyQualifiedTypeName);
 			}
 		};
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/AssociationOverrideContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/AssociationOverrideContext.java
index e8d0a29..ace55b4 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/AssociationOverrideContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/AssociationOverrideContext.java
@@ -11,7 +11,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.ITypeMapping;
 import org.eclipse.jpt.core.internal.mappings.IAssociationOverride;
 import org.eclipse.jpt.core.internal.mappings.IJoinColumn;
@@ -43,11 +42,9 @@
 		return contexts;
 	}
 	
-	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaults(DefaultsContext defaultsContext) {
 		for (JoinColumnContext context : this.joinColumnContexts) {
-			context.refreshDefaults(defaultsContext, monitor);
+			context.refreshDefaults(defaultsContext);
 		}
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/AttributeOverrideContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/AttributeOverrideContext.java
index 6673819..8d15c03 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/AttributeOverrideContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/AttributeOverrideContext.java
@@ -9,7 +9,7 @@
 package org.eclipse.jpt.core.internal.platform;
 
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.ITypeMapping;
 import org.eclipse.jpt.core.internal.mappings.IAttributeOverride;
 import org.eclipse.jpt.core.internal.mappings.IColumn;
@@ -37,8 +37,12 @@
 		return new ColumnContext(this, this.attributeOverride.getColumn());
 	}
 	
-	public DefaultsContext wrapDefaultsContext(DefaultsContext defaultsContext) {
-		return new DefaultsContextWrapper(defaultsContext) {	
+	public DefaultsContext wrapDefaultsContext(final DefaultsContext defaultsContext) {
+		return new DefaultsContext() {
+			public IPersistentType persistentType(String fullyQualifiedTypeName) {
+				return defaultsContext.persistentType(fullyQualifiedTypeName);
+			}
+		
 			public Object getDefault(String key) {
 				if (key.equals(BaseJpaPlatform.DEFAULT_COLUMN_NAME_KEY)) {
 					return buildDefaultColumnName();
@@ -50,7 +54,7 @@
 					}
 				
 				}
-				return super.getDefault(key);
+				return defaultsContext.getDefault(key);
 			}
 		};
 	}
@@ -78,10 +82,8 @@
 		return columnMapping.getColumn().getSpecifiedTable();
 	}
 	
-	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
-		this.columnContext.refreshDefaults(wrapDefaultsContext(defaultsContext), monitor);
+	public void refreshDefaults(DefaultsContext defaultsContext) {
+		this.columnContext.refreshDefaults(wrapDefaultsContext(defaultsContext));
 	}
 
 	@Override
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseContext.java
index 96bf12a..fda56cf 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseContext.java
@@ -9,7 +9,6 @@
 package org.eclipse.jpt.core.internal.platform;
 
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.IJpaPlatform;
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
 
@@ -47,7 +46,7 @@
 	 * All subclass implementation {@link #refreshDefaults(DefaultsContext)} 
 	 * should be preceded by a "super" call to this method
 	 */
-	public void refreshDefaults(DefaultsContext parentDefaults, IProgressMonitor monitor) {
+	public void refreshDefaults(DefaultsContext parentDefaults) {
 		initialize();
 	}
 	
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseJpaPlatform.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseJpaPlatform.java
index 3db50fb..d51ae1d 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseJpaPlatform.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseJpaPlatform.java
@@ -14,8 +14,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.jpt.core.internal.IJpaFactory;
 import org.eclipse.jpt.core.internal.IJpaFile;
 import org.eclipse.jpt.core.internal.IJpaFileContentProvider;
@@ -49,6 +47,7 @@
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaMappedSuperclassProvider;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaNullAttributeMapping;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaNullTypeMapping;
+import org.eclipse.jpt.core.internal.content.java.mappings.JavaNullTypeMappingProvider;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaOneToMany;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaOneToManyProvider;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaOneToOne;
@@ -209,6 +208,7 @@
 	 * Entity, MappedSuperclass, and Embeddable
 	 */
 	protected void addJavaTypeMappingProvidersTo(Collection<IJavaTypeMappingProvider> providers) {
+		providers.add(JavaNullTypeMappingProvider.instance());
 		providers.add(JavaEntityProvider.instance());
 		providers.add(JavaMappedSuperclassProvider.instance());
 		providers.add(JavaEmbeddableProvider.instance());
@@ -221,7 +221,7 @@
 				return provider;
 			}
 		}
-		return null;
+		throw new IllegalArgumentException("Unsupported java type mapping key: " + typeMappingKey);
 	}
 	
 	public Iterator<IJavaAttributeMappingProvider> javaAttributeMappingProviders() {
@@ -349,17 +349,13 @@
 		}
 	}
 	
-	public void resynch(IContext contextHierarchy, IProgressMonitor monitor) {
-		((BaseJpaProjectContext) contextHierarchy).refreshDefaults(monitor);
+	public void resynch(IContext contextHierarchy) {
+		((BaseJpaProjectContext) contextHierarchy).refreshDefaults();
 	}
 	
 	public void addToMessages(List<IMessage> messages) {
-		//I believe we need to be calling JpaProject.resynch() here.
-		//How can we handle this, we need to resynch and then wait until it is done
-		//resynching before calling this.  what happens if something changes out from
-		//under us while we are resynching??
 		BaseJpaProjectContext context = (BaseJpaProjectContext) buildProjectContext();
-		context.refreshDefaults(new NullProgressMonitor());
+		context.refreshDefaults();
 		context.addToMessages(messages);
 	}
 	
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseJpaProjectContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseJpaProjectContext.java
index b959219..28237aa 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseJpaProjectContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/BaseJpaProjectContext.java
@@ -15,10 +15,7 @@
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jpt.core.internal.IJpaFile;
 import org.eclipse.jpt.core.internal.IJpaPlatform;
 import org.eclipse.jpt.core.internal.IJpaProject;
@@ -140,32 +137,24 @@
 		return validPersistenceXmlFiles.iterator();
 	}
 	
-	public void refreshDefaults(IProgressMonitor monitor) {
-		refreshDefaults(null, monitor);
+	public void refreshDefaults() {
+		refreshDefaults(null);
 	}
 	
-	@Override
-	public void refreshDefaults(DefaultsContext parentDefaults, IProgressMonitor monitor) {
-		super.refreshDefaults(parentDefaults, monitor);
+	public void refreshDefaults(DefaultsContext parentDefaults) {
+		super.refreshDefaults(parentDefaults);
 		DefaultsContext defaultsContext = buildDefaultsContext();
 		for (PersistenceUnitContext context : this.persistenceUnitContexts) {
-			checkCanceled(monitor);
-			context.refreshDefaults(defaultsContext, monitor);
+			context.refreshDefaults(defaultsContext);
 		}
 	}
 	
-	private void checkCanceled(IProgressMonitor monitor) {
-		if (monitor.isCanceled()) {
-			throw new OperationCanceledException();
-		}		
-	}
-	
 	private DefaultsContext buildDefaultsContext() {
 		return new DefaultsContext(){
 			public Object getDefault(String key) {
 				if (key.equals(BaseJpaPlatform.DEFAULT_TABLE_SCHEMA_KEY) 
 					|| key.equals(BaseJpaPlatform.DEFAULT_TABLE_GENERATOR_SCHEMA_KEY)) {
-					return getDefaultSchema();
+					return getProjectUserSchema();
 				}
 				else if (key.equals(BaseJpaPlatform.DEFAULT_TABLE_CATALOG_KEY)) {
 					return getProjectUserCatalog();
@@ -175,9 +164,6 @@
 			public IPersistentType persistentType(String fullyQualifiedTypeName) {
 				return null;
 			}
-			public CompilationUnit astRoot() {
-				return null;
-			}
 		};
 	}
 	
@@ -185,9 +171,10 @@
 		return this.jpaProject.connectionProfile();
 	}
 	
-	private String getDefaultSchema() {
+	//TODO is the userName what we want to use, or do we need a preference for the user?
+	private String getProjectUserSchema() {
 		ConnectionProfile profile = this.getProjectConnectionProfile();
-		return  profile.getDefaultSchema();
+		return  profile.getUserName();
 	}
 
 	private String getProjectUserCatalog() {
@@ -338,7 +325,7 @@
 	
 	protected void addInvalidPersistenceXmlContentMessage(List<IMessage> messages) {
 		if (validPersistenceXmlFiles.size() == 1) {
-			IJpaFile persistenceXmlFile = validPersistenceXmlFiles.get(0);
+			IJpaFile persistenceXmlFile = (IJpaFile) validPersistenceXmlFiles.get(0);
 			if (getPersistence(persistenceXmlFile) == null) {
 				PersistenceXmlRootContentNode root = 
 					(PersistenceXmlRootContentNode) persistenceXmlFile.getContent();
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/ColumnContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/ColumnContext.java
index 6962951..b042c99 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/ColumnContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/ColumnContext.java
@@ -8,7 +8,6 @@
  *******************************************************************************/
 package org.eclipse.jpt.core.internal.platform;
 
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.mappings.IColumn;
 
 public class ColumnContext extends BaseContext
@@ -27,9 +26,7 @@
 		return this.column;
 	}
 	
-	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaults(DefaultsContext defaultsContext) {
 		this.column.refreshDefaults(defaultsContext);
 	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/DefaultsContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/DefaultsContext.java
index 985cb52..556917f 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/DefaultsContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/DefaultsContext.java
@@ -8,7 +8,6 @@
  *******************************************************************************/
 package org.eclipse.jpt.core.internal.platform;
 
-import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jpt.core.internal.IPersistentType;
 
 public interface DefaultsContext
@@ -28,12 +27,4 @@
 	 * @return
 	 */
 	IPersistentType persistentType(String fullyQualifiedTypeName);
-	
-	/**
-	 * Return null in instances where the scope is not within a PersistentType.
-	 * Otherwise return the CompilationUnit for the persistentType so that we
-	 * don't have to build this everything.  It is costly to build and resolve bindings.
-	 * @return
-	 */
-	CompilationUnit astRoot();
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/DefaultsContextWrapper.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/DefaultsContextWrapper.java
deleted file mode 100644
index c38867f..0000000
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/DefaultsContextWrapper.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.eclipse.jpt.core.internal.platform;
-
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jpt.core.internal.IPersistentType;
-
-public class DefaultsContextWrapper implements DefaultsContext
-{
-	private DefaultsContext wrappedDefaultsContext;
-	
-	public DefaultsContextWrapper(DefaultsContext wrappedDefaultsContext) {
-		this.wrappedDefaultsContext = wrappedDefaultsContext;
-	}
-	public CompilationUnit astRoot() {
-		return this.wrappedDefaultsContext.astRoot();
-	}
-
-	public Object getDefault(String key) {
-		return this.wrappedDefaultsContext.getDefault(key);
-	}
-
-	public IPersistentType persistentType(String fullyQualifiedTypeName) {
-		return this.wrappedDefaultsContext.persistentType(fullyQualifiedTypeName);
-	}
-	
-	protected DefaultsContext getWrappedDefaultsContext() {
-		return this.wrappedDefaultsContext;
-	}
-}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/IContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/IContext.java
index b807b57..5072585 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/IContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/IContext.java
@@ -9,7 +9,6 @@
 package org.eclipse.jpt.core.internal.platform;
 
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.IJpaPlatform;
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
 
@@ -19,7 +18,7 @@
 	
 	IContext getParentContext();
 	
-	void refreshDefaults(DefaultsContext defaults, IProgressMonitor monitor);
+	void refreshDefaults(DefaultsContext defaults);
 	
 	void addToMessages(List<IMessage> messages);
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaAttributeContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaAttributeContext.java
index 5f5bf74..ef40e6a 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaAttributeContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaAttributeContext.java
@@ -9,11 +9,11 @@
 package org.eclipse.jpt.core.internal.platform;
 
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.Flags;
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jpt.core.internal.IAttributeMapping;
 import org.eclipse.jpt.core.internal.IMappingKeys;
+import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.ITypeMapping;
 import org.eclipse.jpt.core.internal.content.java.IJavaAttributeMapping;
 import org.eclipse.jpt.core.internal.content.java.JavaPersistentAttribute;
@@ -53,14 +53,12 @@
 		return getMapping().typeMapping().getKey() == IMappingKeys.ENTITY_TYPE_MAPPING_KEY;
 	}
 	
-	@Override
-	public final void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
+	public final void refreshDefaults(DefaultsContext defaultsContext) {
 		defaultsContext = wrapDefaultsContext(defaultsContext);
-		refreshDefaultsInternal(defaultsContext, monitor);
+		refreshDefaultsInternal(defaultsContext);
 	}
 	
-	protected void refreshDefaultsInternal(DefaultsContext defaultsContext, IProgressMonitor monitor) {
+	protected void refreshDefaultsInternal(DefaultsContext defaultsContext) {
 		this.attributeMapping.refreshDefaults(defaultsContext);
 	}
 	
@@ -68,10 +66,14 @@
 		return this.attributeMapping;
 	}
 	
-	public final DefaultsContext wrapDefaultsContext(DefaultsContext defaultsContext) {
-		return new DefaultsContextWrapper(defaultsContext) {
+	public final DefaultsContext wrapDefaultsContext(final DefaultsContext defaultsContext) {
+		return new DefaultsContext() {
 			public Object getDefault(String key) {
-				return JavaAttributeContext.this.getDefault(key, getWrappedDefaultsContext());
+				return JavaAttributeContext.this.getDefault(key, defaultsContext);
+			}
+		
+			public IPersistentType persistentType(String fullyQualifiedTypeName) {
+				return defaultsContext.persistentType(fullyQualifiedTypeName);
 			}
 		};
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaBasicContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaBasicContext.java
index 1377998..f2a0d06 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaBasicContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaBasicContext.java
@@ -10,7 +10,6 @@
 package org.eclipse.jpt.core.internal.platform;
 
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.ITypeMapping;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaBasic;
 import org.eclipse.jpt.core.internal.mappings.IColumn;
@@ -32,9 +31,9 @@
 	}
 	
 	@Override
-	protected void refreshDefaultsInternal(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaultsInternal(defaultsContext, monitor);
-		this.columnContext.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaultsInternal(DefaultsContext defaultsContext) {
+		super.refreshDefaultsInternal(defaultsContext);
+		this.columnContext.refreshDefaults(defaultsContext);
 	}
 	
 	public void addToMessages(List<IMessage> messages) {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaEmbeddedContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaEmbeddedContext.java
index dbc7d7f..a3d8f6d 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaEmbeddedContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaEmbeddedContext.java
@@ -13,7 +13,6 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaAttributeOverride;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaEmbedded;
 import org.eclipse.jpt.core.internal.content.java.mappings.JpaJavaMappingsFactory;
@@ -44,11 +43,11 @@
 		return (IEmbedded) getMapping();
 	}
 	
-	protected void refreshDefaultsInternal(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaultsInternal(defaultsContext, monitor);
+	public void refreshDefaultsInternal(DefaultsContext defaultsContext) {
+		super.refreshDefaultsInternal(defaultsContext);
 		refreshDefaultAttributeOverrides();
 		for (AttributeOverrideContext context : this.attributeOverrideContexts) {
-			context.refreshDefaults(defaultsContext, monitor);
+			context.refreshDefaults(defaultsContext);
 		}
 	}
 	
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaEntityContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaEntityContext.java
index 571d1e8..a976dd9 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaEntityContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaEntityContext.java
@@ -13,8 +13,6 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jpt.core.internal.IPersistentAttribute;
 import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaAssociationOverride;
@@ -118,37 +116,30 @@
 		}
 	}
 
-	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
+	public void refreshDefaults(DefaultsContext defaultsContext) {
 		defaultsContext = wrapDefaultsContext(defaultsContext);
+		super.refreshDefaults(defaultsContext);
 		
 		if (this.tableContext != null) {
-			this.tableContext.refreshDefaults(defaultsContext, monitor);
+			this.tableContext.refreshDefaults(defaultsContext);
 		}
-		//refresh table defaults before attribute mapping defaults, since column mapping
-		//defaults depend on table defaults
-		super.refreshDefaults(defaultsContext, monitor);
 		refreshDefaultAttributeOverrides();
 		refreshDefaultAssociationOverrides();
 		for (SecondaryTableContext context : this.secondaryTableContexts) {
-			context.refreshDefaults(defaultsContext, monitor);
+			context.refreshDefaults(defaultsContext);
 		}
 		for (AttributeOverrideContext context : this.attributeOverrideContexts) {
-			context.refreshDefaults(defaultsContext, monitor);
+			context.refreshDefaults(defaultsContext);
 		}
 		for (AssociationOverrideContext context : this.associationOverrideContexts) {
-			context.refreshDefaults(defaultsContext, monitor);
+			context.refreshDefaults(defaultsContext);
 		}
 		for (PrimaryKeyJoinColumnContext context : this.pkJoinColumnContexts) {
-			context.refreshDefaults(defaultsContext, monitor);
+			context.refreshDefaults(defaultsContext);
 		}
 	}
-
-	//TODO the relationship between this class and JavaTypeContext is very confused
-	//we end up wrapping the defaults context multiple times.  Maybe we should
-	//make this more like JavaAttributeContext.  or maybe we need a JavaPersistentTypeContext
-	//I tried to minimize the change so as not to break the defaults calculations
-	private DefaultsContext wrapDefaultsContext(final DefaultsContext defaultsContext) {
+	
+	public DefaultsContext wrapDefaultsContext(final DefaultsContext defaultsContext) {
 		DefaultsContext wrappedDefaultsContext = new DefaultsContext() {
 			public Object getDefault(String key) {
 				if (key.equals(BaseJpaPlatform.DEFAULT_TABLE_NAME_KEY)) {
@@ -167,9 +158,6 @@
 			public IPersistentType persistentType(String fullyQualifiedTypeName) {
 				return defaultsContext.persistentType(fullyQualifiedTypeName);
 			}
-			public CompilationUnit astRoot() {
-				return getAstRoot();
-			}
 		};
 		if (this.tableContext != null) {
 			return this.tableContext.wrapDefaultsContext(wrappedDefaultsContext);
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaIdContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaIdContext.java
index c5ac1c4..2986138 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaIdContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaIdContext.java
@@ -10,7 +10,6 @@
 package org.eclipse.jpt.core.internal.platform;
 
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.ITypeMapping;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaId;
 import org.eclipse.jpt.core.internal.mappings.IColumn;
@@ -47,9 +46,9 @@
 	}
 	
 	@Override
-	protected void refreshDefaultsInternal(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaultsInternal(defaultsContext, monitor);
-		this.columnContext.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaultsInternal(DefaultsContext defaultsContext) {
+		super.refreshDefaultsInternal(defaultsContext);
+		this.columnContext.refreshDefaults(defaultsContext);
 		ITableGenerator tableGenerator = getId().getTableGenerator();
 		if (tableGenerator != null) {
 			tableGenerator.refreshDefaults(defaultsContext);
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaMultiRelationshipMappingContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaMultiRelationshipMappingContext.java
index 01545a8..87b7294 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaMultiRelationshipMappingContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaMultiRelationshipMappingContext.java
@@ -10,13 +10,13 @@
 
 import java.util.Iterator;
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.IPersistentAttribute;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaMultiRelationshipMapping;
 import org.eclipse.jpt.core.internal.mappings.IEntity;
 import org.eclipse.jpt.core.internal.mappings.IJoinColumn;
 import org.eclipse.jpt.core.internal.mappings.IJoinTable;
 import org.eclipse.jpt.core.internal.mappings.INonOwningMapping;
+import org.eclipse.jpt.core.internal.mappings.ITable;
 import org.eclipse.jpt.core.internal.validation.IJpaValidationMessages;
 import org.eclipse.jpt.core.internal.validation.JpaValidationMessages;
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
@@ -25,6 +25,7 @@
 {
 	private JoinTableContext joinTableContext;
 	
+		
 	protected JavaMultiRelationshipMappingContext(
 			IContext parentContext, JavaMultiRelationshipMapping mapping) {
 		super(parentContext, mapping);
@@ -32,11 +33,37 @@
 	}
 	
 	@Override
-	protected void refreshDefaultsInternal(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaultsInternal(defaultsContext, monitor);
-		this.joinTableContext.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaultsInternal(DefaultsContext defaultsContext) {
+		super.refreshDefaultsInternal(defaultsContext);
+		this.joinTableContext.refreshDefaults(defaultsContext);
 	}
 	
+	@Override
+	protected Object getDefault(String key, DefaultsContext defaultsContext) {
+		if (key.equals(BaseJpaPlatform.DEFAULT_JOIN_TABLE_NAME_KEY)) {
+			return joinTableDefaultName(defaultsContext);
+		}
+		return super.getDefault(key, defaultsContext);
+	}
+	
+	protected String joinTableDefaultName(DefaultsContext defaultsContext) {
+		IEntity entity = getMapping().getEntity();
+		if (entity == null) {
+			return null;
+		}
+		ITable owningTable = entity.getTable();
+		if (owningTable == null) {
+			return null;
+		}
+		IEntity targetEntity = targetEntity(defaultsContext);
+		if (targetEntity == null) {
+			return null;
+		}
+		ITable targetTable = targetEntity.getTable();
+		return (targetTable == null) ? null : owningTable.getName() + "_" + targetTable.getName();
+	}
+
+	
 	protected JavaMultiRelationshipMapping getMapping() {
 		return (JavaMultiRelationshipMapping) super.getMapping();
 	}
@@ -45,10 +72,10 @@
 		super.addToMessages(messages);
 		JavaMultiRelationshipMapping mapping = getMapping();
 		
-		if (mapping.isJoinTableSpecified()) {
+		if (getMapping().isJoinTableSpecified()) {
 			addJoinTableMessages(messages);
 		}
-		if (mapping.getMappedBy() != null) {
+		if (getMapping().getMappedBy() != null) {
 			addMappedByMessages(messages);
 		}
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaPersistentAttributeContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaPersistentAttributeContext.java
index b537737..573dab5 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaPersistentAttributeContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaPersistentAttributeContext.java
@@ -9,8 +9,8 @@
 package org.eclipse.jpt.core.internal.platform;
 
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.IMappingKeys;
+import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.content.java.IJavaAttributeMapping;
 import org.eclipse.jpt.core.internal.content.java.JavaPersistentAttribute;
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
@@ -58,25 +58,23 @@
 		return getPersistentAttribute().typeMapping().getKey() == IMappingKeys.ENTITY_TYPE_MAPPING_KEY;
 	}
 	
-	@Override
-	public final void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
+	public final void refreshDefaults(DefaultsContext defaultsContext) {
 		defaultsContext = wrapDefaultsContext(defaultsContext);
-		refreshDefaultsInternal(defaultsContext, monitor);
+		refreshDefaultsInternal(defaultsContext);
 	}
 	
-	protected void refreshDefaultsInternal(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
+	protected void refreshDefaultsInternal(DefaultsContext defaultsContext) {
 		this.javaPersistentAttribute.refreshDefaults(defaultsContext);
 		
 		if (this.javaAttributeMappingContext != null) {
-			this.javaAttributeMappingContext.refreshDefaults(defaultsContext, monitor);
+			this.javaAttributeMappingContext.refreshDefaults(defaultsContext);
 			this.defaultJavaAttributeMappingContext = null;
 		}
 		else {
 			IJavaAttributeMapping javaAttributeMapping = this.javaPersistentAttribute.getDefaultMapping();
 			if (javaAttributeMapping != null) {
 				this.defaultJavaAttributeMappingContext = (JavaAttributeContext) getPlatform().buildJavaAttributeContext(this, javaAttributeMapping);
-				this.defaultJavaAttributeMappingContext.refreshDefaults(defaultsContext, monitor);
+				this.defaultJavaAttributeMappingContext.refreshDefaults(defaultsContext);
 			}
 		}
 	}
@@ -85,10 +83,14 @@
 		return this.javaPersistentAttribute;
 	}
 	
-	public final DefaultsContext wrapDefaultsContext(DefaultsContext defaultsContext) {
-		return new DefaultsContextWrapper(defaultsContext) {
+	public final DefaultsContext wrapDefaultsContext(final DefaultsContext defaultsContext) {
+		return new DefaultsContext() {
 			public Object getDefault(String key) {
-				return JavaPersistentAttributeContext.this.getDefault(key, getWrappedDefaultsContext());
+				return JavaPersistentAttributeContext.this.getDefault(key, defaultsContext);
+			}
+		
+			public IPersistentType persistentType(String fullyQualifiedTypeName) {
+				return defaultsContext.persistentType(fullyQualifiedTypeName);
 			}
 		};
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaRelationshipMappingContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaRelationshipMappingContext.java
index 816ea4e..8c5b1f4 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaRelationshipMappingContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaRelationshipMappingContext.java
@@ -8,7 +8,10 @@
  *******************************************************************************/
 package org.eclipse.jpt.core.internal.platform;
 
+import org.eclipse.jpt.core.internal.IPersistentType;
+import org.eclipse.jpt.core.internal.ITypeMapping;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaRelationshipMapping;
+import org.eclipse.jpt.core.internal.mappings.IEntity;
 import org.eclipse.jpt.core.internal.mappings.IRelationshipMapping;
 
 public abstract class JavaRelationshipMappingContext extends JavaAttributeContext
@@ -21,10 +24,26 @@
 		return (IRelationshipMapping) super.getMapping();
 	}
 	
+	protected IEntity targetEntity(DefaultsContext defaultsContext) {
+		String targetEntity = getMapping().fullyQualifiedTargetEntity();
+		if (targetEntity == null) {
+			return null;
+		}
+		IPersistentType persistentType = defaultsContext.persistentType(targetEntity);
+		if (persistentType != null) {
+			ITypeMapping typeMapping = persistentType.getMapping();
+			if (typeMapping instanceof IEntity) {
+				return (IEntity) typeMapping;
+			}
+		}
+		return null;
+	}
+	
+	
 	@Override
 	protected Object getDefault(String key, DefaultsContext defaultsContext) {
 		if (key.equals(BaseJpaPlatform.DEFAULT_TARGET_ENTITY_KEY)) {
-			return getMapping().fullyQualifiedTargetEntity(defaultsContext.astRoot());
+			return getMapping().fullyQualifiedTargetEntity();
 		}
 		return super.getDefault(key, defaultsContext);
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaSingleRelationshipMappingContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaSingleRelationshipMappingContext.java
index d9fed14..a952629 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaSingleRelationshipMappingContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaSingleRelationshipMappingContext.java
@@ -14,7 +14,7 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.ITypeMapping;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaSingleRelationshipMapping;
 import org.eclipse.jpt.core.internal.mappings.IEntity;
@@ -57,17 +57,16 @@
 		return entity.getTable();
 	}
 	
-	@Override
-	protected void refreshDefaultsInternal(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaultsInternal(defaultsContext, monitor);
+	public void refreshDefaultsInternal(DefaultsContext defaultsContext) {
+		super.refreshDefaultsInternal(defaultsContext);
 		DefaultsContext joinColumnsDefaultsContext = wrapDefaultsContextForJoinColumn(defaultsContext);
 		for (JoinColumnContext context : this.joinColumnContexts) {
-			context.refreshDefaults(joinColumnsDefaultsContext, monitor);
+			context.refreshDefaults(joinColumnsDefaultsContext);
 		}
 	}
 	
-	protected DefaultsContext wrapDefaultsContextForJoinColumn(DefaultsContext defaultsContext) {
-		return new DefaultsContextWrapper(defaultsContext) {
+	protected DefaultsContext wrapDefaultsContextForJoinColumn(final DefaultsContext defaultsContext) {
+		return new DefaultsContext() {
 			public Object getDefault(String key) {
 				if (key.equals(BaseJpaPlatform.DEFAULT_JOIN_COLUMN_TABLE_KEY)) {
 					ITable table = getTable();
@@ -76,7 +75,11 @@
 					}
 					return table.getName();
 				}
-				return super.getDefault(key);
+				return defaultsContext.getDefault(key);
+			}
+			
+			public IPersistentType persistentType(String fullyQualifiedTypeName) {
+				return defaultsContext.persistentType(fullyQualifiedTypeName);
 			}
 		};
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaTypeContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaTypeContext.java
index 4d91450..12ce71d 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaTypeContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaTypeContext.java
@@ -12,9 +12,6 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.content.java.IJavaTypeMapping;
 import org.eclipse.jpt.core.internal.content.java.JavaPersistentAttribute;
@@ -30,8 +27,6 @@
 	
 	private boolean refreshed;
 	
-	private CompilationUnit astRoot;
-	
 	public JavaTypeContext(IContext parentContext, IJavaTypeMapping typeMapping) {
 		super(parentContext);
 		this.typeMapping = typeMapping;
@@ -57,41 +52,14 @@
 		}
 	}
 
-	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaults(DefaultsContext defaultsContext) {
 		this.refreshed = true;
-		DefaultsContext wrappedDefaultsContext = wrapDefaultsContext(defaultsContext);
-		this.getPersistentType().refreshDefaults(wrappedDefaultsContext);
+		this.getPersistentType().refreshDefaults(defaultsContext);
 		for (JavaPersistentAttributeContext context : this.javaPersistentAttributeContexts) {
-			checkCanceled(monitor);
-			context.refreshDefaults(wrappedDefaultsContext, monitor);
+			context.refreshDefaults(defaultsContext);
 		}
 	}
 	
-	private void checkCanceled(IProgressMonitor monitor) {
-		if (monitor.isCanceled()) {
-			throw new OperationCanceledException();
-		}		
-	}
-	
-	private DefaultsContext wrapDefaultsContext(DefaultsContext defaultsContext) {
-		return new DefaultsContextWrapper(defaultsContext) {
-			@Override
-			public CompilationUnit astRoot() {
-				return JavaTypeContext.this.getAstRoot();
-			}
-		};
-	}
-	
-	protected CompilationUnit getAstRoot() {
-		if (this.astRoot == null) {
-			this.astRoot = getPersistentType().getType().astRoot();
-		}
-		return this.astRoot;
-		
-	}
-	
 	public JavaPersistentType getPersistentType() {
 		return (JavaPersistentType) typeMapping.getPersistentType();
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaVersionContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaVersionContext.java
index ae2959c..543a66c 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaVersionContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JavaVersionContext.java
@@ -10,7 +10,6 @@
 package org.eclipse.jpt.core.internal.platform;
 
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.ITypeMapping;
 import org.eclipse.jpt.core.internal.content.java.mappings.JavaVersion;
 import org.eclipse.jpt.core.internal.mappings.IColumn;
@@ -32,9 +31,9 @@
 	}
 	
 	@Override
-	protected void refreshDefaultsInternal(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaultsInternal(defaultsContext, monitor);
-		this.columnContext.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaultsInternal(DefaultsContext defaultsContext) {
+		super.refreshDefaultsInternal(defaultsContext);
+		this.columnContext.refreshDefaults(defaultsContext);
 	}
 	
 	public void addToMessages(List<IMessage> messages) {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JoinColumnContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JoinColumnContext.java
index 0d9a316..648f412 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JoinColumnContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JoinColumnContext.java
@@ -10,6 +10,7 @@
 
 import java.util.List;
 import org.eclipse.jpt.core.internal.content.orm.XmlRelationshipMapping;
+import org.eclipse.jpt.core.internal.content.orm.XmlTypeMapping;
 import org.eclipse.jpt.core.internal.mappings.IEntity;
 import org.eclipse.jpt.core.internal.mappings.IJoinColumn;
 import org.eclipse.jpt.core.internal.validation.IJpaValidationMessages;
@@ -83,11 +84,11 @@
 	public void addToMessages(List<IMessage> messages) {
 		super.addToMessages(messages);
 	
-		//String table = column.getTable();
+		String table = column.getTable();
 		XmlRelationshipMapping mapping = 
 			(XmlRelationshipMapping) column.getOwner().getRelationshipMapping();
-		//XmlTypeMapping typeMapping = 
-		//	(XmlTypeMapping) column.getOwner().getTypeMapping();
+		XmlTypeMapping typeMapping = 
+			(XmlTypeMapping) column.getOwner().getTypeMapping();
 		doContinue = column.isConnected();
 		
 //		if (doContinue && typeMapping.tableNameIsInvalid(table)) {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JoinTableContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JoinTableContext.java
index 130f911..2b73516 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JoinTableContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/JoinTableContext.java
@@ -11,15 +11,10 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.IPersistentType;
-import org.eclipse.jpt.core.internal.ITypeMapping;
 import org.eclipse.jpt.core.internal.content.orm.XmlRelationshipMapping;
-import org.eclipse.jpt.core.internal.mappings.IEntity;
 import org.eclipse.jpt.core.internal.mappings.IJoinColumn;
 import org.eclipse.jpt.core.internal.mappings.IJoinTable;
-import org.eclipse.jpt.core.internal.mappings.IRelationshipMapping;
-import org.eclipse.jpt.core.internal.mappings.ITable;
 import org.eclipse.jpt.core.internal.validation.IJpaValidationMessages;
 import org.eclipse.jpt.core.internal.validation.JpaValidationMessages;
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
@@ -45,58 +40,38 @@
 	protected Collection<JoinColumnContext> buildJoinColumnContexts() {
 		Collection<JoinColumnContext> contexts = new ArrayList<JoinColumnContext>();
 		for (IJoinColumn joinColumn : this.table.getJoinColumns() ) {
-			contexts.add(buildJoinColumnContext(joinColumn));
+			contexts.add(new JoinColumnContext(this, joinColumn));
 		}
 		return contexts;
 	}
 	
-	protected JoinColumnContext buildJoinColumnContext(IJoinColumn joinColumn) {
-		return new JoinColumnContext(this, joinColumn);
-	}
-	
 	protected Collection<JoinColumnContext> buildInverseJoinColumnContexts() {
 		Collection<JoinColumnContext> contexts = new ArrayList<JoinColumnContext>();
 		for (IJoinColumn joinColumn : this.table.getInverseJoinColumns() ) {
-			contexts.add(buildInverseJoinColumnContext(joinColumn));
+			contexts.add(new JoinColumnContext(this, joinColumn));
 		}
 		return contexts;
 	}
 	
-	protected JoinColumnContext buildInverseJoinColumnContext(IJoinColumn joinColumn) {
-		return new JoinColumnContext(this, joinColumn);
-	}	
 	
 	public IJoinTable getTable() {
 		return this.table;
 	}
 	
-	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
-		this.table.refreshDefaults(wrapDefaultsContext(defaultsContext));
+	public void refreshDefaults(DefaultsContext defaultsContext) {
+		this.table.refreshDefaults(defaultsContext);
 		DefaultsContext joinColumnsDefaultsContext = wrapDefaultsContextForJoinColumn(defaultsContext);
 		for (JoinColumnContext context : this.joinColumnContexts) {
-			context.refreshDefaults(joinColumnsDefaultsContext, monitor);
+			context.refreshDefaults(joinColumnsDefaultsContext);
 		}
 		DefaultsContext inverseJoinColumnsDefaultsContext = wrapDefaultsContextForInverseJoinColumn(defaultsContext);
 		for (JoinColumnContext context : this.inverseJoinColumnContexts) {
-			context.refreshDefaults(inverseJoinColumnsDefaultsContext, monitor);
+			context.refreshDefaults(inverseJoinColumnsDefaultsContext);
 		}
 	}
 	
-	protected DefaultsContext wrapDefaultsContext(DefaultsContext defaultsContext) {
-		return new DefaultsContextWrapper(defaultsContext) {
-			public Object getDefault(String key) {
-				if (key.equals(BaseJpaPlatform.DEFAULT_JOIN_TABLE_NAME_KEY)) {
-					return joinTableDefaultName(this);
-				}
-				return super.getDefault(key);
-			}
-		};		
-	}
-
-	protected DefaultsContext wrapDefaultsContextForJoinColumn(DefaultsContext defaultsContext) {
-		return new DefaultsContextWrapper(defaultsContext) {
+	protected DefaultsContext wrapDefaultsContextForJoinColumn(final DefaultsContext defaultsContext) {
+		return new DefaultsContext() {
 			public Object getDefault(String key) {
 				/**
 				 * by default, the join column is, obviously, in the join table;
@@ -105,54 +80,29 @@
 				if (key.equals(BaseJpaPlatform.DEFAULT_JOIN_COLUMN_TABLE_KEY)) {
 					return getTable().getName();
 				}
-				return super.getDefault(key);
+				return defaultsContext.getDefault(key);
+			}
+			
+			public IPersistentType persistentType(String fullyQualifiedTypeName) {
+				return defaultsContext.persistentType(fullyQualifiedTypeName);
 			}
 		};
 	}
 	
-	protected DefaultsContext wrapDefaultsContextForInverseJoinColumn(DefaultsContext defaultsContext) {
-		return new DefaultsContextWrapper(defaultsContext) {
+	protected DefaultsContext wrapDefaultsContextForInverseJoinColumn(final DefaultsContext defaultsContext) {
+		return new DefaultsContext() {
 			public Object getDefault(String key) {
 				if (key.equals(BaseJpaPlatform.DEFAULT_JOIN_COLUMN_TABLE_KEY)) {
 					return getTable().getName();
 				}
-				return super.getDefault(key);
+				return defaultsContext.getDefault(key);
+			}
+			
+			public IPersistentType persistentType(String fullyQualifiedTypeName) {
+				return defaultsContext.persistentType(fullyQualifiedTypeName);
 			}
 		};
 	}
-
-	protected String joinTableDefaultName(DefaultsContext defaultsContext) {
-		String tableName = relationshipMapping().typeMapping().getTableName();
-		if (tableName == null) {
-			return null;
-		}
-		IEntity targetEntity = targetEntity(defaultsContext);
-		if (targetEntity == null) {
-			return null;
-		}
-		ITable targetTable = targetEntity.getTable();
-		return (targetTable == null) ? null : tableName + "_" + targetTable.getName();
-	}
-	
-	protected IEntity targetEntity(DefaultsContext defaultsContext) {
-		String targetEntity = relationshipMapping().fullyQualifiedTargetEntity(defaultsContext.astRoot());
-		if (targetEntity == null) {
-			return null;
-		}
-		IPersistentType persistentType = defaultsContext.persistentType(targetEntity);
-		if (persistentType == null) {
-			return null;
-		}
-		ITypeMapping typeMapping = persistentType.getMapping();
-		if (typeMapping instanceof IEntity) {
-			return (IEntity) typeMapping;
-		}
-		return null;
-	}
-
-	protected IRelationshipMapping relationshipMapping() {
-		return this.table.relationshipMapping();
-	}
 	
 	/** used internally as a mechanism to short circuit continued message adding */
 	private boolean doContinue;
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/MappingFileContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/MappingFileContext.java
index 66dc593..8817da2 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/MappingFileContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/MappingFileContext.java
@@ -11,8 +11,6 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.jpt.core.internal.IMappingKeys;
 import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.content.java.IJavaTypeMapping;
@@ -91,27 +89,19 @@
 		return null;
 	}
 	
-	@Override
-	public void refreshDefaults(DefaultsContext parentDefaults, IProgressMonitor monitor) {
-		super.refreshDefaults(parentDefaults, monitor);
+	public void refreshDefaults(DefaultsContext parentDefaults) {
+		super.refreshDefaults(parentDefaults);
 		ormRoot.getEntityMappings().refreshDefaults(parentDefaults);
 		DefaultsContext wrappedDefaultsContext = wrapDefaultsContext(parentDefaults);
 		for (XmlTypeContext context : this.xmlTypeContexts) {
-			checkCanceled(monitor);
 			if (!context.isRefreshed()) {
-				context.refreshDefaults(wrappedDefaultsContext, monitor);
+				context.refreshDefaults(wrappedDefaultsContext);
 			}
 		}
 	}
 	
-	private void checkCanceled(IProgressMonitor monitor) {
-		if (monitor.isCanceled()) {
-			throw new OperationCanceledException();
-		}		
-	}
-	
-	private DefaultsContext wrapDefaultsContext(DefaultsContext defaultsContext) {
-		return new DefaultsContextWrapper(defaultsContext) {
+	private DefaultsContext wrapDefaultsContext(final DefaultsContext defaultsContext) {
+		return new DefaultsContext() {
 			public Object getDefault(String key) {
 				if (key.equals(BaseJpaPlatform.DEFAULT_TABLE_SCHEMA_KEY)
 					||  key.equals(BaseJpaPlatform.DEFAULT_TABLE_GENERATOR_SCHEMA_KEY)) {
@@ -127,7 +117,11 @@
 					}
 				}
 				
-				return super.getDefault(key);
+				return defaultsContext.getDefault(key);
+			}
+			
+			public IPersistentType persistentType(String fullyQualifiedTypeName) {
+				return defaultsContext.persistentType(fullyQualifiedTypeName);
 			}
 		};
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/PersistenceUnitContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/PersistenceUnitContext.java
index d2f38cd..22aac82 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/PersistenceUnitContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/PersistenceUnitContext.java
@@ -13,8 +13,6 @@
 import java.util.Iterator;
 import java.util.List;
 import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jpt.core.internal.AccessType;
@@ -37,7 +35,6 @@
 import org.eclipse.jpt.utility.internal.CollectionTools;
 import org.eclipse.jpt.utility.internal.HashBag;
 import org.eclipse.jpt.utility.internal.StringTools;
-import org.eclipse.jpt.utility.internal.iterators.CloneIterator;
 import org.eclipse.jpt.utility.internal.iterators.CompositeIterator;
 import org.eclipse.jpt.utility.internal.iterators.EmptyIterator;
 import org.eclipse.jpt.utility.internal.iterators.TransformationIterator;
@@ -192,7 +189,7 @@
 	}
 	
 	protected Iterator<JavaPersistentType> listedJavaPersistentTypes() {
-		return new TransformationIterator<JavaClassRef, JavaPersistentType>(new CloneIterator<JavaClassRef>(persistenceUnit.getClasses())) {
+		return new TransformationIterator<JavaClassRef, JavaPersistentType>(persistenceUnit.getClasses().iterator()) {
 			@Override
 			protected JavaPersistentType transform(JavaClassRef next) {
 				return javaPersistentTypeFor(next);
@@ -283,38 +280,31 @@
 				);
 	}
 	
-	@Override
-	public void refreshDefaults(DefaultsContext parentDefaults, IProgressMonitor monitor) {
-		super.refreshDefaults(parentDefaults, monitor);
+	public void refreshDefaults(DefaultsContext parentDefaults) {
+		super.refreshDefaults(parentDefaults);
 		for (JavaTypeContext context : this.duplicateJavaPersistentTypes) {
-			checkCanceled(monitor);
 			// context for duplicates not be based on the persistenceUnit defaults,
 			// so we're going to use the one passed here without wrapping it
-			context.refreshDefaults(parentDefaults, monitor);
+			context.refreshDefaults(parentDefaults);
 		}
-		DefaultsContext defaults = wrapDefaultsContext(parentDefaults, monitor);
+		DefaultsContext defaults = wrapDefaultsContext(parentDefaults);
 		for (MappingFileContext context : this.mappingFileContexts) {
-			checkCanceled(monitor);
-			context.refreshDefaults(defaults, monitor);
+			context.refreshDefaults(defaults);
 		}
 		for (JavaTypeContext context : this.javaPersistentTypeContexts) {
-			checkCanceled(monitor);
-			context.refreshDefaults(defaults, monitor);
+			context.refreshDefaults(defaults);
 		}
 		
 		//TODO somehow need to clear out defaults for the duplicateJpaFiles, 
 		//do i have to build JavaTypeContext for those as well?
 	}
 	
-	private void checkCanceled(IProgressMonitor monitor) {
-		if (monitor.isCanceled()) {
-			throw new OperationCanceledException();
-		}		
-	}
-
-	protected DefaultsContext wrapDefaultsContext(DefaultsContext defaults, final IProgressMonitor monitor) {
-		DefaultsContext puDefaults = buildPersistenceUnitDefaults(defaults);
-		return new DefaultsContextWrapper(puDefaults){
+	protected DefaultsContext wrapDefaultsContext(DefaultsContext defaults) {
+		final DefaultsContext puDefaults = buildPersistenceUnitDefaults(defaults);
+		return new DefaultsContext(){
+			public Object getDefault(String key) {
+				return puDefaults.getDefault(key);
+			}
 			public IPersistentType persistentType(String fullyQualifiedTypeName) {
 				for (Iterator<TypeContext> i = typeContexts(); i.hasNext(); ) {
 					TypeContext typeContext = i.next();
@@ -323,7 +313,7 @@
 					if (jdtType != null 
 							&& fullyQualifiedTypeName.equals(jdtType.getFullyQualifiedName())) {
 						if (! typeContext.isRefreshed()) {
-							typeContext.refreshDefaults(this, monitor);
+							typeContext.refreshDefaults(this);
 						}
 						return persistentType;
 					}
@@ -333,14 +323,14 @@
 		};
 	}
 	
-	protected DefaultsContext buildPersistenceUnitDefaults(DefaultsContext defaults) {
+	protected DefaultsContext buildPersistenceUnitDefaults(final DefaultsContext defaults) {
 		if (persistenceUnitMetadatas.size() == 1) {
 			final PersistenceUnitDefaults puDefaults = persistenceUnitMetadatas.get(0).getPersistenceUnitDefaults();
 			if (puDefaults.isAllFeaturesUnset()) {
 				return defaults;
 			}
 			
-			return new DefaultsContextWrapper(defaults) {
+			return new DefaultsContext() {
 				public Object getDefault(String key) {
 					if (key.equals(BaseJpaPlatform.DEFAULT_TABLE_SCHEMA_KEY)
 						|| key.equals(BaseJpaPlatform.DEFAULT_TABLE_GENERATOR_SCHEMA_KEY)) {
@@ -361,7 +351,10 @@
 							return access;
 						}
 					}
-					return super.getDefault(key);
+					return defaults.getDefault(key);
+				}
+				public IPersistentType persistentType(String fullyQualifiedTypeName) {
+					return defaults.persistentType(fullyQualifiedTypeName);
 				}
 			};
 		}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/SecondaryTableContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/SecondaryTableContext.java
index 3328844..dfc3d19 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/SecondaryTableContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/SecondaryTableContext.java
@@ -11,7 +11,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.mappings.IPrimaryKeyJoinColumn;
 import org.eclipse.jpt.core.internal.mappings.ISecondaryTable;
 import org.eclipse.jpt.core.internal.validation.IJpaValidationMessages;
@@ -33,16 +33,12 @@
 	protected Collection<PrimaryKeyJoinColumnContext> buildPkJoinColumnContexts() {
 		Collection<PrimaryKeyJoinColumnContext> contexts = new ArrayList<PrimaryKeyJoinColumnContext>();
 		for (IPrimaryKeyJoinColumn pkJoinColumn : getSecondaryTable().getPrimaryKeyJoinColumns()) {
-			contexts.add(buildPrimaryKeyJoinColumnContext(pkJoinColumn));
+			contexts.add(new PrimaryKeyJoinColumnContext(this, pkJoinColumn));
 		}
 		
 		return contexts;
 	}
 
-	protected PrimaryKeyJoinColumnContext buildPrimaryKeyJoinColumnContext(IPrimaryKeyJoinColumn pkJoinColumn) {
-		return new PrimaryKeyJoinColumnContext(this, pkJoinColumn);
-	}
-	
 	@Override
 	protected void initialize() {}
 	
@@ -50,23 +46,24 @@
 		return this.secondaryTable;
 	}
 	
-	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaults(DefaultsContext defaultsContext) {
 		this.secondaryTable.refreshDefaults(defaultsContext);
 		for (PrimaryKeyJoinColumnContext context : this.pkJoinColumnContexts) {
-			context.refreshDefaults(defaultsContext, monitor);
+			context.refreshDefaults(defaultsContext);
 		}
 	}
 	
-	public DefaultsContext wrapDefaultsContext(DefaultsContext defaultsContext) {
-		return new DefaultsContextWrapper(defaultsContext) {
+	public DefaultsContext wrapDefaultsContext(final DefaultsContext defaultsContext) {
+		return new DefaultsContext() {
 			public Object getDefault(String key) {
-				//TODO hmm, why is this commented out??? this wrapper is doing nothing - kfm 8/17/07
 //				if (key.equals(BaseJpaPlatform.DEFAULT_COLUMN_TABLE_KEY)) {
 //					return getTable().getName();
 //				}
-				return super.getDefault(key);
+				return defaultsContext.getDefault(key);
+			}
+			
+			public IPersistentType persistentType(String fullyQualifiedTypeName) {
+				return defaultsContext.persistentType(fullyQualifiedTypeName);
 			}
 		};
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/TableContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/TableContext.java
index 83bba72..9949a8b 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/TableContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/TableContext.java
@@ -9,7 +9,7 @@
 package org.eclipse.jpt.core.internal.platform;
 
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.mappings.ITable;
 import org.eclipse.jpt.core.internal.validation.IJpaValidationMessages;
 import org.eclipse.jpt.core.internal.validation.JpaValidationMessages;
@@ -31,19 +31,21 @@
 		return this.table;
 	}
 	
-	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaults(DefaultsContext defaultsContext) {
 		this.table.refreshDefaults(defaultsContext);
 	}
 	
-	public DefaultsContext wrapDefaultsContext(DefaultsContext defaultsContext) {
-		return new DefaultsContextWrapper(defaultsContext) {
+	public DefaultsContext wrapDefaultsContext(final DefaultsContext defaultsContext) {
+		return new DefaultsContext() {
 			public Object getDefault(String key) {
 				if (key.equals(BaseJpaPlatform.DEFAULT_COLUMN_TABLE_KEY)) {
 					return getTable().getName();
 				}
-				return super.getDefault(key);
+				return defaultsContext.getDefault(key);
+			}
+			
+			public IPersistentType persistentType(String fullyQualifiedTypeName) {
+				return defaultsContext.persistentType(fullyQualifiedTypeName);
 			}
 		};
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/TypeContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/TypeContext.java
index 48f84dd..dc23fd4 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/TypeContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/TypeContext.java
@@ -8,14 +8,13 @@
  *******************************************************************************/
 package org.eclipse.jpt.core.internal.platform;
 
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.IPersistentType;
 
 public interface TypeContext
 {
 	IPersistentType getPersistentType();
 	
-	void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor);
+	void refreshDefaults(DefaultsContext defaultsContext);
 	
 	boolean isRefreshed();
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlAttributeContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlAttributeContext.java
index 4a488f8..11827c7 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlAttributeContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlAttributeContext.java
@@ -9,11 +9,11 @@
 package org.eclipse.jpt.core.internal.platform;
 
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.Flags;
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jpt.core.internal.IAttributeMapping;
 import org.eclipse.jpt.core.internal.IMappingKeys;
+import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.ITypeMapping;
 import org.eclipse.jpt.core.internal.content.java.JavaPersistentAttribute;
 import org.eclipse.jpt.core.internal.content.java.JavaPersistentType;
@@ -44,9 +44,7 @@
 		return xmlAttributeMapping.getPersistentAttribute();
 	}
 
-	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaults(DefaultsContext defaultsContext) {
 		JavaPersistentType javaPersistentType = this.xmlAttributeMapping.getPersistentType().findJavaPersistentType();
 		String name = this.xmlAttributeMapping.getPersistentAttribute().getName();
 		if (name != null && javaPersistentType != null) {
@@ -78,10 +76,14 @@
 		return attributeMapping().typeMapping().getKey() == IMappingKeys.ENTITY_TYPE_MAPPING_KEY;
 	}
 	
-	public final DefaultsContext wrapDefaultsContext(DefaultsContext defaultsContext) {
-		return new DefaultsContextWrapper(defaultsContext) {
+	public final DefaultsContext wrapDefaultsContext(final DefaultsContext defaultsContext) {
+		return new DefaultsContext() {
 			public Object getDefault(String key) {
-				return XmlAttributeContext.this.getDefault(key, getWrappedDefaultsContext());
+				return XmlAttributeContext.this.getDefault(key, defaultsContext);
+			}
+		
+			public IPersistentType persistentType(String fullyQualifiedTypeName) {
+				return defaultsContext.persistentType(fullyQualifiedTypeName);
 			}
 		};
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlBasicContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlBasicContext.java
index d50f129..559a14f 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlBasicContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlBasicContext.java
@@ -9,7 +9,6 @@
 package org.eclipse.jpt.core.internal.platform;
 
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.IAttributeMapping;
 import org.eclipse.jpt.core.internal.IMappingKeys;
 import org.eclipse.jpt.core.internal.ITypeMapping;
@@ -30,9 +29,9 @@
 	}
 	
 	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
-		this.columnContext.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaults(DefaultsContext defaultsContext) {
+		super.refreshDefaults(defaultsContext);
+		this.columnContext.refreshDefaults(defaultsContext);
 	}
 	
 	@Override
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlEmbeddedContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlEmbeddedContext.java
index d3f8332..9afd18d 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlEmbeddedContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlEmbeddedContext.java
@@ -13,7 +13,6 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.IAttributeMapping;
 import org.eclipse.jpt.core.internal.IJpaPlatform;
 import org.eclipse.jpt.core.internal.IMappingKeys;
@@ -48,8 +47,8 @@
 	}
 	private ParentContext buildParentContext() {
 		return new XmlAttributeOverrideContext.ParentContext() {
-			public void refreshDefaults(DefaultsContext defaults, IProgressMonitor monitor) {
-				XmlEmbeddedContext.this.refreshDefaults(defaults, monitor);
+			public void refreshDefaults(DefaultsContext defaults) {
+				XmlEmbeddedContext.this.refreshDefaults(defaults);
 			}
 			public IJpaPlatform getPlatform() {
 				return XmlEmbeddedContext.this.getPlatform();
@@ -72,11 +71,11 @@
 	}
 	
 	@Override
-	public void refreshDefaults(DefaultsContext parentDefaults, IProgressMonitor monitor) {
-		super.refreshDefaults(parentDefaults, monitor);
+	public void refreshDefaults(DefaultsContext parentDefaults) {
+		super.refreshDefaults(parentDefaults);
 		refreshDefaultAttributeOverrides();
 		for (XmlAttributeOverrideContext context : this.attributeOverrideContexts) {
-			context.refreshDefaults(parentDefaults, monitor);
+			context.refreshDefaults(parentDefaults);
 		}
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlEntityContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlEntityContext.java
index 65a4a30..bbc859b 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlEntityContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlEntityContext.java
@@ -13,7 +13,6 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.IJpaPlatform;
 import org.eclipse.jpt.core.internal.IMappingKeys;
 import org.eclipse.jpt.core.internal.IPersistentAttribute;
@@ -34,11 +33,11 @@
 import org.eclipse.jpt.utility.internal.CollectionTools;
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
 
-public class XmlEntityContext extends XmlTypeContext implements XmlSecondaryTableContext.ParentContext
+public class XmlEntityContext extends XmlTypeContext
 {
 	private TableContext tableContext;
 	
-	private Collection<XmlSecondaryTableContext> secondaryTableContexts;
+	private Collection<SecondaryTableContext> secondaryTableContexts;
 	
 	private JavaTable javaTable;
 	
@@ -64,8 +63,8 @@
 	
 	private ParentContext buildParentContext() {
 		return new XmlAttributeOverrideContext.ParentContext() {
-			public void refreshDefaults(DefaultsContext defaults, IProgressMonitor monitor) {
-				XmlEntityContext.this.refreshDefaults(defaults, monitor);
+			public void refreshDefaults(DefaultsContext defaults) {
+				XmlEntityContext.this.refreshDefaults(defaults);
 			}
 			public IJpaPlatform getPlatform() {
 				return XmlEntityContext.this.getPlatform();
@@ -97,19 +96,14 @@
 		return contexts;
 	}
 
-	protected Collection<XmlSecondaryTableContext> buildSecondaryTableContexts() {
-		Collection<XmlSecondaryTableContext> contexts = new ArrayList<XmlSecondaryTableContext>();
+	protected Collection<SecondaryTableContext> buildSecondaryTableContexts() {
+		Collection<SecondaryTableContext> contexts = new ArrayList<SecondaryTableContext>();
 		for (ISecondaryTable secondaryTable : getEntity().getSecondaryTables()) {
-			contexts.add(new XmlSecondaryTableContext(this, secondaryTable));
+			contexts.add(new SecondaryTableContext(this, secondaryTable));
 		}
 		
 		return contexts;
 	}
-	
-	public ISecondaryTable javaSecondaryTable(int index) {
-		JavaEntity javaEntity = getJavaEntity();
-		return javaEntity == null ? null : javaEntity.getSpecifiedSecondaryTables().get(index);
-	}
 
 	protected XmlEntity getEntity() {
 		return (XmlEntity) getXmlTypeMapping();
@@ -154,25 +148,25 @@
 	}
 
 	@Override
-	public void refreshDefaults(DefaultsContext parentDefaults, IProgressMonitor monitor) {
-		super.refreshDefaults(parentDefaults, monitor);
+	public void refreshDefaults(DefaultsContext parentDefaults) {
+		super.refreshDefaults(parentDefaults);
 		DefaultsContext defaultsContext = wrapDefaultsContext(parentDefaults);
 		refreshDefaultAttributeOverrides();
 		refreshDefaultAssociationOverrides();
 		refreshDefaultSecondaryTables();
-		for (XmlSecondaryTableContext context : this.secondaryTableContexts) {
-			context.refreshDefaults(defaultsContext, monitor);
+		for (SecondaryTableContext context : this.secondaryTableContexts) {
+			context.refreshDefaults(defaultsContext);
 		}
 		for (XmlAttributeOverrideContext context : this.attributeOverrideContexts) {
-			context.refreshDefaults(defaultsContext, monitor);
+			context.refreshDefaults(defaultsContext);
 		}
 		for (AssociationOverrideContext context : this.associationOverrideContexts) {
-			context.refreshDefaults(defaultsContext, monitor);
+			context.refreshDefaults(defaultsContext);
 		}
 	}
 	
-	protected void refreshTableContext(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		this.tableContext.refreshDefaults(defaultsContext, monitor);
+	protected void refreshTableContext(DefaultsContext defaultsContext) {
+		this.tableContext.refreshDefaults(defaultsContext);
 	}
 	
 	protected void refreshDefaultAttributeOverrides() {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlIdContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlIdContext.java
index 1ab264e..11c211e 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlIdContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlIdContext.java
@@ -9,7 +9,6 @@
 package org.eclipse.jpt.core.internal.platform;
 
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.IAttributeMapping;
 import org.eclipse.jpt.core.internal.IMappingKeys;
 import org.eclipse.jpt.core.internal.ITypeMapping;
@@ -51,9 +50,9 @@
 	}
 
 	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
-		this.columnContext.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaults(DefaultsContext defaultsContext) {
+		super.refreshDefaults(defaultsContext);
+		this.columnContext.refreshDefaults(defaultsContext);
 		ITableGenerator tableGenerator = getId().getTableGenerator();
 		if (tableGenerator != null) {
 			tableGenerator.refreshDefaults(defaultsContext);
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlJoinColumnContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlJoinColumnContext.java
deleted file mode 100644
index 34c32c6..0000000
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlJoinColumnContext.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: Oracle. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jpt.core.internal.platform;
-
-import org.eclipse.jpt.core.internal.content.orm.XmlTypeMapping;
-import org.eclipse.jpt.core.internal.mappings.IJoinColumn;
-
-public class XmlJoinColumnContext extends JoinColumnContext
-{
-	public XmlJoinColumnContext(ParentContext parentContext, IJoinColumn column) {
-		super(parentContext, column);
-	}
-	
-	@Override
-	public ParentContext getParentContext() {
-		return (ParentContext) super.getParentContext();
-	}
-
-	protected String buildDefaultName() {
-		if (getColumn().isVirtual()) {
-			if (!((XmlTypeMapping) getColumn().getOwner().getTypeMapping()).isXmlMetadataComplete()) {
-				IJoinColumn javaJoinColumn = javaJoinColumn(getColumn().getOwner().indexOf(getColumn()));
-				if (javaJoinColumn != null) {
-					return javaJoinColumn.getName();
-				}
-			}
-		}
-		return super.buildDefaultName();
-	}
-	
-	@Override
-	protected String buildDefaultReferencedColumnName() {
-		if (getColumn().isVirtual()) {
-			if (!((XmlTypeMapping) getColumn().getOwner().getTypeMapping()).isXmlMetadataComplete()) {
-				IJoinColumn javaJoinColumn = javaJoinColumn(getColumn().getOwner().indexOf(getColumn()));
-				if (javaJoinColumn != null) {
-					return javaJoinColumn.getReferencedColumnName();
-				}
-			}
-		}
-		return super.buildDefaultReferencedColumnName();
-	}
-	
-	
-	public interface ParentContext extends IContext {
-		/**
-		 * Return the JavaJoinColumn that corresponds to the the joinColumn
-		 * at the given index.  Return null if it does not exist
-		 */
-		IJoinColumn javaJoinColumn(int index);
-	}
-	
-	private IJoinColumn javaJoinColumn(int index) {
-		return getParentContext().javaJoinColumn(index);
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlJoinTableContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlJoinTableContext.java
deleted file mode 100644
index 0b5d570..0000000
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlJoinTableContext.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: Oracle. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jpt.core.internal.platform;
-
-import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jpt.core.internal.IJpaPlatform;
-import org.eclipse.jpt.core.internal.content.orm.XmlMultiRelationshipMappingInternal;
-import org.eclipse.jpt.core.internal.mappings.IJoinColumn;
-import org.eclipse.jpt.core.internal.mappings.IJoinTable;
-import org.eclipse.jpt.core.internal.mappings.IMultiRelationshipMapping;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-public class XmlJoinTableContext extends JoinTableContext {
-	
-	public XmlJoinTableContext(ParentContext parentContext, IJoinTable table) {
-		super(parentContext, table);
-	}
-
-	protected JoinColumnContext buildJoinColumnContext(IJoinColumn joinColumn) {
-		return new XmlJoinColumnContext(buildJoinColumnParentContext(), joinColumn);
-	}
-	
-	protected JoinColumnContext buildInverseJoinColumnContext(IJoinColumn joinColumn) {
-		return new XmlJoinColumnContext(buildInverseJoinColumnParentContext(), joinColumn);
-	}
-	
-	protected XmlJoinColumnContext.ParentContext buildJoinColumnParentContext() {
-		return new XmlJoinColumnContext.ParentContext() {
-			public void refreshDefaults(DefaultsContext defaults, IProgressMonitor monitor) {
-				XmlJoinTableContext.this.refreshDefaults(defaults, monitor);
-			}
-		
-			public IJpaPlatform getPlatform() {
-				return XmlJoinTableContext.this.getPlatform();
-			}
-		
-			public IContext getParentContext() {
-				return XmlJoinTableContext.this.getParentContext();
-			}
-		
-			public void addToMessages(List<IMessage> messages) {
-				XmlJoinTableContext.this.addToMessages(messages);
-			}
-		
-			public IJoinColumn javaJoinColumn(int index) {
-				//if the mapping is specified in the xml, then nothing specified in java should be used
-				if (relationshipMapping().isVirtual()) {
-					return javaRelationshipMapping().getJoinTable().getJoinColumns().get(index);
-				}
-				return null;
-			}
-		};
-	}
-	
-	protected XmlJoinColumnContext.ParentContext buildInverseJoinColumnParentContext() {
-		return new XmlJoinColumnContext.ParentContext() {
-			public void refreshDefaults(DefaultsContext defaults, IProgressMonitor monitor) {
-				XmlJoinTableContext.this.refreshDefaults(defaults, monitor);
-			}
-		
-			public IJpaPlatform getPlatform() {
-				return XmlJoinTableContext.this.getPlatform();
-			}
-		
-			public IContext getParentContext() {
-				return XmlJoinTableContext.this.getParentContext();
-			}
-		
-			public void addToMessages(List<IMessage> messages) {
-				XmlJoinTableContext.this.addToMessages(messages);
-			}
-		
-			public IJoinColumn javaJoinColumn(int index) {
-				//if the mapping is specified in the xml, then nothing specified in java should be used
-				if (relationshipMapping().isVirtual()) {
-					return javaRelationshipMapping().getJoinTable().getInverseJoinColumns().get(index);
-				}
-				return null;
-			}
-		};
-	}
-	
-	protected String joinTableDefaultName(DefaultsContext defaultsContext) {
-		XmlMultiRelationshipMappingInternal xmlMultiRelationshipMapping = relationshipMapping();
-		if (xmlMultiRelationshipMapping.isVirtual()) {
-			if (!xmlMultiRelationshipMapping.typeMapping().isXmlMetadataComplete()) {
-				IMultiRelationshipMapping javaRelationshipMapping = javaRelationshipMapping();
-				if (javaRelationshipMapping != null) {
-					return javaRelationshipMapping.getJoinTable().getName();
-				}
-			}
-		}
-		return super.joinTableDefaultName(defaultsContext);
-	}
-
-	@Override
-	protected XmlMultiRelationshipMappingInternal relationshipMapping() {
-		return (XmlMultiRelationshipMappingInternal) super.relationshipMapping();
-	}
-	
-	private IMultiRelationshipMapping javaRelationshipMapping() {
-		return getParentContext().javaRelationshipMapping();
-	}
-	
-	@Override
-	public ParentContext getParentContext() {
-		return (ParentContext) super.getParentContext();
-	}
-	
-	public interface ParentContext extends IContext {
-		/**
-		 * Return the JavaAttributeOverride that corresponds to the xml attribute override
-		 * with the given name.  Return null if it does not exist
-		 */
-		IMultiRelationshipMapping javaRelationshipMapping();
-	}
-	
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlMultiRelationshipMappingContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlMultiRelationshipMappingContext.java
index 0de4f10..becd8cd 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlMultiRelationshipMappingContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlMultiRelationshipMappingContext.java
@@ -9,33 +9,52 @@
 package org.eclipse.jpt.core.internal.platform;
 
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jpt.core.internal.IAttributeMapping;
 import org.eclipse.jpt.core.internal.IPersistentAttribute;
 import org.eclipse.jpt.core.internal.content.orm.XmlMultiRelationshipMapping;
 import org.eclipse.jpt.core.internal.content.orm.XmlMultiRelationshipMappingInternal;
 import org.eclipse.jpt.core.internal.mappings.IEntity;
-import org.eclipse.jpt.core.internal.mappings.IMultiRelationshipMapping;
 import org.eclipse.jpt.core.internal.mappings.INonOwningMapping;
+import org.eclipse.jpt.core.internal.mappings.ITable;
 import org.eclipse.jpt.core.internal.validation.IJpaValidationMessages;
 import org.eclipse.jpt.core.internal.validation.JpaValidationMessages;
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
 
 public abstract class XmlMultiRelationshipMappingContext
-	extends XmlRelationshipMappingContext implements XmlJoinTableContext.ParentContext
+	extends XmlRelationshipMappingContext
 {
-	private XmlJoinTableContext joinTableContext;
+	private JoinTableContext joinTableContext;
 	
 	protected XmlMultiRelationshipMappingContext(
 			IContext parentContext, XmlMultiRelationshipMappingInternal mapping) {
 		super(parentContext, mapping);
-		this.joinTableContext = new XmlJoinTableContext(this, mapping.getJoinTable());
+		this.joinTableContext = new JoinTableContext(this, mapping.getJoinTable());
 	}
 	
 	@Override
-	public void refreshDefaults(final DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
-		this.joinTableContext.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaults(final DefaultsContext defaultsContext) {
+		super.refreshDefaults(defaultsContext);
+		this.joinTableContext.refreshDefaults(defaultsContext);
+	}
+	
+	@Override
+	protected Object getDefault(String key, DefaultsContext defaultsContext) {
+		if (key.equals(BaseJpaPlatform.DEFAULT_JOIN_TABLE_NAME_KEY)) {
+			return joinTableDefaultName(defaultsContext);
+		}
+		return super.getDefault(key, defaultsContext);
+	}
+	
+	protected String joinTableDefaultName(DefaultsContext defaultsContext) {
+		String tableName = multiRelationshipMapping().typeMapping().getTableName();
+		if (tableName == null) {
+			return null;
+		}
+		IEntity targetEntity = targetEntity(defaultsContext);
+		if (targetEntity == null) {
+			return null;
+		}
+		ITable targetTable = targetEntity.getTable();
+		return (targetTable == null) ? null : tableName + "_" + targetTable.getName();
 	}
 
 	protected XmlMultiRelationshipMappingInternal multiRelationshipMapping() {
@@ -43,15 +62,6 @@
 	}
 	
 	@Override
-	public IMultiRelationshipMapping javaRelationshipMapping() {
-		IAttributeMapping javaAttributeMapping = javaAttributeMapping();
-		if (javaAttributeMapping instanceof IMultiRelationshipMapping) {
-			return ((IMultiRelationshipMapping) javaAttributeMapping);
-		}
-		return null;
-	}
-	
-	@Override
 	public void addToMessages(List<IMessage> messages) {
 		super.addToMessages(messages);
 		
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlPrimaryKeyJoinColumnContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlPrimaryKeyJoinColumnContext.java
deleted file mode 100644
index b8a8f66..0000000
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlPrimaryKeyJoinColumnContext.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: Oracle. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jpt.core.internal.platform;
-
-import org.eclipse.jpt.core.internal.content.orm.XmlTypeMapping;
-import org.eclipse.jpt.core.internal.mappings.IPrimaryKeyJoinColumn;
-
-public class XmlPrimaryKeyJoinColumnContext extends PrimaryKeyJoinColumnContext
-{
-	public XmlPrimaryKeyJoinColumnContext(ParentContext parentContext, IPrimaryKeyJoinColumn column) {
-		super(parentContext, column);
-	}
-	
-	@Override
-	public ParentContext getParentContext() {
-		return (ParentContext) super.getParentContext();
-	}
-
-	protected String buildDefaultName() {
-		if (getColumn().isVirtual()) {
-			if (!((XmlTypeMapping) getColumn().getOwner().getTypeMapping()).isXmlMetadataComplete()) {
-				IPrimaryKeyJoinColumn javaJoinColumn = javaPrimaryKeyJoinColumn(getColumn().getOwner().indexOf(getColumn()));
-				if (javaJoinColumn != null) {
-					return javaJoinColumn.getName();
-				}
-			}
-		}
-		return super.buildDefaultName();
-	}
-	
-	@Override
-	protected String buildDefaultReferencedColumnName() {
-		if (getColumn().isVirtual()) {
-			if (!((XmlTypeMapping) getColumn().getOwner().getTypeMapping()).isXmlMetadataComplete()) {
-				IPrimaryKeyJoinColumn javaJoinColumn = javaPrimaryKeyJoinColumn(getColumn().getOwner().indexOf(getColumn()));
-				if (javaJoinColumn != null) {
-					return javaJoinColumn.getReferencedColumnName();
-				}
-			}
-		}
-		return super.buildDefaultReferencedColumnName();
-	}
-	
-	
-	public interface ParentContext extends IContext {
-		/**
-		 * Return the JavaJoinColumn that corresponds to the the joinColumn
-		 * at the given index.  Return null if it does not exist
-		 */
-		IPrimaryKeyJoinColumn javaPrimaryKeyJoinColumn(int index);
-	}
-	
-	private IPrimaryKeyJoinColumn javaPrimaryKeyJoinColumn(int index) {
-		return getParentContext().javaPrimaryKeyJoinColumn(index);
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlRelationshipMappingContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlRelationshipMappingContext.java
index 35db89e..2336412 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlRelationshipMappingContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlRelationshipMappingContext.java
@@ -8,11 +8,13 @@
  *******************************************************************************/
 package org.eclipse.jpt.core.internal.platform;
 
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jpt.core.internal.IAttributeMapping;
+import org.eclipse.jpt.core.internal.IPersistentType;
+import org.eclipse.jpt.core.internal.ITypeMapping;
 import org.eclipse.jpt.core.internal.content.orm.XmlRelationshipMapping;
 import org.eclipse.jpt.core.internal.jdtutility.Attribute;
+import org.eclipse.jpt.core.internal.mappings.IEntity;
 import org.eclipse.jpt.core.internal.mappings.IRelationshipMapping;
 
 public abstract class XmlRelationshipMappingContext extends XmlAttributeContext
@@ -21,13 +23,29 @@
 		super(parentContext, mapping);
 	}
 	
+	protected IEntity targetEntity(DefaultsContext defaultsContext) {
+		String targetEntity = relationshipMapping().fullyQualifiedTargetEntity();
+		if (targetEntity == null) {
+			return null;
+		}
+		IPersistentType persistentType = defaultsContext.persistentType(targetEntity);
+		if (persistentType == null) {
+			return null;
+		}
+		ITypeMapping typeMapping = persistentType.getMapping();
+		if (typeMapping instanceof IEntity) {
+			return (IEntity) typeMapping;
+		}
+		return null;
+	}
+	
 	protected XmlRelationshipMapping relationshipMapping() {
 		return (XmlRelationshipMapping) attributeMapping();
 	}
 
 	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaults(DefaultsContext defaultsContext) {
+		super.refreshDefaults(defaultsContext);
 		relationshipMapping().refreshDefaults(defaultsContext);
 	}
 	
@@ -52,7 +70,7 @@
 			if (attribute != null) {
 				IType iType = relationshipMapping().getPersistentType().findJdtType();
 				if (iType != null) {
-					return relationshipMapping().javaDefaultTargetEntity(defaultsContext.astRoot());
+					return relationshipMapping().javaDefaultTargetEntity();
 				}
 			}
 		}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlSecondaryTableContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlSecondaryTableContext.java
deleted file mode 100644
index d3d0efd..0000000
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlSecondaryTableContext.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: Oracle. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jpt.core.internal.platform;
-
-import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jpt.core.internal.IJpaPlatform;
-import org.eclipse.jpt.core.internal.mappings.IPrimaryKeyJoinColumn;
-import org.eclipse.jpt.core.internal.mappings.ISecondaryTable;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-public class XmlSecondaryTableContext extends SecondaryTableContext
-{
-	public XmlSecondaryTableContext(ParentContext parentContext, ISecondaryTable secondaryTable) {
-		super(parentContext, secondaryTable);
-	}
-	
-	@Override
-	protected PrimaryKeyJoinColumnContext buildPrimaryKeyJoinColumnContext(IPrimaryKeyJoinColumn pkJoinColumn) {
-		return new XmlPrimaryKeyJoinColumnContext(buildJoinColumnParentContext(), pkJoinColumn);
-	}
-	
-	protected XmlPrimaryKeyJoinColumnContext.ParentContext buildJoinColumnParentContext() {
-		return new XmlPrimaryKeyJoinColumnContext.ParentContext() {
-			public void refreshDefaults(DefaultsContext defaults, IProgressMonitor monitor) {
-				XmlSecondaryTableContext.this.refreshDefaults(defaults, monitor);
-			}
-		
-			public IJpaPlatform getPlatform() {
-				return XmlSecondaryTableContext.this.getPlatform();
-			}
-		
-			public IContext getParentContext() {
-				return XmlSecondaryTableContext.this.getParentContext();
-			}
-		
-			public void addToMessages(List<IMessage> messages) {
-				XmlSecondaryTableContext.this.addToMessages(messages);
-			}
-		
-			public IPrimaryKeyJoinColumn javaPrimaryKeyJoinColumn(int index) {
-				if (getSecondaryTable().isVirtual()) {
-					return javaSecondaryTable(index).getSpecifiedPrimaryKeyJoinColumns().get(index);
-				}
-				return null;
-			}
-		};
-	}
-
-	@Override
-	public ParentContext getParentContext() {
-		return (ParentContext) super.getParentContext();
-	}
-	
-	private ISecondaryTable javaSecondaryTable(int index) {
-		return getParentContext().javaSecondaryTable(index);
-	}
-	
-	public interface ParentContext extends IContext {
-		/**
-		 * Return the JavaSecondaryTable at the given index.  Return null if it does not exist
-		 */
-		ISecondaryTable javaSecondaryTable(int index);
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlSingleRelationshipMappingContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlSingleRelationshipMappingContext.java
index 87465ae..3976246 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlSingleRelationshipMappingContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlSingleRelationshipMappingContext.java
@@ -13,13 +13,9 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jpt.core.internal.IAttributeMapping;
-import org.eclipse.jpt.core.internal.IJpaPlatform;
 import org.eclipse.jpt.core.internal.ITypeMapping;
 import org.eclipse.jpt.core.internal.content.orm.XmlSingleRelationshipMapping;
 import org.eclipse.jpt.core.internal.mappings.IJoinColumn;
-import org.eclipse.jpt.core.internal.mappings.ISingleRelationshipMapping;
 import org.eclipse.jpt.core.internal.validation.IJpaValidationMessages;
 import org.eclipse.jpt.core.internal.validation.JpaValidationMessages;
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
@@ -38,57 +34,20 @@
 	protected Collection<JoinColumnContext> buildJoinColumnContexts() {
 		Collection<JoinColumnContext> contexts = new ArrayList<JoinColumnContext>();
 		for (Iterator<IJoinColumn> i = singleRelationshipMapping().getJoinColumns().iterator(); i.hasNext(); ) {
-			contexts.add(new XmlJoinColumnContext(buildJoinColumnParentContext(), i.next()));
+			contexts.add(new JoinColumnContext(this, i.next()));
 		}
 		return contexts;
 	}
 
-	protected XmlJoinColumnContext.ParentContext buildJoinColumnParentContext() {
-		return new XmlJoinColumnContext.ParentContext() {
-			public void refreshDefaults(DefaultsContext defaults, IProgressMonitor monitor) {
-				XmlSingleRelationshipMappingContext.this.refreshDefaults(defaults, monitor);
-			}
-		
-			public IJpaPlatform getPlatform() {
-				return XmlSingleRelationshipMappingContext.this.getPlatform();
-			}
-		
-			public IContext getParentContext() {
-				return XmlSingleRelationshipMappingContext.this.getParentContext();
-			}
-		
-			public void addToMessages(List<IMessage> messages) {
-				XmlSingleRelationshipMappingContext.this.addToMessages(messages);
-			}
-		
-			public IJoinColumn javaJoinColumn(int index) {
-				//if the mapping is specified in the xml, then nothing specified in java should be used
-				if (relationshipMapping().isVirtual()) {
-					return javaRelationshipMapping().getJoinColumns().get(index);
-				}
-				return null;
-			}
-		};
-	}
-
 	protected XmlSingleRelationshipMapping singleRelationshipMapping() {
 		return (XmlSingleRelationshipMapping) relationshipMapping();
 	}
 
-
-	public ISingleRelationshipMapping javaRelationshipMapping() {
-		IAttributeMapping javaAttributeMapping = javaAttributeMapping();
-		if (javaAttributeMapping instanceof ISingleRelationshipMapping) {
-			return ((ISingleRelationshipMapping) javaAttributeMapping);
-		}
-		return null;
-	}
 	
-	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaults(DefaultsContext defaultsContext) {
+		super.refreshDefaults(defaultsContext);
 		for (JoinColumnContext context : this.joinColumnContexts) {
-			context.refreshDefaults(defaultsContext, monitor);
+			context.refreshDefaults(defaultsContext);
 		}
 	}
 	
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlTypeContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlTypeContext.java
index aa221e5..24c82d3 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlTypeContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlTypeContext.java
@@ -13,11 +13,9 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jpt.core.internal.IMappingKeys;
 import org.eclipse.jpt.core.internal.IPersistentAttribute;
+import org.eclipse.jpt.core.internal.IPersistentType;
 import org.eclipse.jpt.core.internal.content.java.IJavaTypeMapping;
 import org.eclipse.jpt.core.internal.content.java.JavaPersistentAttribute;
 import org.eclipse.jpt.core.internal.content.java.JavaPersistentType;
@@ -176,15 +174,14 @@
 		this.javaTypeContext = null;
 	}
 	
-	public DefaultsContext wrapDefaultsContext(DefaultsContext defaultsContext) {
-		return new DefaultsContextWrapper(defaultsContext) {
+	public DefaultsContext wrapDefaultsContext(final DefaultsContext defaultsContext) {
+		return new DefaultsContext() {
 			public Object getDefault(String key) {
-				return XmlTypeContext.this.getDefault(key, getWrappedDefaultsContext());
+				return XmlTypeContext.this.getDefault(key, defaultsContext);
 			}
-			@Override
-			public CompilationUnit astRoot() {
-				//TODO need to somehow not build this astRoot every time.  can we store the JavaPersistentType we are finding?
-				return javaPersistentType().getType().astRoot();
+			
+			public IPersistentType persistentType(String fullyQualifiedTypeName) {
+				return defaultsContext.persistentType(fullyQualifiedTypeName);
 			}
 		};
 	}
@@ -202,42 +199,33 @@
 		return this.refreshed;
 	}
 
-	private void checkCanceled(IProgressMonitor monitor) {
-		if (monitor.isCanceled()) {
-			throw new OperationCanceledException();
-		}		
-	}
-
-	@Override
-	public void refreshDefaults(DefaultsContext parentDefaults, IProgressMonitor monitor) {
-		super.refreshDefaults(parentDefaults, monitor);
+	public void refreshDefaults(DefaultsContext parentDefaults) {
+		super.refreshDefaults(parentDefaults);
 		this.refreshed = true;
 		if (this.javaTypeContext != null) {
-			this.javaTypeContext.refreshDefaults(parentDefaults, monitor);
+			this.javaTypeContext.refreshDefaults(parentDefaults);
 		}
-		refreshPersistentType(parentDefaults, monitor);
+		refreshPersistentType(parentDefaults);
 		DefaultsContext wrappedDefaultsContext = wrapDefaultsContext(parentDefaults);
-		refreshTableContext(wrappedDefaultsContext, monitor);
+		refreshTableContext(wrappedDefaultsContext);
 		this.xmlTypeMapping.refreshDefaults(wrappedDefaultsContext);
 		
-		refreshAttributeMappingContextDefaults(wrappedDefaultsContext, monitor);
+		refreshAttributeMappingContextDefaults(wrappedDefaultsContext);
 	}
 	
-	protected void refreshTableContext(DefaultsContext defaultsContext, IProgressMonitor monitor) {
+	protected void refreshTableContext(DefaultsContext defaultsContext) {
 	}
 	
-	public void refreshAttributeMappingContextDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
+	public void refreshAttributeMappingContextDefaults(DefaultsContext defaultsContext) {
 		for (XmlAttributeContext context : this.attributeMappingContexts) {
-			checkCanceled(monitor);
-			context.refreshDefaults(context.wrapDefaultsContext(defaultsContext), monitor);
+			context.refreshDefaults(context.wrapDefaultsContext(defaultsContext));
 		}
 		for (XmlAttributeContext context : this.virtualAttributeMappingContexts) {
-			checkCanceled(monitor);
-			context.refreshDefaults(context.wrapDefaultsContext(defaultsContext), monitor);
+			context.refreshDefaults(context.wrapDefaultsContext(defaultsContext));
 		}
 	}
 	
-	protected void refreshPersistentType(DefaultsContext defaultsContext, IProgressMonitor monitor) {
+	protected void refreshPersistentType(DefaultsContext defaultsContext) {
 		XmlPersistentType xmlPersistentType = this.getXmlTypeMapping().getPersistentType();
 		xmlPersistentType.refreshDefaults(defaultsContext);
 		//get the java attribute names
@@ -248,7 +236,6 @@
 		Collection<IPersistentAttribute> javaAttributes = javaAttributes();
 		Collection<String> javaAttributeNames = new ArrayList<String>();
 		for (IPersistentAttribute javaAttribute : javaAttributes) {
-			checkCanceled(monitor);
 			String javaAttributeName = javaAttribute.getName();
 			javaAttributeNames.add(javaAttributeName);
 			XmlPersistentAttribute xmlAttribute = xmlPersistentType.attributeNamed(javaAttributeName);
@@ -269,7 +256,6 @@
 		
 		Collection<String> specifiedXmlAttributeNames = new ArrayList<String>();
 		for (XmlPersistentAttribute specifiedAttribute : xmlPersistentType.getSpecifiedPersistentAttributes()) {
-			checkCanceled(monitor);
 			String attributeName = specifiedAttribute.getName();
 			if (! StringTools.stringIsEmpty(attributeName)) {
 				specifiedXmlAttributeNames.add(attributeName);
@@ -280,7 +266,6 @@
 		// *or* if it is mapped specifically
 		Collection<XmlAttributeMapping> mappingsToRemove = new ArrayList<XmlAttributeMapping>();
 		for (XmlAttributeMapping mapping : xmlPersistentType.getVirtualAttributeMappings()) {
-			checkCanceled(monitor);
 			String attributeName = mapping.getPersistentAttribute().getName();
 			if (! javaAttributeNames.contains(attributeName)
 					|| specifiedXmlAttributeNames.contains(attributeName)) {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlVersionContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlVersionContext.java
index 7f7f313..cabd995 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlVersionContext.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlVersionContext.java
@@ -10,7 +10,6 @@
 package org.eclipse.jpt.core.internal.platform;
 
 import java.util.List;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jpt.core.internal.IAttributeMapping;
 import org.eclipse.jpt.core.internal.IMappingKeys;
 import org.eclipse.jpt.core.internal.ITypeMapping;
@@ -33,9 +32,9 @@
 	}
 	
 	@Override
-	public void refreshDefaults(DefaultsContext defaultsContext, IProgressMonitor monitor) {
-		super.refreshDefaults(defaultsContext, monitor);
-		this.columnContext.refreshDefaults(defaultsContext, monitor);
+	public void refreshDefaults(DefaultsContext defaultsContext) {
+		super.refreshDefaults(defaultsContext);
+		this.columnContext.refreshDefaults(defaultsContext);
 	}
 	
 	@Override
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/persistence/util/PersistenceAdapterFactory.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/persistence/util/PersistenceAdapterFactory.java
index ba8ea5d..a891e80 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/persistence/util/PersistenceAdapterFactory.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/persistence/util/PersistenceAdapterFactory.java
@@ -2,21 +2,18 @@
  * <copyright>
  * </copyright>
  *
- * $Id: PersistenceAdapterFactory.java,v 1.2 2007/08/21 16:19:36 kmoore Exp $
+ * $Id: PersistenceAdapterFactory.java,v 1.1 2007/07/30 20:13:47 pfullbright Exp $
  */
 package org.eclipse.jpt.core.internal.resource.persistence.util;
 
 import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.Notifier;
+
 import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jpt.core.internal.resource.persistence.JavaClassRef;
-import org.eclipse.jpt.core.internal.resource.persistence.MappingFileRef;
-import org.eclipse.jpt.core.internal.resource.persistence.Persistence;
-import org.eclipse.jpt.core.internal.resource.persistence.PersistencePackage;
-import org.eclipse.jpt.core.internal.resource.persistence.PersistenceUnit;
-import org.eclipse.jpt.core.internal.resource.persistence.Properties;
-import org.eclipse.jpt.core.internal.resource.persistence.Property;
+
+import org.eclipse.jpt.core.internal.resource.persistence.*;
 
 /**
  * <!-- begin-user-doc -->
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/persistence/util/PersistenceSwitch.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/persistence/util/PersistenceSwitch.java
index 27f0363..36a71f7 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/persistence/util/PersistenceSwitch.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/persistence/util/PersistenceSwitch.java
@@ -2,20 +2,16 @@
  * <copyright>
  * </copyright>
  *
- * $Id: PersistenceSwitch.java,v 1.2 2007/08/21 16:19:36 kmoore Exp $
+ * $Id: PersistenceSwitch.java,v 1.1 2007/07/30 20:13:47 pfullbright Exp $
  */
 package org.eclipse.jpt.core.internal.resource.persistence.util;
 
 import java.util.List;
+
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jpt.core.internal.resource.persistence.JavaClassRef;
-import org.eclipse.jpt.core.internal.resource.persistence.MappingFileRef;
-import org.eclipse.jpt.core.internal.resource.persistence.Persistence;
-import org.eclipse.jpt.core.internal.resource.persistence.PersistencePackage;
-import org.eclipse.jpt.core.internal.resource.persistence.PersistenceUnit;
-import org.eclipse.jpt.core.internal.resource.persistence.Properties;
-import org.eclipse.jpt.core.internal.resource.persistence.Property;
+
+import org.eclipse.jpt.core.internal.resource.persistence.*;
 
 /**
  * <!-- begin-user-doc -->
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/synch/SynchronizeClassesJob.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/synch/SynchronizeClassesJob.java
index a9892d5..36cf145 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/synch/SynchronizeClassesJob.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/synch/SynchronizeClassesJob.java
@@ -12,6 +12,7 @@
 import java.io.IOException;
 import java.util.Iterator;
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
@@ -49,24 +50,25 @@
 	
 	public SynchronizeClassesJob(IFile file) {
 		super(JptCoreMessages.SYNCHRONIZE_CLASSES_JOB);
-		setRule(file.getProject());
-		this.persistenceXmlFile = file;
+		persistenceXmlFile = file;
 	}
 	
 	protected IStatus run(IProgressMonitor monitor) {
+		IProject project = persistenceXmlFile.getProject();
+		
 		monitor.beginTask(JptCoreMessages.SYNCHRONIZING_CLASSES_TASK, 150);
 		
 		if (monitor.isCanceled()) {
 			return Status.CANCEL_STATUS;
 		}
 		
-		IJpaFile jpaFile = JptCorePlugin.getJpaFile(this.persistenceXmlFile);
+		IJpaFile jpaFile = JptCorePlugin.getJpaFile(persistenceXmlFile);
 		PersistenceXmlRootContentNode root;
 		try {
 			root = (PersistenceXmlRootContentNode) jpaFile.getContent();
 		}
 		catch (ClassCastException cce) {
-			return new Status(IStatus.ERROR, JptCorePlugin.PLUGIN_ID, JptCoreMessages.INVALID_PERSISTENCE_XML_CONTENT);
+			return new Status(Status.ERROR, JptCorePlugin.PLUGIN_ID, JptCoreMessages.INVALID_PERSISTENCE_XML_CONTENT);
 		}
 		
 		Persistence persistence = root.getPersistence();
@@ -83,7 +85,7 @@
 		}
 		else {
 			persistenceUnit = PersistenceFactory.eINSTANCE.createPersistenceUnit();
-			persistenceUnit.setName(this.persistenceXmlFile.getProject().getName());
+			persistenceUnit.setName(persistenceXmlFile.getProject().getName());
 			persistence.getPersistenceUnits().add(persistenceUnit);
 		}
 		
@@ -102,7 +104,7 @@
 			resource.save(null);
 		}
 		catch (IOException ioe) {
-			return new Status(IStatus.ERROR, JptCorePlugin.PLUGIN_ID, JptCoreMessages.ERROR_WRITING_FILE, ioe);
+			return new Status(Status.ERROR, JptCorePlugin.PLUGIN_ID, JptCoreMessages.ERROR_WRITING_FILE, ioe);
 		}
 		
 		return Status.OK_STATUS;
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/validation/JpaValidator.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/validation/JpaValidator.java
index df1d64b..4f5b65a 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/validation/JpaValidator.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/validation/JpaValidator.java
@@ -10,18 +10,11 @@
 package org.eclipse.jpt.core.internal.validation;
 
 import java.util.Iterator;
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.ISchedulingRule;
 import org.eclipse.jpt.core.internal.IJpaProject;
-import org.eclipse.jpt.core.internal.JpaModelManager;
-import org.eclipse.jpt.core.internal.JpaProject;
-import org.eclipse.jpt.core.internal.JptCoreMessages;
-import org.eclipse.jpt.core.internal.JptCorePlugin;
 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.operations.IWorkbenchContext;
 import org.eclipse.wst.validation.internal.provisional.core.IReporter;
 import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
@@ -41,22 +34,6 @@
 		JpaHelper jpaHelper = (JpaHelper) helper;
 		IJpaProject jpaProject = jpaHelper.getJpaProject();
 		
-		if (! ((JpaProject) jpaProject).isFilled()) {
-			try {
-				JpaModelManager.instance().fillJpaProject(jpaProject.getProject());
-			}
-			catch (CoreException ce) {
-				return new Status(IStatus.ERROR, JptCorePlugin.PLUGIN_ID, JptCoreMessages.ERROR_SYNCHRONIZING_CLASSES_COULD_NOT_VALIDATE, ce);
-			}
-			
-			JpaHelper newJpaHelper = new JpaHelper();
-			newJpaHelper.setProject(jpaHelper.getProject());
-			newJpaHelper.setValidationFileURIs(jpaHelper.getValidationFileURIs());
-			ValidatorLauncher.getLauncher().start(newJpaHelper, this, reporter);
-			
-			return OK_STATUS;
-		}
-		
 		reporter.removeAllMessages(this);
 		
 		for (Iterator stream = jpaProject.validationMessages(); stream.hasNext(); ) {
diff --git a/jpa/plugins/org.eclipse.jpt.db.ui/.cvsignore b/jpa/plugins/org.eclipse.jpt.db.ui/.cvsignore
index a196dd7..814c6a8 100644
--- a/jpa/plugins/org.eclipse.jpt.db.ui/.cvsignore
+++ b/jpa/plugins/org.eclipse.jpt.db.ui/.cvsignore
@@ -1,6 +1,3 @@
 bin
-@dot
-temp.folder
 build.xml
-javaCompiler...args
-javaCompiler...args.*
\ No newline at end of file
+javaCompiler...args
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.db/.cvsignore b/jpa/plugins/org.eclipse.jpt.db/.cvsignore
index a196dd7..814c6a8 100644
--- a/jpa/plugins/org.eclipse.jpt.db/.cvsignore
+++ b/jpa/plugins/org.eclipse.jpt.db/.cvsignore
@@ -1,6 +1,3 @@
 bin
-@dot
-temp.folder
 build.xml
-javaCompiler...args
-javaCompiler...args.*
\ No newline at end of file
+javaCompiler...args
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.db/META-INF/MANIFEST.MF b/jpa/plugins/org.eclipse.jpt.db/META-INF/MANIFEST.MF
index 461ce19..a8da475 100644
--- a/jpa/plugins/org.eclipse.jpt.db/META-INF/MANIFEST.MF
+++ b/jpa/plugins/org.eclipse.jpt.db/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-SymbolicName: org.eclipse.jpt.db
-Bundle-Version: 1.1.0.qualifier
+Bundle-Version: 1.0.0.qualifier
 Bundle-Activator: org.eclipse.jpt.db.internal.JptDbPlugin
 Bundle-ClassPath: .
 Bundle-Localization: plugin
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/Connection.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/Connection.java
index 514acc5..3e1e736 100644
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/Connection.java
+++ b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/Connection.java
@@ -15,15 +15,15 @@
 /**
  *  Connection wrapper base class.
  */
-abstract class Connection extends DTPWrapper implements Comparable<Connection> {
+public abstract class Connection extends DTPWrapper implements Comparable<Connection> {
 
 	// ********** constructors **********
 
 	/**
 	 * Create a wrapper for the given IManagedConnection.
 	 */
-	static Connection createConnection( DTPConnectionProfileWrapper profile) {
-		return ( profile == null) ? NullConnection.instance() : new DTPConnectionWrapper( profile);
+	static Connection createConnection( org.eclipse.datatools.connectivity.IManagedConnection dtpConnection) {
+		return ( dtpConnection == null) ? NullConnection.instance() : new DTPConnectionWrapper( dtpConnection);
 	}
 
 	Connection() {
@@ -32,9 +32,9 @@
 
 	// ********** listeners **********
 
-	abstract void addConnectionListener( ConnectionListener listener);
+	public abstract void addConnectionListener( ConnectionListener listener);
 
-	abstract void removeConnectionListener( ConnectionListener listener);
+	public abstract void removeConnectionListener( ConnectionListener listener);
 
 
 	// ********** behavior **********
@@ -48,8 +48,14 @@
 
 	// ********** queries **********
 	
-	abstract String getFactoryId();
+	public abstract boolean isConnected();
+	
+	public abstract String getFactoryId();
 
+	@Override
+	protected boolean connectionIsOnline() {
+		return this.isConnected();
+	}
 
 	// ********** Comparable implementation **********
 
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/ConnectionListener.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/ConnectionListener.java
index 1b331ae..d778cbb 100644
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/ConnectionListener.java
+++ b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/ConnectionListener.java
@@ -18,14 +18,14 @@
  */
 public interface ConnectionListener {
     
-    public void opened( ConnectionProfile profile);
-    public void modified( ConnectionProfile profile);
-    public boolean okToClose( ConnectionProfile profile);
-    public void aboutToClose( ConnectionProfile profile);
-    public void closed( ConnectionProfile profile);
+    public void opened( Connection connection);
+    public void modified( Connection connection);
+    public boolean okToClose( Connection connection);
+    public void aboutToClose( Connection connection);
+    public void closed( Connection connection);
 
-    public void databaseChanged( ConnectionProfile profile, Database database);
-    public void schemaChanged( ConnectionProfile profile, Schema schema);
-    public void tableChanged( ConnectionProfile profile, Table table);
+    public void databaseChanged( Connection connection, Database database);
+    public void schemaChanged( Connection connection, Schema schema);
+    public void tableChanged( Connection connection, Table table);
 
 }
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/ConnectionProfile.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/ConnectionProfile.java
index 46dd3e4..6501cee 100644
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/ConnectionProfile.java
+++ b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/ConnectionProfile.java
@@ -12,7 +12,6 @@
 import java.text.Collator;
 import java.util.NoSuchElementException;
 
-import org.eclipse.core.runtime.IStatus;
 import org.eclipse.datatools.connectivity.sqm.core.rte.ICatalogObjectListener;
 
 /**
@@ -20,6 +19,7 @@
  */
 public abstract class ConnectionProfile extends DTPWrapper implements Comparable<ConnectionProfile> {
 	
+	private Connection connection; // Lazy initialized
 	private Database database; // Lazy initialized
 	private String catalogName;  // Catalog used for this profile
 	
@@ -36,7 +36,6 @@
 	ConnectionProfile( ConnectionProfileRepository profileRepository) {
 		super();
 		this.profileRepository = profileRepository;
-
 		this.connectionListener = buildConnectionListener();
 		this.catalogName = "";
 	}
@@ -47,6 +46,8 @@
 	
 	public abstract void disconnect();
 	
+	protected abstract Connection buildConnection();
+	
 	protected abstract Database buildDatabase();
 	
 	abstract void databaseChanged( Database db, int eventType);
@@ -59,36 +60,46 @@
 
 	protected void refreshDatabase() {
 		this.disposeDatabase();
+		this.database = null;
     }
     
 	@Override
 	protected void dispose() {
 		this.disengageConnectionListener();
 		
+		this.disposeConnection();
 		this.disposeDatabase();
 	}
 	
+	private void disposeConnection() {
+		if( this.connection != null) {
+			this.getConnection().dispose();
+		}
+	}
+	
 	private void disposeDatabase() {
 		if( this.database != null) {
 			this.getDatabase().dispose();
-			this.database = null;
 		}
 	}
-	
-	/**
-	 * Saves the state of the connection profile for working in an offline mode.
-	 * If the connection profile does not support working in an offline mode, no
-	 * exception is thrown and the method will return immediately.
-	 */
-	public abstract IStatus saveWorkOfflineData();
-	
-	public abstract IStatus workOffline();
-	
-	abstract boolean wraps( org.eclipse.datatools.connectivity.IConnectionProfile dtpProfile);
-	
+
+	public boolean contains( Connection connection) {
+		return this.getConnection().equals( connection);
+	}
+
 
 	// ********** queries **********
 	
+	Connection getConnection() {
+		
+		if( this.connection == null) {
+			this.connection = this.buildConnection();
+			this.engageConnectionListener();
+
+		}
+		return this.connection;
+	}
+
 	public Database getDatabase() {
 		
 		if( this.database == null) {
@@ -114,8 +125,6 @@
 	
 	public abstract String getUserPassword();
 	
-	public abstract String getDefaultSchema();
-	
 	public abstract String getInstanceId();
 
 	public abstract String getProviderId();
@@ -125,27 +134,14 @@
 	public abstract String getDriverJarList();
 	
 	public abstract boolean isConnected();
-	
-	public abstract boolean isWorkingOffline();
-	
-	/**
-	 * @return true if connection factories associated with this
-	 *				connection profile's provider support working offline.
-	 */
-	public abstract boolean supportsWorkOfflineMode();
-	
-	/**
-	 * @return true if this connection profile supports working offline and data
-	 *				has been saved for working offline.
-	 */
-	public abstract boolean canWorkOffline();
 
 	@Override
 	protected boolean connectionIsOnline() {
-
-		return this.isConnected() && ( ! this.isWorkingOffline());
+		return this.isConnected();
 	}
 	
+	abstract boolean wraps( org.eclipse.datatools.connectivity.IConnectionProfile dtpProfile);
+	
 	public boolean isNull() {
 		return true;
 	}
@@ -202,39 +198,39 @@
     private ConnectionListener buildConnectionListener() {
 		return new ConnectionListener() {
 
-			public void aboutToClose(ConnectionProfile profile) {
+			public void aboutToClose(Connection c) {
 				// not interested to this event.
 			}
 
-			public void closed(ConnectionProfile profile) {
+			public void closed(Connection c) {
 				ConnectionProfile.this.refreshDatabase();
 			}
 
-			public void modified(ConnectionProfile profile) {
+			public void modified(Connection c) {
 				// not interested to this event.
 				return;
 			}
 
-			public boolean okToClose(ConnectionProfile profile) {
+			public boolean okToClose(Connection c) {
 				// not interested to this event.
 				return true;
 			}
 
-			public void opened(ConnectionProfile profile) {
+			public void opened(Connection c) {
 				ConnectionProfile.this.refreshDatabase();
 			}
 
-			public void databaseChanged(ConnectionProfile profile, final Database db) {
+			public void databaseChanged(Connection c, final Database db) {
 				// not interested to this event.
 				return;
 			}
 			
-			public void schemaChanged(ConnectionProfile profile, final Schema schema) {
+			public void schemaChanged(Connection c, final Schema schema) {
 				// not interested to this event.
 				return;
 			}
 
-			public void tableChanged(ConnectionProfile profile, final Table table) {
+			public void tableChanged(Connection c, final Table table) {
 				// not interested to this event.
 				return;
 			}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPConnectionProfileWrapper.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPConnectionProfileWrapper.java
index 0d7c028..2ed713c 100644
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPConnectionProfileWrapper.java
+++ b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPConnectionProfileWrapper.java
@@ -10,12 +10,11 @@
 package org.eclipse.jpt.db.internal;
 
 import java.util.Properties;
-
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.datatools.connectivity.IConnectionProfile;
 import org.eclipse.datatools.connectivity.IManagedConnection;
 import org.eclipse.datatools.connectivity.db.generic.IDBDriverDefinitionConstants;
 import org.eclipse.datatools.connectivity.drivers.DriverManager;
-import org.eclipse.datatools.connectivity.sqm.core.connection.ConnectionInfo;
 import org.eclipse.datatools.sqltools.core.DatabaseIdentifier;
 import org.eclipse.datatools.sqltools.core.profile.ProfileUtil;
 
@@ -26,11 +25,7 @@
 	
 	final private org.eclipse.datatools.connectivity.IConnectionProfile dtpConnectionProfile;
 	
-	private Connection connection; // Lazy initialized
-
-    public static final String LIVE_CONNECTION_TYPE = "java.sql.Connection";  //$NON-NLS-1$
-    public static final String OFFLINE_CONNECTION_TYPE = "org.eclipse.datatools.connectivity.sqm.core.connection.ConnectionInfo";  //$NON-NLS-1$
-
+    public static final String CONNECTION_TYPE = "java.sql.Connection";  //$NON-NLS-1$
     public static final String CONNECTION_PROFILE_TYPE = "org.eclipse.datatools.connectivity.db.generic.connectionProfile";  //$NON-NLS-1$
     public static final String DATABASE_PRODUCT_PROPERTY = "org.eclipse.datatools.connectivity.server.version";  //$NON-NLS-1$
 	/**
@@ -50,10 +45,6 @@
 	 */
 	public static final String DRIVER_JAR_LIST_PROP_ID = "jarList"; //$NON-NLS-1$
 
-	public static final String POSTGRESQL_VENDOR = "postgres"; //$NON-NLS-1$
-
-	public static final String PUBLIC_SCHEMA = "public"; //$NON-NLS-1$
-
 	// ********** constructors **********
 
 	DTPConnectionProfileWrapper( ConnectionProfileRepository profileRepository, org.eclipse.datatools.connectivity.IConnectionProfile dtpConnectionProfile) {
@@ -88,24 +79,19 @@
 	}
 	
 	// ********** behavior **********
-
-	IManagedConnection getDTPConnection() {
-		return this.dtpConnectionProfile.getManagedConnection( LIVE_CONNECTION_TYPE);
+	
+	private IManagedConnection buildDtpManagedConnection( org.eclipse.datatools.connectivity.IConnectionProfile dtpProfile) {
+		return dtpProfile.getManagedConnection( CONNECTION_TYPE);
 	}
-
-	IManagedConnection getDTPOfflineConnection() {
-		return this.dtpConnectionProfile.getManagedConnection( OFFLINE_CONNECTION_TYPE);
-	}
-
 	/**
 	 * Connect using this profile.
 	 */
 	@Override
 	public void connect() {
-		if( ! this.connectionIsOnline()) {
+		if( !this.dtpConnectionProfile.isConnected()) {
 			
 			IStatus status = this.dtpConnectionProfile.connect();
-			if( ! status.isOK()) {
+			if( !status.isOK()) {
 				if( status.isMultiStatus()) {
 					IStatus[] statusChildren = status.getChildren();
 					throw new RuntimeException( statusChildren[ 0].getMessage(), statusChildren[ 0].getException());
@@ -127,19 +113,6 @@
 			throw new RuntimeException( status.getMessage(), status.getException());
 		}
 	}
-    
-	@Override
-	protected void dispose() {
-		super.dispose();
-		
-		this.disposeConnection();
-	}
-	
-	private void disposeConnection() {
-		if( this.getConnection() != null) {
-			this.getConnection().dispose();
-		}
-	}
 	
 	@Override
 	void databaseChanged( Database database, int eventType) {
@@ -164,66 +137,12 @@
 		this.getConnection().tableChanged( table, schema, database, eventType);
 	}
 		
-	protected Connection buildConnection() {
-
-		Connection connection = Connection.createConnection( this);  //$NON-NLS-1$
-		return connection;
-	}
-
-	@Override
-	protected Database buildDatabase() {
-		org.eclipse.datatools.modelbase.sql.schema.Database dtpDatabase;
-		if( this.isConnected()) {
-			if( this.isWorkingOffline()) {
-				ConnectionInfo connectionInfo = ( ConnectionInfo) this.getDTPOfflineConnection().getConnection().getRawConnection();
-				dtpDatabase = connectionInfo.getSharedDatabase(); 
-			}
-			else {
-				//TODO see DTP bug 202306
-				//pass connect=true in to ProfileUtil.getDatabase()
-				//there is a bug mentioned in a comment: 
-	            //     "during the profile connected event notification, 
-	            //     IManagedConnection is connected while IConnectionProfile is not"
-				//so some hackery here for their hackery
-				dtpDatabase = ProfileUtil.getDatabase( new DatabaseIdentifier( this.getName(), this.getDatabaseName()), true);
-			}
-			return Database.createDatabase( this, dtpDatabase);
-		}
-		return NullDatabase.instance();
-	}
-	
-	public IStatus saveWorkOfflineData() {
-		return this.dtpConnectionProfile.saveWorkOfflineData();
-	}
-	
-	public IStatus workOffline() {
-		return this.dtpConnectionProfile.workOffline();
-	}
-	
-	@Override
-	boolean wraps( org.eclipse.datatools.connectivity.IConnectionProfile dtpProfile) {
-		return this.dtpConnectionProfile == dtpProfile;
-	}
-
-		
 	// ********** queries **********
 
 	@Override
 	public boolean isConnected() {
-		return this.getDTPConnection().isConnected() || this.isWorkingOffline();
-	}
 
-	@Override
-	public boolean isWorkingOffline() {
-		return this.getDTPOfflineConnection().isWorkingOffline();
-	}
-	
-	public boolean supportsWorkOfflineMode() {
-		return this.dtpConnectionProfile.supportsWorkOfflineMode();
-	}
-	
-	public boolean canWorkOffline() {
-		return this.dtpConnectionProfile.canWorkOffline();
+		return this.dtpConnectionProfile.getConnectionState() != IConnectionProfile.DISCONNECTED_STATE;
 	}
 	
 	@Override
@@ -268,14 +187,6 @@
 	}
 
 	@Override
-	public String getDefaultSchema() {
-		if( this.getDatabase().getVendor().equalsIgnoreCase( POSTGRESQL_VENDOR)) {
-			return PUBLIC_SCHEMA;
-		}
-		return this.getUserName();
-	}
-
-	@Override
 	public String getDriverClass() {
 		return this.getProperties().getProperty( IDBDriverDefinitionConstants.DRIVER_CLASS_PROP_ID);
 	}
@@ -309,12 +220,27 @@
 		return this.dtpConnectionProfile.getBaseProperties();
 	}
 	
-	private Connection getConnection() {
-		
-		if( this.connection == null) {
-			this.connection = this.buildConnection();
-			this.engageConnectionListener();
-		}
-		return this.connection;
+	@Override
+	protected Connection buildConnection() {
+
+		Connection connection = Connection.createConnection( this.buildDtpManagedConnection( this.dtpConnectionProfile));  //$NON-NLS-1$
+		return connection;
 	}
+
+	@Override
+	protected Database buildDatabase() {
+		
+		org.eclipse.datatools.modelbase.sql.schema.Database dtpDatabase;
+		if( this.isConnected()) {
+			dtpDatabase = ProfileUtil.getDatabase( new DatabaseIdentifier( this.getName(), this.getDatabaseName()), false);
+			return Database.createDatabase( this, dtpDatabase);
+		}
+		return NullDatabase.instance();
+	}
+	
+	@Override
+	boolean wraps( org.eclipse.datatools.connectivity.IConnectionProfile dtpProfile) {
+		return this.dtpConnectionProfile == dtpProfile;
+	}
+
 }
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPConnectionWrapper.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPConnectionWrapper.java
index 180ff5c..5440b35 100644
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPConnectionWrapper.java
+++ b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPConnectionWrapper.java
@@ -13,23 +13,21 @@
 import java.util.Collection;
 
 import org.eclipse.datatools.connectivity.ConnectEvent;
-import org.eclipse.datatools.connectivity.IManagedConnection;
-import org.eclipse.datatools.connectivity.IManagedConnectionOfflineListener;
+import org.eclipse.datatools.connectivity.IManagedConnectionListener;
 
 /**
- *  Wraps to two DTP connections (1 for live connection & 1 for offline).
- *  The connections are not cached any more, but obtained each time from the ConnectionProfile.
+ *  Wrap a DTP Connection
  */
-final class DTPConnectionWrapper extends Connection {
+public final class DTPConnectionWrapper extends Connection {
 	
-	final private DTPConnectionProfileWrapper profile;
+	final private org.eclipse.datatools.connectivity.IManagedConnection dtpConnection;
 	private LocalConnectionListener connectionListener;
 	
 	// ********** constructors **********
 
-	DTPConnectionWrapper( DTPConnectionProfileWrapper profile) {
+	DTPConnectionWrapper( org.eclipse.datatools.connectivity.IManagedConnection dtpConnection) {
 		super();
-		this.profile = profile;
+		this.dtpConnection = dtpConnection;
 		this.initialize();
 	}
 
@@ -37,14 +35,30 @@
 	
 	protected void initialize() {
 		this.connectionListener = new LocalConnectionListener();
-		this.getDTPConnection().addConnectionListener( this.connectionListener);
-		this.getDTPOfflineConnection().addConnectionListener( this.connectionListener);
+		this.dtpConnection.addConnectionListener( this.connectionListener);
 	}
 	
 	@Override
 	protected void dispose() {
-		this.getDTPConnection().removeConnectionListener( this.connectionListener);
-		this.getDTPOfflineConnection().removeConnectionListener( this.connectionListener);
+		this.dtpConnection.removeConnectionListener( this.connectionListener);
+	}
+
+	@Override
+	public String getName() {
+
+		return this.dtpConnection.getConnection().getConnectionProfile().getName();
+	}
+	
+	@Override
+	public boolean isConnected() {
+
+		return this.dtpConnection.isConnected();
+	}
+
+	@Override
+	public String getFactoryId() {
+		
+		return this.dtpConnection.getFactoryID();
 	}
 
 	@Override
@@ -64,46 +78,17 @@
 		
 		this.connectionListener.tableChanged( table, schema, database, eventType);
 	}
-
-	// ********** queries **********
-
-	private IManagedConnection getDTPConnection() {
-
-		return this.profile.getDTPConnection();
-	}
-
-	private IManagedConnection getDTPOfflineConnection() {
-
-		return this.profile.getDTPOfflineConnection();
-	}
-	
-	@Override
-	public String getName() {
-
-		return this.getDTPConnection().getConnection().getConnectionProfile().getName();
-	}
-
-	@Override
-	String getFactoryId() {
-		
-		return this.getDTPConnection().getFactoryID();
-	}
-
-	@Override
-	protected boolean connectionIsOnline() {
-		return this.profile.connectionIsOnline();
-	}
 		
 	// ********** listeners **********
 
 	@Override
-	void addConnectionListener( ConnectionListener listener) {
+	public void addConnectionListener( ConnectionListener listener) {
 		// hook up the specified listener to our intermediate listeners
 		this.connectionListener.addConnectionListener( listener);
 	}
 
 	@Override
-	void removeConnectionListener( ConnectionListener listener) {
+	public void removeConnectionListener( ConnectionListener listener) {
 
 		this.connectionListener.removeConnectionListener( listener);
 	}
@@ -113,7 +98,7 @@
 	/**
 	 * This listener translates and forwards IManagedConnectionListener events to ConnectionListeners.
 	 */
-	private class LocalConnectionListener implements IManagedConnectionOfflineListener {
+	private class LocalConnectionListener implements IManagedConnectionListener {
 		private Collection<ConnectionListener> listeners = new ArrayList<ConnectionListener>();
 
 		LocalConnectionListener() {
@@ -131,93 +116,53 @@
 		// ********** behavior **********
 		
 		public void aboutToClose( ConnectEvent event) {
-			if( event.getConnection() == DTPConnectionWrapper.this.getDTPConnection()) {
-				for (ConnectionListener listener : this.listeners) {
-					listener.aboutToClose( DTPConnectionWrapper.this.profile);
-				}
-			}
-		}
-
-		public void aboutToDetach( ConnectEvent event) {
-			if( event.getConnection() == DTPConnectionWrapper.this.getDTPOfflineConnection()) {
-				for (ConnectionListener listener : this.listeners) {
-					listener.aboutToClose( DTPConnectionWrapper.this.profile);
-				}
+			for (ConnectionListener listener : this.listeners) {
+				listener.aboutToClose( DTPConnectionWrapper.this);
 			}
 		}
 
 		public void closed( ConnectEvent event) {
-			// There is no DETACHED event, therefore closed is sent twice (i.e. by both connections)
 			for (ConnectionListener listener : this.listeners) {
-				listener.closed( DTPConnectionWrapper.this.profile);
+				listener.closed( DTPConnectionWrapper.this);
+			}
+		}
+
+		public void modified( ConnectEvent event) {
+			for (ConnectionListener listener : this.listeners) {
+				listener.modified( DTPConnectionWrapper.this);
 			}
 		}
 
 		public boolean okToClose( ConnectEvent event) {
-			if( event.getConnection() == DTPConnectionWrapper.this.getDTPConnection()) {
-				for (ConnectionListener listener : this.listeners) {
-					if( !listener.okToClose( DTPConnectionWrapper.this.profile)) {
-						return false;
-					}
-				}
-			}
-			return true;
-		}
-
-		public boolean okToDetach( ConnectEvent event) {
-			if( event.getConnection() == DTPConnectionWrapper.this.getDTPOfflineConnection()) {
-				for (ConnectionListener listener : this.listeners) {
-					if( !listener.okToClose( DTPConnectionWrapper.this.profile)) {
-						return false;
-					}
+			for (ConnectionListener listener : this.listeners) {
+				if( !listener.okToClose( DTPConnectionWrapper.this)) {
+					return false;
 				}
 			}
 			return true;
 		}
 		
 		public void opened( ConnectEvent event) {
-			if( event.getConnection() == DTPConnectionWrapper.this.getDTPConnection()) {
-				for (ConnectionListener listener : this.listeners) {
-					listener.opened( DTPConnectionWrapper.this.profile);
-				}
-			}
-		}
-
-		public void workingOffline( ConnectEvent event) {
 			for (ConnectionListener listener : this.listeners) {
-				listener.opened( DTPConnectionWrapper.this.profile);
-			}
-		}
-
-		public void aboutToAttach( ConnectEvent event) {
-			// not interested to this event.
-			return;
-		}
-
-		public void modified( ConnectEvent event) {
-			for (ConnectionListener listener : this.listeners) {
-				listener.modified( DTPConnectionWrapper.this.profile);
+				listener.opened( DTPConnectionWrapper.this);
 			}
 		}
 		
-		@SuppressWarnings("unused")
 		void databaseChanged( Database database, int eventType) {
 			for (ConnectionListener listener : this.listeners) {
-				listener.databaseChanged( DTPConnectionWrapper.this.profile, database);
+				listener.databaseChanged( DTPConnectionWrapper.this, database);
 			}
 		}
-
-		@SuppressWarnings("unused")
+		
 		void schemaChanged( Schema schema, Database database, int eventType) {
 			for (ConnectionListener listener : this.listeners) {
-				listener.schemaChanged( DTPConnectionWrapper.this.profile, schema);
+				listener.schemaChanged( DTPConnectionWrapper.this, schema);
 			}
 		}
-
-		@SuppressWarnings("unused")
+		
 		void tableChanged( Table table, Schema schema, Database database, int eventType) {
 			for (ConnectionListener listener : this.listeners) {
-				listener.tableChanged( DTPConnectionWrapper.this.profile, table);
+				listener.tableChanged( DTPConnectionWrapper.this, table);
 			}
 		}
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPDatabaseWrapper.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPDatabaseWrapper.java
index a636134..d8b1dad 100644
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPDatabaseWrapper.java
+++ b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPDatabaseWrapper.java
@@ -41,15 +41,16 @@
 	// ********** behavior **********
 
 	private void initialize() {
+		
 		if( this.connectionIsOnline()) {
 			this.databaseListener = this.buildDatabaseListener();
 			this.addCatalogObjectListener(( ICatalogObject) this.dtpDatabase, this.databaseListener);
 		}
 	}
-
+	
 	@Override
 	protected boolean connectionIsOnline() {
-		return this.profile.connectionIsOnline();
+		return this.profile.isConnected();
 	}
 	
 	private ICatalogObjectListener buildDatabaseListener() {
@@ -114,7 +115,6 @@
 		}
 	}
 	
-	
 	// ********** queries **********
 
 	@Override
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/NullConnection.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/NullConnection.java
index c11ce22..f095633 100644
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/NullConnection.java
+++ b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/NullConnection.java
@@ -14,7 +14,7 @@
 /**
  *  NullConnection
  */
-final class NullConnection extends Connection {
+public final class NullConnection extends Connection {
 
 	private static NullConnection INSTANCE;
 
@@ -58,24 +58,24 @@
 	 void tableChanged( Table table, Schema schema, Database database, int eventType) {
 		// do nothing
 	}
-
+	
 	@Override
-	protected boolean connectionIsOnline() {
+	public boolean isConnected() {
 		return false;
 	}
 
 	@Override
-	String getFactoryId() {
+	public String getFactoryId() {
 		return "";
 	}
 
 	@Override
-	void addConnectionListener( ConnectionListener listener) {
+	public void addConnectionListener( ConnectionListener listener) {
 		// do nothing
 	}
 
 	@Override
-	void removeConnectionListener( ConnectionListener listener) {
+	public void removeConnectionListener( ConnectionListener listener) {
 		// do nothing
 	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/NullConnectionProfile.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/NullConnectionProfile.java
index 9fd4ae0..09cd5e0 100644
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/NullConnectionProfile.java
+++ b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/NullConnectionProfile.java
@@ -9,8 +9,7 @@
  ******************************************************************************/
 package org.eclipse.jpt.db.internal;
 
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
+import org.eclipse.datatools.connectivity.drivers.DriverManager;
 import org.eclipse.jpt.utility.internal.ClassTools;
 
 /**
@@ -37,6 +36,11 @@
 	// ********** behavior **********
 
 	@Override
+	protected Connection buildConnection() {
+		return NullConnection.instance();
+	}
+
+	@Override
 	protected Database buildDatabase() {
 		return NullDatabase.instance();
 	}
@@ -70,23 +74,14 @@
 	 void tableChanged( Table table, Schema schema, Database database, int eventType) {
 		// do nothing
 	}
-	
-	public IStatus saveWorkOfflineData() {
-		return Status.CANCEL_STATUS;
-	}
-	
-	public IStatus workOffline() {
-		return Status.CANCEL_STATUS;
-	}
+
+	// ********** queries **********
 	
 	@Override
-	boolean wraps( org.eclipse.datatools.connectivity.IConnectionProfile dtpProfile) {
-		return false;
+	public Connection getConnection() {
+		return NullConnection.instance();
 	}
-	
-	
-	// ********** queries **********
-		
+
 	@Override
 	public Database getDatabase() {
 		return NullDatabase.instance();
@@ -128,11 +123,6 @@
 	}
 
 	@Override
-	public String getDefaultSchema() {
-		return "";
-	}
-	
-	@Override
 	public String getDriverClass() {
 		return "";
 	}
@@ -166,17 +156,9 @@
 	public boolean isConnected() {
 		return false;
 	}
-
+	
 	@Override
-	public boolean isWorkingOffline() {
-		return false;
-	}
-	
-	public boolean supportsWorkOfflineMode() {
-		return false;
-	}
-	
-	public boolean canWorkOffline() {
+	boolean wraps( org.eclipse.datatools.connectivity.IConnectionProfile dtpProfile) {
 		return false;
 	}
 	
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/.project b/jpa/plugins/org.eclipse.jpt.doc.user/.project
deleted file mode 100644
index 61670ff..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/.project
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jpt.doc.user</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/META-INF/MANIFEST.MF b/jpa/plugins/org.eclipse.jpt.doc.user/META-INF/MANIFEST.MF
deleted file mode 100644
index 4babcd7..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,8 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-Vendor: %providerName
-Bundle-SymbolicName: org.eclipse.jpt.doc.user;singleton:=true
-Bundle-Version: 1.0.100.qualifier
-Bundle-Localization: plugin
-Eclipse-LazyStart: true
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/about.html b/jpa/plugins/org.eclipse.jpt.doc.user/about.html
deleted file mode 100644
index 8f21cb8..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/about.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:59 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>About this content</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="About this content" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<div class="sect1"><!-- infolevel="all" infotype="General" --><a id="sthref250" name="sthref250"></a>
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>About this content</h1>
-</td>
-</tr>
-</table>
-<p>June 06, 2007</p>
-<a id="sthref251" name="sthref251"></a>
-<p class="subhead2">License</p>
-<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available at <code><a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a></code>. For purposes of the EPL, "Program" will mean the Content.</p>
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party ("Redistributor") and different terms and conditions may apply to your use of any object code in the Content. Check the Redistributor's license that was provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <code><a href="http://www.eclipse.org">http://www.eclipse.org</a></code>.</p>
-</div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/build.properties b/jpa/plugins/org.eclipse.jpt.doc.user/build.properties
deleted file mode 100644
index ade565e..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/build.properties
+++ /dev/null
@@ -1,102 +0,0 @@
-bin.includes = cheatsheets/,\
-               dcommon/,\
-               img/,\
-               META-INF/,\
-               about.html,\
-               build.properties,\
-               concept_mapping.htm,\
-               concept_persistence.htm,\
-               concepts.htm,\
-               concepts001.htm,\
-               concepts002.htm,\
-               concepts003.htm,\
-               contexts.xml,\
-               getting_started.htm,\
-               getting_started001.htm,\
-               getting_started002.htm,\
-               getting_started003.htm,\
-               getting_started004.htm,\
-               getting_started005.htm,\
-               getting_started006.htm,\
-               getting_started007.htm,\
-               getting_started008.htm,\
-               getting_started009.htm,\
-               getting_started010.htm,\
-               getting_started011.htm,\
-               getting_started012.htm,\
-               getting_started013.htm,\
-               getting_started014.htm,\
-               getting_started015.htm,\
-               getting_started016.htm,\
-               getting_started017.htm,\
-               getting_started018.htm,\
-               getting_started019.htm,\
-               index.xml,\
-               legal.htm,\
-               plugin.properties,\
-               plugin.xml,\
-               ref_details_orm.htm,\
-               ref_jpa_facet.htm,\
-               ref_mapping_general.htm,\
-               ref_new_jpa_project.htm,\
-               ref_new_jpa_project_wizard.htm,\
-               ref_persistence_map_view.htm,\
-               ref_persistence_outline.htm,\
-               ref_persistence_perspective.htm,\
-               ref_persistence_prop_view.htm,\
-               ref_primary_key.htm,\
-               ref_project_properties.htm,\
-               reference.htm,\
-               reference001.htm,\
-               reference002.htm,\
-               reference003.htm,\
-               reference004.htm,\
-               reference005.htm,\
-               reference006.htm,\
-               reference007.htm,\
-               reference008.htm,\
-               reference009.htm,\
-               reference010.htm,\
-               reference011.htm,\
-               reference012.htm,\
-               reference013.htm,\
-               reference014.htm,\
-               reference015.htm,\
-               reference016.htm,\
-               reference017.htm,\
-               task_add_persistence.htm,\
-               task_additonal_tables.htm,\
-               task_create_new_project.htm,\
-               task_generate_entities.htm,\
-               task_inheritance.htm,\
-               task_manage_orm.htm,\
-               task_manage_persistence.htm,\
-               task_mapping.htm,\
-               tasks.htm,\
-               tasks001.htm,\
-               tasks002.htm,\
-               tasks003.htm,\
-               tasks004.htm,\
-               tasks005.htm,\
-               tasks006.htm,\
-               tasks007.htm,\
-               tasks008.htm,\
-               tasks009.htm,\
-               tasks010.htm,\
-               tasks011.htm,\
-               tasks012.htm,\
-               tasks013.htm,\
-               tasks014.htm,\
-               tasks015.htm,\
-               tasks016.htm,\
-               tasks017.htm,\
-               tasks018.htm,\
-               tasks019.htm,\
-               tasks020.htm,\
-               tasks021.htm,\
-               tips_and_tricks.htm,\
-               toc.xml,\
-               whats_new.htm,\
-               whats_new001.htm,\
-               whats_new002.htm,\
-               whats_new003.htm
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/cheatsheets/add_persistence.xml b/jpa/plugins/org.eclipse.jpt.doc.user/cheatsheets/add_persistence.xml
deleted file mode 100644
index 6dbeedb..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/cheatsheets/add_persistence.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<cheatsheet title="Create a JPA Project">
-   <intro href="/org.eclipse.platform.doc.user/reference/ref-cheatsheets.htm">
-      <description>
-         This cheat sheet will automatically launch wizards, perform actions, and guide you through the steps to create a JPA project. 
-
-To learn more about using cheat sheets, or to see a list of available cheat sheets, click Help (?). 
-To start work working on this cheat sheet click the &quot;Click to Begin&quot; button below. 
-
-Let&apos;s get started!
-      </description>
-   </intro>
-   <item title="Setup the Environment" dialog="false" skip="true" href="/org.eclipse.datatools.doc.user/c_database_development_setup.html">
-      <description>
-         Your environment must be set up before you can perform the steps in this cheat sheet. 
-
-Create a database profile and connect to the database.
-
-The Database Connection dialog automatically appears when you click the &quot;Click to Perform&quot; button.
-      </description>
-      <command serialization="org.eclipse.datatools.sqltools.sqleditor.attachProfileAction" confirm="false">
-      </command>
-   </item>
-   <item title="Create a JPA Project" dialog="false" skip="false" href="/org.eclipse.jpt.doc.user/task_create_new_project.htm">
-      <description>
-         Use the New Project Wizard to create a JPA project. 
-Select <b>File-&gt;New-&gt;Project...</b> and choose <b>JPA-&gt;JPA Project</b> in the list. 
-
-On the first page of the wizard, enter a project name and location, select your target runtime, and select a predefined project configuration.
-
-Click <b>Next</b> to display the next page of the wizard.
-
-The &quot;New JPA Project&quot; wizard is automatically displayed when you click the &quot;Click to Perform&quot; button.
-      </description>
-      <action class="org.eclipse.jdt.internal.ui.wizards.OpenProjectWizardAction" pluginId="org.eclipse.jdt.ui" confirm="false">
-      </action>
-   </item>
-   <item title="Select Project Facet" dialog="false" skip="false" href="/org.eclipse.jst.j2ee.doc.user/topics/ph-projects.html">
-      <description>
-         Use the Project Facet page to select a predefined project configuration or specific specific facets to include in the project. 
-
-Click &quot;Next&quot; to display the next page of the wizard.
-      </description>
-   </item>
-   <item title="Specify the JPA Facet" dialog="false" skip="false" href="/org.eclipse.jdt.doc.user/ref_jpa_facet.htm">
-      <description>
-         Use the JPA Facet page to specify the the vendor-specific JPA platform, the database connection to use, and the specific JPA implementation library. 
-
-You can also specify if Dali should create an orm.xml file.
-
-If you do not have an active database connection, click <b>Add Connections</b> to create one. 
-
-If you do not have a defined JPA implementation library, click <b>Configure default JPA implementation library</b> or <b>Configure user libraries</b> to define one. 
-
-Click <b>Finish</b> to complete the wizard and open the open the project.
-      </description>
-   </item>
-   <item title="Finish" dialog="false" skip="false">
-      <description>
-         Congratulations! You have successfully created a JPA project. Complete the additional cheat sheets to add Java persistent entities and map those entities to database tables.
-      </description>
-   </item>
-</cheatsheet>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/cheatsheets/create_entity.xml b/jpa/plugins/org.eclipse.jpt.doc.user/cheatsheets/create_entity.xml
deleted file mode 100644
index b64e8af..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/cheatsheets/create_entity.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<cheatsheet title="Create a Persistent Entity">
-	<intro href="/org.eclipse.platform.doc.user/reference/ref-cheatsheets.htm">
-		<description>
-This cheat sheet will automatically launch wizards, perform actions, and guide you through the steps to add a Java persistent entity to your Java project. 
-To learn more about using cheat sheets or to see a list of available cheat sheets, click Help (?). 
-To start work working on this cheat sheet, click the <b>Click to Begin</b> button below. 
-Let's get started!
-  </description>
-	</intro>
-	<item title="Create a JPA Project" skip="true">
-		<description>
-To create a Persistent entity, you must create a JPA project. If you already have a JPA project, you may skip this step by clicking the "Click to Skip" button.
-If not, select <b>File->New->Project...</b> and choose <b>JPA->JPA Project</b> in the list. Complete each page of the Create JPA Project wizard to create a new JPA project.
-      </description>
-	</item>
-	<item title="Open the JPA Development Perspective" skip="true" href="/org.eclipse.jpt.doc.user/ref_persistence_perspective.htm">
-		<action pluginId="org.eclipse.ui.cheatsheets" class="org.eclipse.ui.internal.cheatsheets.actions.OpenPerspective" param1="org.eclipse.jpt.ui.PersistencePerspective"/>
-		<description>
-When working with JPA  persistence, you should use the Persistence perspective. If you already have the Persistence perspective active, you may skip this step by clicking the "Click to Skip" button. 
-If not, select <b>Window->Open Perspective->Other</b> in the menubar at the top of the workbench. In the Select Perspectives dialog, select <b>JPA Development</b> and click OK. This step changes the perspective to set up the Eclipse workbench for JPA development.
-You can click the "Click to Perform" button to have the "Persistence" perspective opened automatically.
-   </description>
-	</item>
-	<item title="Create a Java Class">
-		<description>
-The next step is to create a new Java class. In the main toolbar again, click on <b>New Java Class</b> button (or the link below).
-The Java editor will automatically open showing your new class.      
-     </description>
-	</item>
-	<item title="Create a Persistent Entity">
-		<description>
-Finally we will make the Java class a persistent entity.
-In the JPA Structure view select the Java class. 
-In the JPA Details view, use the "Map As" field to select <b>Entity</b>. Dali automatically adds the @Entity annotation to the class in the Java editor. 
-Use the Table, Catalog, and Schema fields to associate the entity with a specific table in the database.
-     </description>
-	</item>
-	<item title="Finish">
-		<description>
-Congratulations! You have successfully added a JPA entity to your JPA project. Complete the additional cheat sheets to map the entity's fields to database tables.
-  </description>
-	</item>
-</cheatsheet>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/cheatsheets/map_entity.xml b/jpa/plugins/org.eclipse.jpt.doc.user/cheatsheets/map_entity.xml
deleted file mode 100644
index 63307f2..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/cheatsheets/map_entity.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<cheatsheet title="Map a Java Persistent Entity">
-   <intro href="/org.eclipse.platform.doc.user/reference/ref-cheatsheets.htm">
-      <description>
-         This cheat sheet will automatically launch wizards, perform actions, and guide you through the steps to map the fields of a JPA entity entity to your database.
-
-To learn more about using cheat sheets or to see a list of available cheat sheets, click Help (?). 
-To start work working on this cheat sheet, click the &quot;Click to Begin&quot; button below. 
-
-Let&apos;s get started!
-      </description>
-   </intro>
-   <item title="Setup the Environment" dialog="false" skip="true" href="/org.eclipse.datatools.doc.user/c_database_development_setup.html">
-      <description>
-         Your environment must be set up before you can perform the steps in this cheat sheet. 
-
-Create a database profile and connect to the database.
-
-If you already have (and are connected to) a database connection, you  may skip this step by clicking the &quot;Click to Skip&quot; button.
-
-The Database Connection dialog automatically appears when you click the &quot;Click to Perform&quot; button.
-      </description>
-      <command serialization="org.eclipse.datatools.sqltools.sqleditor.attachProfileAction" confirm="false">
-      </command>
-   </item>
-   <item title="Create a JPA Project" dialog="false" skip="true" href="/org.eclipse.jpt.doc.user/task_create_new_project.htm">
-      <description>
-         Use the New Project Wizard to create a JPA project. 
-Select <b>File-&gt;New-&gt;Project...</b> and choose <b>JPA-&gt;JPA Project</b> in the list. 
-
-Complete each page of the wizard to create a new JPA project.
-
-The &quot;New JPA Project&quot; wizard is automatically displayed when you click the &quot;Click to Perform&quot; button.
-
-If you already have a JPA project, you  may skip this step by clicking the &quot;Click to Skip&quot; button.
-      </description>
-      <action class="org.eclipse.jdt.internal.ui.wizards.OpenProjectWizardAction" pluginId="org.eclipse.jdt.ui" confirm="false">
-      </action>
-   </item>
-   <item title="Open the JPA Development Perspective" dialog="false" skip="true" href="/org.eclipse.jpt.doc.user/ref_persistence_perspective.htm">
-      <description>
-         When working with JPA  persistence, you should use the Persistence perspective. If you already have the Persistence perspective active, you may skip this step by clicking the &quot;Click to Skip&quot; button. 
-If not, select <b>Window-&gt;Open Perspective-&gt;Other</b> in the menubar at the top of the workbench. In the Select Perspectives dialog, select <b>JPA Development</b> and click OK. This step changes the perspective to set up the Eclipse workbench for JPA development.
-You can click the &quot;Click to Perform&quot; button to have the &quot;Persistence&quot; perspective opened automatically.
-      </description>
-      <action class="org.eclipse.ui.internal.cheatsheets.actions.OpenPerspective" pluginId="org.eclipse.ui.cheatsheets" confirm="false" param1="org.eclipse.jpt.ui.PersistencePerspective">
-      </action>
-   </item>
-   <item title="Create a Java Class" dialog="false" skip="false">
-      <description>
-         The next step is to create a new Java class. In the main toolbar again, click on <b>New Java Class</b> button (or the link below).
-The Java editor will automatically open showing your new class.
-      </description>
-   </item>
-   <item title="Create a Persistent Entity" dialog="false" skip="false">
-      <description>
-         Finally we will make the Java class a persistent entity.
-In the JPA Structure view select the Java class. 
-In the JPA Details view, use the &quot;Map As&quot; field to select <b>Entity</b>. Dali automatically adds the @Entity annotation to the class in the Java editor. 
-Use the Table, Catalog, and Schema fields to associate the entity with a specific table in the database.
-      </description>
-   </item>
-   <item title="Add Fields to the Class" dialog="false" skip="true">
-      <description>
-         Now you will add some fields to the entity to map to rows in the database table.   
-
-If your persistent entity already has fields to map, you may skip this step by clicking the &quot;Click to Skip&quot; button. If not, use the Java editor to add fields to the entity.
-      </description>
-      <action class="org.eclipse.ui.internal.cheatsheets.actions.OpenPerspective" pluginId="org.eclipse.ui.cheatsheets" confirm="false" param1="org.eclipse.dali.ui.PersistencePerspective">
-      </action>
-   </item>
-   <item title="Create the Mapping" dialog="false" skip="false" href="/org.eclipse.dali.doc.user/ref_entity_page.htm">
-      <description>
-         Now you are ready to map the entity fields to columns in the database table. In the Package Explorer, select the Java class. 
-
-In the JPA Structure view, expand the persistent entity to display the fields. Select a field. 
-
-The JPA Details view displays the information for the field. Use the Map As field to select the Basic mapping. Use the Column field to select a column from the database table.
-      </description>
-      <action class="org.eclipse.ui.internal.cheatsheets.actions.OpenPerspective" pluginId="org.eclipse.ui.cheatsheets" confirm="false" param1="org.eclipse.dali.ui.PersistencePerspective">
-      </action>
-   </item>
-   <item title="Finish" dialog="false" skip="false">
-      <description>
-         Congratulations! You have successfully mapped the fields from a Java persistent entity to a column in a database table.
-      </description>
-   </item>
-</cheatsheet>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/concept_mapping.htm b/jpa/plugins/org.eclipse.jpt.doc.user/concept_mapping.htm
deleted file mode 100644
index 1b826a5..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/concept_mapping.htm
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:53 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Understanding OR mappings</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Understanding OR mappings" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABBDJFI" name="BABBDJFI"></a></p>
-<div class="sect1">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Understanding OR mappings</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref44" name="sthref44"></a><a id="sthref45" name="sthref45"></a>The Dali OR (object-relational) Mapping Tool allows you to describe how your entity objects <span class="italic">map</span> to the data source (or other objects). This approach isolates persistence information from the object model. Developers are free to design their ideal object model, and DBAs are free to design their ideal schema.</p>
-<p>These mappings transform an object data member type to a corresponding relational database data source representation. These OR mappings can also transform object data members that reference other domain objects stored in other tables in the database and are related through foreign keys.</p>
-<p>You can use these mappings to map simple data types including primitives (such as <code>int</code>), JDK classes (such as <code>String</code>), and large object (LOB) values. You can also use them to transform object data members that reference other domain objects by way of association where data source representations require object identity maintenance (such as sequencing and back references) and possess various types of multiplicity and navigability. The appropriate mapping class is chosen primarily by the cardinality of the relationship.</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-</div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/concept_persistence.htm b/jpa/plugins/org.eclipse.jpt.doc.user/concept_persistence.htm
deleted file mode 100644
index 8f339e5..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/concept_persistence.htm
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:53 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Understanding Java persistence</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Understanding Java persistence" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABCAHIC" name="BABCAHIC"></a></p>
-<div class="sect1">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Understanding Java persistence</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref42" name="sthref42"></a><span class="italic">Persistence</span> refers to the ability to store objects in a database and use those objects with transactional integrity. In a J2EE application, data is typically stored and persisted in the data tier, in a relational database.</p>
-<p><a id="sthref43" name="sthref43"></a><span class="italic">Entity beans</span> are enterprise beans that contain persistent data and that can be saved in various persistent data stores. The entity beans represent data from a database; each entity bean carries its own identity. Entity beans can be deployed using <span class="italic">application-managed persistence</span> or <span class="italic">container-managed persistence</span>.</p>
-</div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/concepts.htm b/jpa/plugins/org.eclipse.jpt.doc.user/concepts.htm
deleted file mode 100644
index 38f63d8..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/concepts.htm
+++ /dev/null
@@ -1,65 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:53 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Concepts</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content=" Concepts" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="sthref41" name="sthref41"></a></p>
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Concepts</h1>
-</td>
-</tr>
-</table>
-<p>This section contains an overview of concepts you should be familiar with when using Dali to create mappings for Java persistent entities.</p>
-<ul>
-<li type="disc">
-<p><a href="concept_persistence.htm#BABCAHIC">Understanding Java persistence</a></p>
-</li>
-<li type="disc">
-<p><a href="concept_mapping.htm#BABBDJFI">Understanding OR mappings</a></p>
-</li>
-<li type="disc">
-<p><a href="concepts001.htm#BABBGFJG">Understanding EJB 3.0 Java Persistence API</a></p>
-</li>
-</ul>
-<p>In addition to these sections, you should review the following resources for additional information:</p>
-<ul>
-<li type="disc">
-<p>Eclipse Dali project: <code><a href="http://www.eclipse.org/webtools/dali">http://www.eclipse.org/webtools/dali</a></code></p>
-</li>
-<li type="disc">
-<p>Eclipse Web Tools Platform project: <code><a href="http://www.eclipse.org/webtools">http://www.eclipse.org/webtools</a></code></p>
-</li>
-<li type="disc">
-<p>JSR 220 EJB 3.0 specification: <code><a href="http://www.jcp.org/en/jsr/detail?id=220">http://www.jcp.org/en/jsr/detail?id=220</a></code></p>
-</li>
-</ul>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/concepts001.htm b/jpa/plugins/org.eclipse.jpt.doc.user/concepts001.htm
deleted file mode 100644
index 9ad5cc1..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/concepts001.htm
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:53 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Understanding EJB 3.0 Java Persistence API</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Understanding EJB 3.0 Java Persistence API" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABBGFJG" name="BABBGFJG"></a></p>
-<div class="sect1">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Understanding EJB 3.0 Java Persistence API</h1>
-</td>
-</tr>
-</table>
-<p>The Java 2 Enterprise Edition(J2EE) Enterprise JavaBeans (EJB) are a component architecture that you use to develop and deploy object-oriented, distributed, enterprise-scale applications. An application written according to the Enterprise JavaBeans architecture is scalable, transactional, and secure.</p>
-<p>The EJB 3.0 Java Persistence API (JPA) improves the EJB architecture by reducing its complexity through the use of metadata (annotations) and specifying programmatic defaults of that metadata.</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/concepts002.htm b/jpa/plugins/org.eclipse.jpt.doc.user/concepts002.htm
deleted file mode 100644
index 40716b5..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/concepts002.htm
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:53 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>The persistence.xml file</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="The persistence.xml file" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CHDHAGIH" name="CHDHAGIH"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1><a id="sthref46" name="sthref46"></a>The persistence.xml file</h1>
-</td>
-</tr>
-</table>
-<p>The JPA specification requires the use of a <code>persistence.xml</code> file for deployment. This file defines the database and entity manager options, and may contain more than one persistence unit. Dali can use the Eclipse XML Editor to create and maintain this information. See <a href="task_manage_persistence.htm#CIHDAJID">"Managing the persistence.xml file"</a> for more information.</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_manage_persistence.htm#CIHDAJID">Managing the persistence.xml file</a><br />
-<a href="task_create_new_project.htm#CIHHEJCJ">Creating a new JPA project</a>
-<p>&nbsp;</p>
-</div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/concepts003.htm b/jpa/plugins/org.eclipse.jpt.doc.user/concepts003.htm
deleted file mode 100644
index 80395b0..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/concepts003.htm
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:53 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>The orm.xml file</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="The orm.xml file" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CHDBIJAC" name="CHDBIJAC"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1><a id="sthref47" name="sthref47"></a>The orm.xml file</h1>
-</td>
-</tr>
-</table>
-<p>Although the JPA specification emphasizes the use of annotations to specify persistence, you can also the <code>orm.xml</code> file to store this metadata. Dali can use the Eclipse XML Editor to create and maintain this information. The metadata must match the XSD specification of your selected JPA implementation. See <a href="task_manage_orm.htm#CIHDGDCD">"Managing the orm.xml file"</a> for more information.</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_manage_orm.htm#CIHDGDCD">Managing the orm.xml file</a><br />
-<a href="task_create_new_project.htm#CIHHEJCJ">Creating a new JPA project</a>
-<p>&nbsp;</p>
-</div>
-<!-- class="sect2" -->
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/contexts.xml b/jpa/plugins/org.eclipse.jpt.doc.user/contexts.xml
deleted file mode 100644
index 34de0ef..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/contexts.xml
+++ /dev/null
@@ -1,422 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?NLS TYPE="org.eclipse.help.contexts"?>
-<contexts>
-	<context id="entity_accessType">
-		<description>Specify how the variable is accessed: Property (default) or Field.</description>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Adding persistence to a class" href="task_add_persistence.htm"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="entity_name">
-		<description>The name of this entity. By default, the class name is used as the entity name.</description>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Adding persistence to a class" href="task_add_persistence.htm"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="entity_table">
-		<description>The database table assigned to this entity. By default, the class name is used as the database table name.</description>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Adding persistence to a class" href="task_add_persistence.htm"/>
-		<topic label="Adding persistence to a class" href="task_add_persistence.htm"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="entity_attributeOverrides">
-		<description>Specify a property or field to be overridden (from the default mappings).</description>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Adding persistence to a class" href="task_add_persistence.htm"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="entity_attributeOverridesName">
-		<description>Name of the database column.</description>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Adding persistence to a class" href="task_add_persistence.htm"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="entity_attributeOverridesColumn">
-		<description>The database column that overrides a property or field.</description>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Adding persistence to a class" href="task_add_persistence.htm"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="entity_attributeOverridesInsertable">
-		<description>Specifies if the column is always included in SQL INSERT statements.</description>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Adding persistence to a class" href="task_add_persistence.htm"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="entity_attributeOverridesUpdatable">
-		<description>Specifies if the column is always included in SQL UPDATE statements.</description>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Adding persistence to a class" href="task_add_persistence.htm"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="mapping_mapAs">
-		<description>Specify how this attribute maps to the database.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_column">
-		<description>The database column that contains the value for the attribute.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_columnTable">
-		<description>Name of the database table that contains the selected column.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_columnInsertable">
-		<description>Specifies if the column is always included in SQL INSERT statements.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_columnUpdatable">
-		<description>Specifies if the column is always included in SQL UPDATE statements.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_fetchType">
-		<description>Defines how data is loaded from the database: Eager (default) or Lazy</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_optional">
-		<description>Specifies if this field is can be null.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_generatedValueStrategy">
-		<description>Determines how the primary key is generated: Auto (default), Sequence, Identity, or Table.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_generatedValueGeneratorName">
-		<description>Unique name of the generator.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_targetEntity">
-		<description>The entity to which this attribute is mapped. </description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_cascadeType">
-		<description>Specify which operations are propagated throughout the entity: All, Persist, Merge, or Move.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_mappedBy">
-		<description>The field in the database table that owns the relationship.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_joinColumnName">
-		<description>The name of the database column that contains the foreign key reference for the entity association.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_joinReferencedColumn">
-		<description>Name of the join table that contains the foreign key column.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_embeddedAttributeOverrides">
-		<description>Specify to override the default  mapping of an entity’s attribute.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="mapping_embeddedAttributeOverridesColumn">
-		<description>The database column that is being mapped to the entity’s attribute.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-		<topic label="Understanding OR mappings" href="concept_mapping.htm"/>
-	</context>
-	<context id="entity_mapAs">
-		<description>Specify the type of persistent domain object for the Java class: Persistent, Embedded, or Mapped Superclass.</description>
-		<topic label="Adding persistence to a class" href="task_add_persistence.htm"/>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="entity_inheritanceStrategy">
-		<description>Specify how an entity may inherit properties from other entities: Single table, One table per class, or Joined tables.</description>
-		<topic label="Specifying inheritance" href="task_inheritance.htm"/>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-	</context>
-	<context id="entity_inheritanceDiscriminatorColumn">
-		<description>Use to specify the name of the discriminator column when using a Single or Joined inheritance strategy.</description>
-		<topic label="Specifying inheritance" href="task_inheritance.htm"/>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-	</context>
-	<context id="entity_inheritanceDiscriminatorType">
-		<description>Use this field to set the discriminator type to CHAR or INTEGER (instead of its default: String). The discriminator value must conform to this type.</description>
-		<topic label="Specifying inheritance" href="task_inheritance.htm"/>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-	</context>
-	<context id="entity_inheritanceDiscriminatorValue">
-		<description>Specify the discriminator value used to differentiate an entity in this inheritance hierarchy. The value must conform to the specified discriminator type.</description>
-		<topic label="Specifying inheritance" href="task_inheritance.htm"/>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-	</context>
-	<context id="mapping_orderBy">
-		<description>Specify the default order for objects returned from a query.</description>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Mapping an Entity" href="task_mapping.htm"/>
-	</context>
-	<context id="mapping_joinTableName">
-		<description>Specify the  name of the database table that defines the foreign key for a many-to-many or a unidirectional one-to-many association. You can configure the join table with a specific catalog or schema, configure one or more join table columns with a unique constraint, and use multiple join columns per entity.</description>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="mapping_joinTableJoinColumns">
-		<description>Specify  two or more join columns (that is, a composite primary key).</description>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="mapping_joinTableInverseJoinColumns">
-		<description>Specify the join column on the owned (or inverse side) of the association: the owned entity's primary key column. </description>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="properties_javaPersistence">
-		<description>Use the Java Persistence options on the Properties page to select the database connection to use with the project.</description>
-		<topic label="Project properties" href="ref_project_properties"/>
-		<topic label="Adding persistence" href="ref_add_persistence.htm"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="properties_javaPersistenceConnection">
-		<description>The database connection used to map the persistent entities.</description>
-		<topic label="Project properties" href="ref_project_properties"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="properties_javaPersistenceSchema">
-		<description>The database schema used to map the persistent entities.</description>
-		<topic label="Project properties" href="ref_project_properties"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="dialog_addPersistence">
-		<description>Use the Add Persistence dialog to define the database connection use to store the persistence entities.</description>
-		<topic label="Adding persistence" href="ref_add_persistence.htm"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="persistenceOutline">
-		<description>The JPA Structure view displays an outline of the structure (its attributes and mappings) of the entity that is currently selected or opened in the editor.</description>
-		<topic label="JPA Structure view" href="ref_persistence_outline.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="dialog_generateEntities">
-		<description>Use the Generate Entities dialog to create Java persistent entities based on your database tables.</description>
-		<topic label="Generating entities from tables" href="task_generate_entities.htm.htm" />
-		<topic label="Project properties" href="ref_project_properties"/>
-	</context>
-	<context id="dialog_generateEntities_source">
-		<description>The project folder name in which to generate the Java persistent entities. Click Browse to select an existing folder.</description>
-		<topic label="Generating entities from tables" href="task_generate_entities.htm"/>
-	</context>
-	<context id="dialog_generateEntities_package">
-		<description>The package in which to generate the Java persistent entities, or click Browse to select an existing package.</description>
-		<topic label="Generating entities from tables" href="task_generate_entities.htm"/>
-	</context>
-	<context id="dialog_generateEntities_tables">
-		<description>Select the tables from which to create Java persistent entities.</description>
-		<topic label="Generating entities from tables" href="task_generate_entities.htm"/>
-		<topic label="Project properties" href="ref_project_properties"/>
-	</context>
-	<context id="dialog_addJavaPersistence">
-		<description>Use this dialog to define the database connection used to store the persistence entities and to create the persistence.xml file.</description>
-		<topic label="Add Persistence dialog" href="ref_add_persistence.htm" />
-		<topic label="Adding persistence to a project" href="task_add_persistence" />
-		<topic label="Managing the persistence.xml file" href="task_manage_persistence.htm" />
-	</context>
-	<context id="dialog_newJPAProject">
-		<description>Use this dialog to define the new JPA project name, its location, target runtime, and other configuration settings.</description>
-		<topic label="New JPA Project page" href="ref_new_jpa_project.htm" />
-		<topic label="New JPA Project wizard" href="ref_new_jpa_project_wizard" />
-		<topic label="Adding persistence to a project" href="task_add_persistence" />
-		<topic label="Creating a new JPA project" href="task_create_new_project.htm" />
-	</context>
-	<context id="dialog_addJavaPersistence_database">
-		<description>Use these fields to define the database connection used to store the persistent entities.</description>
-		<topic label="Add Persistence dialog" href="ref_add_persistence.htm" />
-		<topic label="Adding persistence to a project" href="task_add_persistence" />
-	</context>
-	<context id="dialog_addJavaPersistence_classpath">
-		<description>Use this option to add libraries or JARs that contain the Java Persistence API (JPA) and entities to the project’s Java Build Path.</description>
-		<topic label="Add Persistence dialog" href="ref_add_persistence.htm" />
-		<topic label="Adding persistence to a project" href="task_add_persistence" />
-	</context>
-	<context id="dialog_addJavaPersistence_packaging">
-		<description>Use these fields to create the persistence.xml file. Select the persistence version, the name of the JPA provider, and a unique name to identify the persistence unit.</description>
-		<topic label="Add Persistence dialog" href="ref_add_persistence.htm" />
-		<topic label="Managing the persistence.xml file" href="task_manage_persistence.htm" />
-	</context>
-	<context id="wizard_generateDDL_options ">
-		<description>Use this page to select which script options will be included in the generated script.</description>
-		<topic label="Generating tables (DDL) from entities " href="task_generate_ddl.htm" />
-		<topic label="Options page " href="ref_options.htm" />
-	</context>
-	<context id="wizard_generateDDL_objects ">
-		<description>Use this page to select which elements will be included in the generated script.</description>
-		<topic label="Generating tables (DDL) from entities " href="task_generate_ddl.htm" />
-		<topic label="Objects page " href="ref_objects.htm" />
-	</context>
-	<context id="wizard_generateDDL_save ">
-		<description>Use this page to select the filename and location of the generated script. You can also preview the script and specify to run or continue editing the script after generation.</description>
-		<topic label="Generating tables (DDL) from entities " href="task_generate_ddl.htm" />
-		<topic label="Save and Run DDL page " href="ref_save_and_run.htm" />
-	</context>
-	<context id="wizard_generateDDL_summary ">
-		<description>This page shows the settings that you selected for the generated DDL. To change any option click "Back" or click "Finish" to continue.</description>
-		<topic label="Generating tables (DDL) from entities " href="task_generate_ddl.htm" />
-	</context>
-	<context id="mapping_tableGeneratorName">
-		<description>The name of the table sequence generator. This name is global to to the persistence unit (across all generator types).</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="mapping_tableGeneratorTable">
-		<description>The database table that stores the generated ID values. </description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="mapping_tableGeneratorPrimaryKeyColumn">
-		<description>The database column of the generator table that stores the generated ID values.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="mapping_tableGeneratorValueColumn">
-		<description>The name for the column that stores the generated ID values.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="mapping_tableGeneratorPrimaryKeyColumnValue">
-		<description>The database column of the generator table that defines the primary key value.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="dialog_databaseAuthorization">
-		<description>Use to connect (log in) to a database connection to use with your Java persistent entities. 
-		You must have a defined database connection (and be connected) to add persistence. </description>
-		<topic label="Add persistence to a Java project" href="task_add_persistence_project.htm"/>
-	</context>
-	<context id="mapping_temporal">
-		<description>Specify if the mapped field contains a Date (java.sql.Date), Time (java.sql.Time), or Timestamp (java.sql.Timestamp) value.</description>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="mapping_primaryKeyGeneration">
-		<description>Define how the primary key is generated</description>
-		<topic label="Primary Key Generation information" href="ref_primary_key.htm"/>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="mapping_tableGenerator">
-		<description>Specify to use a specific database table for generating the primary key.</description>
-		<topic label="Primary Key Generation information" href="ref_primary_key.htm"/>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="mapping_sequenceGenerator">
-		<description>Specify to use a specific sequence for generating the primary key.</description>
-		<topic label="Primary Key Generation information" href="ref_primary_key.htm"/>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="mapping_sequenceGeneratorName">
-		<description>Name of the sequence.</description>
-		<topic label="Primary Key Generation information" href="ref_primary_key.htm"/>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="mapping_sequenceGeneratorSequence">
-		<description> </description>
-		<topic label="Primary Key Generation information" href="ref_primary_key.htm"/>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="mapping_lob">
-		<description>Specify if the field is mapped to java.sql.Clob or java.sql.Blob.</description>
-		<topic label="General information" href="ref_mapping_general.htm"/>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="mapping_enumerated">
-		<description>Specify how to persist enumerated constraints if the String value suits your application requirements or to match an existing database schema.</description>
-		<topic label="General information" href="ref_mapping_general.htm"/>
-		<topic label="JPA Details" href="ref_persistence_map_view.htm"/>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="dialog_editInverseJoinColumn">
-		<description>.</description>
-		<topic label="Mapping an entity" href="task_mapping.htm"/>
-	</context>
-	<context id="entity_catalog">
-		<description>The database catalog that contains the Table. This field overrides the defaults in the orm.xml file.</description>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Adding persistence to a class" href="task_add_persistence.htm"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="entity_schema">
-		<description>The database schema that contains the Table. This field overrides the defaults in the orm.xml file.</description>
-		<topic label="JPA Details" href="ref_persistence_prop_view.htm"/>
-		<topic label="Adding persistence to a class" href="task_add_persistence.htm"/>
-		<topic label="Understanding persistence" href="concept_persistence.htm"/>
-	</context>
-	<context id="orm_package">
-		<description>The Java package that contains the persistent entities to which the orm.xml file applies.</description>
-		<topic label="Managing the orm.xml file" href="task_manage_orm.htm"/>
-		<topic label="JPA Details" href="ref_details_orm.htm"/>
-	</context>
-	<context id="orm_schema">
-		<description>The database schema to use as the default for all entities managed by this persistence unit.</description>
-		<topic label="Managing the orm.xml file" href="task_manage_orm.htm"/>
-		<topic label="JPA Details" href="ref_details_orm.htm"/>
-	</context>
-	<context id="orm_catalog">
-		<description>The database catalog to use as the default for all entities managed by this persistence unit.</description>
-		<topic label="Managing the orm.xml file" href="task_manage_orm.htm"/>
-		<topic label="JPA Details" href="ref_details_orm.htm"/>
-	</context>
-	<context id="orm_access">
-		<description>The default access method for variables in this project: Property or Field.</description>
-		<topic label="Managing the orm.xml file" href="task_manage_orm.htm"/>
-		<topic label="JPA Details" href="ref_details_orm.htm"/>
-	</context>
-	<context id="orm_cascade">
-		<description>Adds cascade-persist to the set of cascade options in entity relationships of the persistence unit.</description>
-		<topic label="Managing the orm.xml file" href="task_manage_orm.htm"/>
-		<topic label="JPA Details" href="ref_details_orm.htm"/>
-	</context>
-	<context id="orm_xml">
-		<description>Specifies that the Java classes in this persistence unit are fully specified by their metadata. Any annotations will be ignored.</description>
-		<topic label="Managing the orm.xml file" href="task_manage_orm.htm"/>
-		<topic label="JPA Details" href="ref_details_orm.htm"/>
-	</context>
-	<context id="dialog_JPAPlatform">
-		<description>Specify the vendor-specific JPA implementation.Default is Generic..</description>
-		<topic label="JPA Facet page" href="ref_jpa_facet.htm"/>
-	</context>
-	<context id="dialog_createORM">
-		<description>Create an initial orm.xml file. Use this file to specify project and persistence unit defaults.</description>
-		<topic label="Managing the orm.xml file" href="task_manage_orm.htm"/>
-		<topic label="JPA Facet page" href="ref_jpa_facet.htm"/>
-	</context>
-
-
-
-
-</contexts>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/dcommon/css/blafdoc.css b/jpa/plugins/org.eclipse.jpt.doc.user/dcommon/css/blafdoc.css
deleted file mode 100644
index 4fa017b..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/dcommon/css/blafdoc.css
+++ /dev/null
@@ -1,21 +0,0 @@
-@import "../../../PRODUCT_PLUGIN/book.css";
-
-span.control, span.gui-object-action, p.subhead2, span.bold, p.notep1 {
-  font-weight: bold;
-}
-
-span.name, p.titleinfigure, span.italic {
-  font-style: italic;
-}
-
-p.titleinfigure, p.subhead2 {
-  padding-top: 10px;
-}
-
-span.code {
-  font-family: monospace;
-}
-
-span.copyrightlogo {font-size: 75%}
-
-.footer {padding-top: 2em;}
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/dcommon/html/cpyr.htm b/jpa/plugins/org.eclipse.jpt.doc.user/dcommon/html/cpyr.htm
deleted file mode 100644
index fe52e95..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/dcommon/html/cpyr.htm
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<!--  <meta http-equiv="refresh" content="0;url=../../legal.htm"> -->
-</head>
-<body>
-<p><a href="../../legal.htm">License Information</a></p>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started.htm
deleted file mode 100644
index 658022b..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started.htm
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Getting started</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content=" Getting started" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="sthref2" name="sthref2"></a></p>
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Getting started</h1>
-</td>
-</tr>
-</table>
-<p>This section provides information on getting started with the Java Persistence Tools.</p>
-<ul>
-<li type="disc">
-<p><a href="getting_started001.htm#BABEFHCD">Requirements and installation</a></p>
-</li>
-<li type="disc">
-<p><a href="getting_started002.htm#BABIGCJA">Dali quick start</a></p>
-</li>
-<li type="disc">
-<p><a href="getting_started006.htm#BABCDECJ">Dali basic tutorial</a></p>
-</li>
-</ul>
-<p>For additional information, please visit the Dali home page at: <code><a href="http://www.eclipse.org/webtools/dali/main.php/">http://www.eclipse.org/webtools/dali/main.php/</a></code>.</p>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started001.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started001.htm
deleted file mode 100644
index e17ea91..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started001.htm
+++ /dev/null
@@ -1,65 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Requirements and installation</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Requirements and installation" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABEFHCD" name="BABEFHCD"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Requirements and installation<a id="sthref3" name="sthref3"></a><a id="sthref4" name="sthref4"></a></h1>
-</td>
-</tr>
-</table>
-<p>Before installing Dali, ensure that your environment meets the following <span class="italic">minimum</span> requirements:</p>
-<ul>
-<li type="disc">
-<p>Eclipse 3.3 (<code><a href="http://www.eclipse.org/downloads">http://www.eclipse.org/downloads</a></code>)</p>
-</li>
-<li type="disc">
-<p>Java Runtime Environment (JRE) 1.5 (<code><a href="http://java.com">http://java.com</a></code>)</p>
-</li>
-<li type="disc">
-<p>Eclipse Web Tools Platform (WTP) 2.0 (<code><a href="http://www.eclipse.org/webtools">http://www.eclipse.org/webtools</a></code>)</p>
-</li>
-<li type="disc">
-<p>Java Persistence API (JPA) for Java EE 5. The reference implementation can be obtained from:</p>
-</li>
-</ul>
-<pre xml:space="preserve" class="oac_no_warn">
-<code><a href="https://glassfish.dev.java.net/downloads/persistence/JavaPersistence.html">https://glassfish.dev.java.net/downloads/persistence/JavaPersistence.html</a></code>
-
-</pre>
-<p>Refer to <code><a href="http://www.eclipse.org/webtools/dali/gettingstarted_main.html">http://www.eclipse.org/webtools/dali/gettingstarted_main.html</a></code> for additional installation information.</p>
-<p>Review the <a href="getting_started002.htm#BABIGCJA">Dali quick start</a> and <a href="getting_started006.htm#BABCDECJ">Dali basic tutorial</a> to build your first Dali project.</p>
-</div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started002.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started002.htm
deleted file mode 100644
index 52f4e25..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started002.htm
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Dali quick start</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Dali quick start" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABIGCJA" name="BABIGCJA"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Dali quick start</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref5" name="sthref5"></a>This section includes information to help you quickly start using Dali to create relational mappings between Java persistent entities and database tables.</p>
-<ul>
-<li type="disc">
-<p><a href="getting_started003.htm#BABDFHDA">Creating a new project</a></p>
-</li>
-<li type="disc">
-<p><a href="getting_started004.htm#BABFGDDG">Creating a Java persistent entity</a></p>
-</li>
-<li type="disc">
-<p><a href="getting_started005.htm#BABHACAF">Mapping an entity</a></p>
-</li>
-</ul>
-<p>The <a href="getting_started006.htm#BABCDECJ">Dali basic tutorial</a> contains detailed procedures for building you first Dali project.</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="getting_started006.htm#BABCDECJ">Dali basic tutorial</a><br />
-<a href="tips_and_tricks.htm#CHDHGHBF">Tips and tricks</a><br />
-<a href="whats_new.htm#BGGEDBGF">What's new</a> <!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started003.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started003.htm
deleted file mode 100644
index dc0cbed..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started003.htm
+++ /dev/null
@@ -1,90 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Creating a new project</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Creating a new project" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABDFHDA" name="BABDFHDA"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Creating a new project</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref6" name="sthref6"></a>This quick start shows how to create a new JPA project.</p>
-<ol type="1" start="1">
-<li>
-<p>Select <span class="gui-object-action">File &gt; New &gt; Project</span>. The New Project dialog appears.</p>
-</li>
-<li>
-<p>On the <span class="gui-object-title">New Project</span> dialog, select <span class="gui-object-action">JPA &gt; JPA Project</span> and click <span class="gui-object-action">Next</span>. The Create a Java Project dialog appears.</p>
-<div class="figure"><a id="sthref7" name="sthref7"></a>
-<p class="titleinfigure">New JPA Project</p>
-<img src="img/new_jpa_project_dialog.png" alt="New JPA Project dialog." title="New JPA Project dialog." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>On the <span class="gui-object-title">Create a JPA Project</span> dialog, enter a <span class="gui-object-action">Project name</span> (such as <code>QuickStart</code>).</p>
-</li>
-<li>
-<p>Select your <span class="bold">Target Runtime</span> (such as <code>Apache Tomcat</code>) and click <span class="bold">Next</span>. The Project Facets dialog appears.</p>
-</li>
-<li>
-<p>Verify that the <span class="bold">Java Persistence 1.0</span> facet is selected and click <span class="bold">Next</span>. The JPA Facet dialog appears.</p>
-<div align="center">
-<div class="inftblnote"><br />
-<table class="Note oac_no_warn" summary="This is a layout table to format a note" title="This is a layout table to format a note" dir="ltr" border="1" width="80%" frame="hsides" rules="groups" cellpadding="3" cellspacing="0">
-<tbody>
-<tr>
-<td align="left">
-<p class="notep1">Note:</p>
-You must configure your project to use Java version 5.0 (or higher). See <a href="getting_started001.htm#BABEFHCD">"Requirements and installation"</a> for more information.</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblnote" --></div>
-</li>
-<li>
-<p>On the JPA Facet dialog, select your vendor-specific JPA platform, database connection (or create a new connection), JPA implementation library (such as TopLink Essentials), define how Dali should manage persistent classes, and click <span class="bold">Finish</span>.</p>
-<div class="figure"><a id="sthref8" name="sthref8"></a>
-<p class="titleinfigure">JPA Facet Dialog</p>
-<img src="img/jpa_facet_dialog.png" alt="JPA Facet dialog." title="JPA Facet dialog." /><br /></div>
-<!-- class="figure" --></li>
-</ol>
-<p>Eclipse adds the project to the workbench and opens the JPA perspective.</p>
-<div class="figure"><a id="sthref9" name="sthref9"></a>
-<p class="titleinfigure">Project in Package Explorer</p>
-<img src="img/quickstart_project.png" alt="Package Explorer showing the JPA project." title="Package Explorer showing the JPA project." /><br /></div>
-<!-- class="figure" -->
-<p>Now that you have created a project with persistence, you can continue with <a href="getting_started004.htm#BABFGDDG">Creating a Java persistent entity</a>.</p>
-</div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started004.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started004.htm
deleted file mode 100644
index 8bc6b26..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started004.htm
+++ /dev/null
@@ -1,111 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Creating a Java persistent entity</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Creating a Java persistent entity" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABFGDDG" name="BABFGDDG"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Creating a Java persistent entity</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref10" name="sthref10"></a>This quick start shows how to create a new persistent Java entity. We will create an entity to associate with a database table. You will also need to add the ADDRESS table to your database.</p>
-<ol type="1" start="1">
-<li>
-<p>Right-click the project in the Package Explorer and select <span class="bold">New &gt; Class</span>. The New Java Class page appears.</p>
-</li>
-<li>
-<p>On the Java Class page, enter a package name (such as <code>quickstart.demo.model</code>), class name (such as <code>Address</code>), and click <span class="bold">Finish</span>.</p>
-</li>
-<li>
-<p>Right-click the <code>Address.java</code> file in the Package Explorer and select <span class="bold">Open</span>.</p>
-<div class="figure"><a id="sthref11" name="sthref11"></a>
-<p class="titleinfigure">Open Address.java</p>
-<img src="img/address_java_open.png" alt="Opening a Java class." title="Opening a Java class." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>Select the <code>Address</code> entity in the JPA Structure view.</p>
-<div class="figure"><a id="sthref12" name="sthref12"></a>
-<p class="titleinfigure">Address Class in JPA Structure View</p>
-<img src="img/address_jpa_structure.png" alt="Address class in JPA Structure view." title="Address class in JPA Structure view." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>In the JPA Details view, in the Map As field, select <span class="bold">Entity</span>. In the Table field, select the <span class="bold">ADDRESS</span> database table.</p>
-<div class="figure"><a id="sthref13" name="sthref13"></a>
-<p class="titleinfigure">Address Entity in JPA Details View</p>
-<img src="img/address_jpa_details.png" alt="JPA Details view." title="JPA Details view." /><br /></div>
-<!-- class="figure" --></li>
-</ol>
-<p>Eclipse creates the persistent entity and adds the <code>@Entity</code> annotation to the class.</p>
-<div class="figure"><a id="sthref14" name="sthref14"></a>
-<p class="titleinfigure">Address Entity</p>
-<img src="img/java_editor_address.png" alt="Java editor with the Address entity." title="Java editor with the Address entity." /><br /></div>
-<!-- class="figure" -->
-<p>Eclipse also displays the <span class="bold">Address</span> entity in the JPA Structure view:</p>
-<div class="figure"><a id="sthref15" name="sthref15"></a>
-<p class="titleinfigure">Address Entity</p>
-<img src="img/persistence_outline_entity.png" alt="Address entity in the JPA Structure view." title="Address entity in the JPA Structure view." /><br /></div>
-<!-- class="figure" -->
-<p>After creating the entity, you must associate it with a database table.</p>
-<ol type="1" start="1">
-<li>
-<p>Select the <span class="gui-object-action">Address</span> class in the Explorer view.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Persistence Properties</span> view, notice that Dali has automatically associated the ADDRESS database table with the entity because they are named identically.</p>
-<div align="center">
-<div class="inftblnote"><br />
-<table class="Note oac_no_warn" summary="This is a layout table to format a note" title="This is a layout table to format a note" dir="ltr" border="1" width="80%" frame="hsides" rules="groups" cellpadding="3" cellspacing="0">
-<tbody>
-<tr>
-<td align="left">
-<p class="notep1">Note:</p>
-Depending on your database connection type, you may need to specify the <span class="bold">Schema</span>.</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblnote" --></div>
-<div class="figure"><a id="sthref16" name="sthref16"></a>
-<p class="titleinfigure">JPA Details View for Address Entity</p>
-<img src="img/persistence_view_address.png" alt="Address entity in the JPA Details view." title="Address entity in the JPA Details view." /><br /></div>
-<!-- class="figure" --></li>
-</ol>
-<p>After associating the entity with the database table, you must update the <code>persistence.xml</code> file to include this JPA entity.</p>
-<p>Right-click the <code>persistence.xml</code> file in the Package Explorer and select <span class="bold">JPA Tools &gt; Synchronize Classes</span>. Dali adds the following to the <code>persistence.xml</code> file:</p>
-<p><code>&lt;class&gt;quickstart.demo.model.Address&lt;/class&gt;</code></p>
-<p>&nbsp;</p>
-<p>Now that you have created a persistent entity, you can continue with <a href="getting_started005.htm#BABHACAF">Mapping an entity</a> to map the entity's fields to columns on the database table.</p>
-</div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started005.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started005.htm
deleted file mode 100644
index 53017e7..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started005.htm
+++ /dev/null
@@ -1,140 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Mapping an entity</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Mapping an entity" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABHACAF" name="BABHACAF"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Mapping an entity</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref17" name="sthref17"></a><a id="sthref18" name="sthref18"></a>This quick start shows how to map fields in a Java persistent entity. Before beginning, add the following fields to the Address class:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-private Long id;
-private String city;
-private String country;
-private String stateOrProvince;
-private String postalCode;
-private String street;
-
-</pre>
-<p>Eclipse updates the Address entity in the JPA Structure view to show its fields:</p>
-<div class="figure"><a id="sthref19" name="sthref19"></a>
-<p class="titleinfigure">Address Entity and Fields</p>
-<img src="img/persistence_outline_fields.png" alt="Address entity and its fields in the JPA Structure view." title="Address entity and its fields in the JPA Structure view." /><br /></div>
-<!-- class="figure" -->
-<p>You will also need to add the following columns to the ADDRESS database table:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-NUMBER(10,0) ADDRESS_ID (primary key)
-VARCHAR2(80) PROVINCE
-VARCHAR2(80) COUNTRY
-VARCHAR2(20) P_CODE
-VARCHAR2(80) STREET
-VARCHAR2(80) CITY
-</pre>
-<pre xml:space="preserve" class="oac_no_warn">
-</pre>
-<p>Now we are ready to map each fields in the Address class to a column in the database table.</p>
-<ol type="1" start="1">
-<li>
-<p>Select the <span class="gui-object-action">id</span> field in the JPA Details view.</p>
-</li>
-<li>
-<p>In the JPA Details view:</p>
-<ul>
-<li type="disc">
-<p>For the Map As field, select <span class="bold">Id</span></p>
-</li>
-<li type="disc">
-<p>For the Column field, select <span class="bold">ADDRESS_ID</span>.</p>
-</li>
-</ul>
-<div class="figure"><a id="sthref20" name="sthref20"></a>
-<p class="titleinfigure">JPA Details View for addressId Field</p>
-<img src="img/persistence_view_addressid.png" alt="JPA Details view for the id field." title="JPA Details view for the id field." /><br /></div>
-<!-- class="figure" -->
-<p>Eclipse adds the following annotations to the Address entity:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-@Id
-@Column(name="ADDRESS_ID")
-
-</pre></li>
-<li>
-<p>Map each of the following fields (as <span class="bold">Basic</span> mappings) to the appropriate database column:</p>
-<div class="inftblhruleinformal">
-<table class="HRuleInformal" title="This table describes the mappings for each of the fields in the Address entity." summary="This table describes the mappings for each of the fields in the Address entity." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t4">Field</th>
-<th align="left" valign="bottom" id="r1c2-t4">Map As</th>
-<th align="left" valign="bottom" id="r1c3-t4">Database Column</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t4" headers="r1c1-t4">city</td>
-<td align="left" headers="r2c1-t4 r1c2-t4">Basic</td>
-<td align="left" headers="r2c1-t4 r1c3-t4">CITY</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t4" headers="r1c1-t4">country</td>
-<td align="left" headers="r3c1-t4 r1c2-t4">Basic</td>
-<td align="left" headers="r3c1-t4 r1c3-t4">COUNTRY</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t4" headers="r1c1-t4">postalCode</td>
-<td align="left" headers="r4c1-t4 r1c2-t4">Basic</td>
-<td align="left" headers="r4c1-t4 r1c3-t4">P_CODE</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t4" headers="r1c1-t4">provinceOrState</td>
-<td align="left" headers="r5c1-t4 r1c2-t4">Basic</td>
-<td align="left" headers="r5c1-t4 r1c3-t4">PROVINCE</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r6c1-t4" headers="r1c1-t4">street</td>
-<td align="left" headers="r6c1-t4 r1c2-t4">Basic</td>
-<td align="left" headers="r6c1-t4 r1c3-t4">STREET</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblhruleinformal" --></li>
-</ol>
-<p>Notice that Dali will automatically map some fields to the correct database column (such as the <span class="bold">city</span> field to the CITY column) if the names are identical.</p>
-<p>Refer to the <a href="getting_started006.htm#BABCDECJ">Dali basic tutorial</a> to map a complete object model using basic and relational mappings.</p>
-</div>
-<!-- class="sect2" -->
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started006.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started006.htm
deleted file mode 100644
index 2dde4a2..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started006.htm
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Dali basic tutorial</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Dali basic tutorial" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABCDECJ" name="BABCDECJ"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Dali basic tutorial<a id="sthref21" name="sthref21"></a></h1>
-</td>
-</tr>
-</table>
-<p>In this tutorial, you will use Dali to map the object model of a company's HR application to track its employees. <a href="#BABIDCBA">Figure: Tutorial Object Model</a> illustrates the object model for the tutorial.</p>
-<div class="figure"><a id="BABIDCBA" name="BABIDCBA"></a>
-<p class="titleinfigure">Tutorial Object Model</p>
-<img src="img/tutorial_object_model.png" alt="This figure shows the object model for the tutorial." title="This figure shows the object model for the tutorial." /><br /></div>
-<!-- class="figure" -->
-<p>Next, you will <a href="getting_started007.htm#BABBBBID">Generate the tutorial database schema</a>.</p>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started007.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started007.htm
deleted file mode 100644
index 654b0c9..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started007.htm
+++ /dev/null
@@ -1,215 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Generate the tutorial database schema</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Generate the tutorial database schema" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABBBBID" name="BABBBBID"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Generate the tutorial database schema</h1>
-</td>
-</tr>
-</table>
-<p>The tutorial application uses three database tables to store each employee's information: EMPLOYEE, ADDRESS and PHONE. <a href="#BABDEFDF">Table: Tutorial Database Schema</a> describes the columns for each table.</p>
-<p>You can download SQL scripts to build and populate the database tables with sample data from <code><a href="http://www.eclipse.org/webtools/dali/docs/dbscripts.zip">http://www.eclipse.org/webtools/dali/docs/dbscripts.zip</a></code>.</p>
-<div class="tblhruleformal"><a id="sthref22" name="sthref22"></a><a id="BABDEFDF" name="BABDEFDF"></a>
-<p class="titleintable">Tutorial Database Schema</p>
-<table class="HRuleFormal" title="Tutorial Database Schema" summary="This table lists the database schema." dir="ltr" border="1" width="100%" frame="hsides" rules="rows" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t5">Table</th>
-<th align="left" valign="bottom" id="r1c2-t5">Column</th>
-<th align="left" valign="bottom" id="r1c3-t5">Type</th>
-<th align="left" valign="bottom" id="r1c4-t5">Details</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t5" headers="r1c1-t5" rowspan="5">
-<p>EMPLOYEE</p>
-</td>
-<td align="left" headers="r2c1-t5 r1c2-t5">
-<p>EMP_ID</p>
-</td>
-<td align="left" headers="r2c1-t5 r1c3-t5">
-<p>NUMBER(15)</p>
-</td>
-<td align="left" headers="r2c1-t5 r1c4-t5">
-<p>Primary Key</p>
-</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t5" headers="r2c1-t5 r1c1-t5">
-<p>F_NAME</p>
-</td>
-<td align="left" headers="r2c1-t5 r3c1-t5 r1c2-t5">
-<p>VARCHAR(40)</p>
-</td>
-<td align="left" headers="r2c1-t5 r3c1-t5 r1c3-t5"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t5" headers="r2c1-t5 r1c1-t5">
-<p>L_NAME</p>
-</td>
-<td align="left" headers="r2c1-t5 r4c1-t5 r1c2-t5">
-<p>VARCHAR(40)</p>
-</td>
-<td align="left" headers="r2c1-t5 r4c1-t5 r1c3-t5"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t5" headers="r2c1-t5 r1c1-t5">
-<p>ADDR_ID</p>
-</td>
-<td align="left" headers="r2c1-t5 r5c1-t5 r1c2-t5">
-<p>NUMBER(15)</p>
-</td>
-<td align="left" headers="r2c1-t5 r5c1-t5 r1c3-t5">
-<p>Foreign Key, references ADDRESS.ADDRES_ID</p>
-</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r6c1-t5" headers="r2c1-t5 r1c1-t5">
-<p>VERSION</p>
-</td>
-<td align="left" headers="r2c1-t5 r6c1-t5 r1c2-t5">
-<p>NUMBER(15)</p>
-</td>
-<td align="left" headers="r2c1-t5 r6c1-t5 r1c3-t5"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r7c1-t5" headers="r1c1-t5" rowspan="6">
-<p>ADDRESS</p>
-</td>
-<td align="left" headers="r7c1-t5 r1c2-t5">
-<p>ADDRESS_ID</p>
-</td>
-<td align="left" headers="r7c1-t5 r1c3-t5">
-<p>NUMBER(15)</p>
-</td>
-<td align="left" headers="r7c1-t5 r1c4-t5">
-<p>Primary Key</p>
-</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r8c1-t5" headers="r7c1-t5 r1c1-t5">
-<p>PROVINCE</p>
-</td>
-<td align="left" headers="r7c1-t5 r8c1-t5 r1c2-t5">
-<p>VARCHAR(80)</p>
-</td>
-<td align="left" headers="r7c1-t5 r8c1-t5 r1c3-t5"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r9c1-t5" headers="r7c1-t5 r1c1-t5">
-<p>COUNTRY</p>
-</td>
-<td align="left" headers="r7c1-t5 r9c1-t5 r1c2-t5">
-<p>VARCHAR(80)</p>
-</td>
-<td align="left" headers="r7c1-t5 r9c1-t5 r1c3-t5"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r10c1-t5" headers="r7c1-t5 r1c1-t5">
-<p>STREET</p>
-</td>
-<td align="left" headers="r7c1-t5 r10c1-t5 r1c2-t5">
-<p>VARCHAR(80)</p>
-</td>
-<td align="left" headers="r7c1-t5 r10c1-t5 r1c3-t5"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r11c1-t5" headers="r7c1-t5 r1c1-t5">
-<p>P_CODE</p>
-</td>
-<td align="left" headers="r7c1-t5 r11c1-t5 r1c2-t5">
-<p>VARCHAR(20)</p>
-</td>
-<td align="left" headers="r7c1-t5 r11c1-t5 r1c3-t5"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r12c1-t5" headers="r7c1-t5 r1c1-t5">
-<p>CITY</p>
-</td>
-<td align="left" headers="r7c1-t5 r12c1-t5 r1c2-t5">
-<p>VARCHAR(80)</p>
-</td>
-<td align="left" headers="r7c1-t5 r12c1-t5 r1c3-t5"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r13c1-t5" headers="r1c1-t5" rowspan="4">
-<p>PHONE</p>
-</td>
-<td align="left" headers="r13c1-t5 r1c2-t5">
-<p>EMP_ID</p>
-</td>
-<td align="left" headers="r13c1-t5 r1c3-t5">
-<p>NUMBER(15)</p>
-</td>
-<td align="left" headers="r13c1-t5 r1c4-t5">
-<p>Foreign Key, reference to EMPLOYEE.EMP_ID</p>
-</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r14c1-t5" headers="r13c1-t5 r1c1-t5">
-<p>AREA_CODE</p>
-</td>
-<td align="left" headers="r13c1-t5 r14c1-t5 r1c2-t5">
-<p>VARCHAR(3)</p>
-</td>
-<td align="left" headers="r13c1-t5 r14c1-t5 r1c3-t5"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r15c1-t5" headers="r13c1-t5 r1c1-t5">
-<p>P_NUMBER</p>
-</td>
-<td align="left" headers="r13c1-t5 r15c1-t5 r1c2-t5">
-<p>VARCHAR(7)</p>
-</td>
-<td align="left" headers="r13c1-t5 r15c1-t5 r1c3-t5">
-<p>Primary key</p>
-</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r16c1-t5" headers="r13c1-t5 r1c1-t5">
-<p>TYPE</p>
-</td>
-<td align="left" headers="r13c1-t5 r16c1-t5 r1c2-t5">
-<p>VARCHAR(15)</p>
-</td>
-<td align="left" headers="r13c1-t5 r16c1-t5 r1c3-t5"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="tblhruleformal" -->
-<p>Next, you will <a href="getting_started008.htm#BABDHFCD">Create a database connection</a>.</p>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started008.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started008.htm
deleted file mode 100644
index e277fed..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started008.htm
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Create a database connection</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Create a database connection" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABDHFCD" name="BABDHFCD"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Create a database connection</h1>
-</td>
-</tr>
-</table>
-<p>After creating the database you will need to create a database connection to use with the tutorial application. An active database connection is required to complete tutorial application.</p>
-<p>Use the <a href="../org.eclipse.wst.datatools.connection.ui.doc.user/topics/tconnecting_wiz.html">New Connection wizard</a> to create a database connection.</p>
-<div class="figure"><a id="sthref23" name="sthref23"></a>
-<p class="titleinfigure">Database Explorer</p>
-<img src="img/database_explorer.png" alt="This figure shows the Database Explorer." title="This figure shows the Database Explorer." /><br /></div>
-<!-- class="figure" -->
-<p>Now you're ready to <a href="getting_started009.htm#BABBBAIG">Create a JPA project</a>.</p>
-</div>
-<!-- class="sect3" -->
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started009.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started009.htm
deleted file mode 100644
index fed0cfa..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started009.htm
+++ /dev/null
@@ -1,68 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Create a JPA project</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Create a JPA project" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABBBAIG" name="BABBBAIG"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Create a JPA project</h1>
-</td>
-</tr>
-</table>
-<p>In order to begin, you must create a new Java project.</p>
-<ol type="1" start="1">
-<li>
-<p>Select <span class="gui-object-action">File &gt; New &gt; Project</span>. The New Project dialog appears.</p>
-</li>
-<li>
-<p>On the <span class="gui-object-title">New Project</span> dialog, select <span class="gui-object-action">JPA &gt; JPA Project</span> and click <span class="gui-object-action">OK</span>. The New JPA Project dialog appears.</p>
-</li>
-<li>
-<p>On the <span class="gui-object-title">New JPA Project</span> dialog, enter <code>Employee</code> as the <span class="gui-object-action">Project name</span> and click <span class="gui-object-action">Next</span>. The Project Facets page appears.</p>
-</li>
-<li>
-<p>Verify that you have selected a Java 5.0 (or higher) and JPA 1.0 facet, and click <span class="bold">Next</span>. The JPA Facet page appears.</p>
-</li>
-<li>
-<p>Select your vender-specific platform, database connection, and JPA implementation library, and click <span class="bold">Finish</span>.</p>
-</li>
-</ol>
-<p>Eclipse adds the project to the workbench and opens the Java perspective.</p>
-<div class="figure"><a id="sthref24" name="sthref24"></a>
-<p class="titleinfigure">Persistence Perspective</p>
-<img src="img/persistence_perspective.png" alt="This figure shows the main parts of the JPA Development Perspective: The JPA Structure and JPA Details views." title="This figure shows the main parts of the JPA Development Perspective: The JPA Structure and JPA Details views." /><br /></div>
-<!-- class="figure" -->
-<p>The next step is to <a href="getting_started010.htm#BABIJIGF">Create persistent Java entities</a>.</p>
-</div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started010.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started010.htm
deleted file mode 100644
index 69ec202..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started010.htm
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Create persistent Java entities</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Create persistent Java entities" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABIJIGF" name="BABIJIGF"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Create persistent Java entities</h1>
-</td>
-</tr>
-</table>
-<p>The <a href="getting_started006.htm#BABIDCBA">Tutorial Object Model</a> contains three entities: <span class="bold">Employee</span>, <span class="bold">Address</span>, and <span class="bold">PhoneNumber</span>. Use this procedure to add the entities to the project.</p>
-<ol type="1" start="1">
-<li>
-<p>Right-click the <span class="bold">Employee</span> project in the <span class="gui-object-title">Package Explorer</span> and select <span class="gui-object-action">New &gt; Class</span>. The New Java Class dialog appears.</p>
-</li>
-<li>
-<p>On the <span class="gui-object-title">Java Class</span> dialog, enter a package name (such as <code>dali.tutorial.model</code>), class name (such as <code>Employee</code>), and click <span class="gui-object-action">Finish</span>. Eclipse adds the Employee entity to the Package Explorer.</p>
-</li>
-<li>
-<p>Select the <code>Employee</code> entity in the JPA Structure view.</p>
-</li>
-<li>
-<p>In the JPA Details view, in the Map As field, select <span class="bold">Entity</span>. In the Table field, select the <span class="bold">EMPLOYEE</span> database table.</p>
-<div class="figure"><a id="sthref25" name="sthref25"></a>
-<p class="titleinfigure">Employee Entity in JPA Details View</p>
-<img src="img/jpa_details_employee.png" alt="Employee entity in JPA Details view." title="Employee entity in JPA Details view." /><br /></div>
-<!-- class="figure" --></li>
-</ol>
-<p>Eclipse adds the <code>@Entity</code> annotation to the class. Repeat this procedure to add the <span class="bold">PhoneNumber</span> and <span class="bold">Address</span> entities.</p>
-<p>Notice that the Problems view reports several errors for each entity. We'll address these shortly.</p>
-<p>Next, you will <a href="getting_started011.htm#BABDCBDD">Add fields to the entities</a>.</p>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started011.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started011.htm
deleted file mode 100644
index 0cd45a9..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started011.htm
+++ /dev/null
@@ -1,85 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Add fields to the entities</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Add fields to the entities" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABDCBDD" name="BABDCBDD"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Add fields to the entities</h1>
-</td>
-</tr>
-</table>
-<p>Before mapping the entities to the database, you must add the necessary fields to each entity.</p>
-<ol type="1" start="1">
-<li>
-<p>Add the following fields to the <span class="bold">Employee</span> entity:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-private Long id;
-private String firstNname;
-private String lastName;
-private String address;
-private List&lt;PhoneNumber&gt; phoneNumbers;
-private Long version;
-
-</pre></li>
-<li>
-<p>Import <span class="bold">java.util.List</span>.</p>
-</li>
-<li>
-<p>Generate Getters and Setters for each field.</p>
-</li>
-<li>
-<p>Add the following fields to the <span class="bold">Address</span> entity:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-private Long id;
-private String street;
-private String city;
-private String stateOrProvince;
-private String country;
-private String postalCode;
-
-</pre></li>
-<li>
-<p>Add the following fields to the <span class="bold">PhoneNumber</span> entity:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-private String type;
-private String areaCode;
-private String number;
-private Employee owner;
-
-</pre></li>
-</ol>
-<p>Next, you will <a href="getting_started012.htm#BABIHGGD">Associate the entity with a database table</a>.</p>
-</div>
-<!-- class="sect3" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started012.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started012.htm
deleted file mode 100644
index 5f6950e..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started012.htm
+++ /dev/null
@@ -1,60 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Associate the entity with a database table</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Associate the entity with a database table" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABIHGGD" name="BABIHGGD"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Associate the entity with a database table</h1>
-</td>
-</tr>
-</table>
-<p>Now you must associate each entity with its primary database table.</p>
-<ol type="1" start="1">
-<li>
-<p>Select the <span class="gui-object-action">Employee</span> class in the Explorer view.</p>
-</li>
-<li>
-<p>In the JPA Details view, notice that Dali has automatically selected the EMPLOYEE table as the table name.</p>
-<div class="figure"><a id="sthref26" name="sthref26"></a>
-<p class="titleinfigure">JPA Details View for the Employee Entity</p>
-<img src="img/persistence_view_employee.png" alt="JPA Details view for the Employee entity." title="JPA Details view for the Employee entity." /><br /></div>
-<!-- class="figure" --></li>
-</ol>
-<p>By default, Dali attempts to associate each entity with a similarly named database table. Notice that although you have not explicitly associated the <span class="bold">Address</span> entity yet, there is no error in the Problems view because the entity name, Address, is identical to the table name (ADDRESS).</p>
-<p>For the <span class="bold">PhoneNumber</span> entity, however, there is an error. This is because the entity name (PhoneNumber) is different than the database table (PHONE). You must explicitly associate the entity with the PHONE table. Dali adds the <code>@Table(name="PHONE")</code> annotation to the entity.</p>
-<p>Now you are ready to <a href="getting_started013.htm#BABEBGBC">Create OR mappings</a>.</p>
-</div>
-<!-- class="sect3" -->
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started013.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started013.htm
deleted file mode 100644
index d1928e6..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started013.htm
+++ /dev/null
@@ -1,64 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Create OR mappings</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Create OR mappings" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABEBGBC" name="BABEBGBC"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Create OR mappings</h1>
-</td>
-</tr>
-</table>
-<p>Now you're ready to map the attributes of each persistent entity to columns in the appropriate database table. For the tutorial application, you will use the following mapping types:</p>
-<ul>
-<li type="disc">
-<p>ID mappings</p>
-</li>
-<li type="disc">
-<p>Basic mappings</p>
-</li>
-<li type="disc">
-<p>One-to-one mappings</p>
-</li>
-<li type="disc">
-<p>Many-to-one mappings</p>
-</li>
-<li type="disc">
-<p>One-to-many mappings</p>
-</li>
-<li type="disc">
-<p>Version mappings</p>
-</li>
-</ul>
-<p>Next, you will <a href="getting_started014.htm#BABGEFDI">Create ID mappings</a>.</p>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started014.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started014.htm
deleted file mode 100644
index a4cda76..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started014.htm
+++ /dev/null
@@ -1,132 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Create ID mappings</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Create ID mappings" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABGEFDI" name="BABGEFDI"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Create ID mappings</h1>
-</td>
-</tr>
-</table>
-<p>Use an <span class="bold">ID Mapping</span> to specify the primary key of an entity. Each persistent entity must have an ID. Notice that the Problems view reports that each entity is missing an ID.</p>
-<ol type="1" start="1">
-<li>
-<p>Select the <span class="bold">Employee</span> entity in the Package Explorer view.</p>
-</li>
-<li>
-<p>Expand the <span class="bold">Employee</span> entity in the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a> and select the <span class="bold">id</span> field. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the field.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">ID</span>.</p>
-<div class="figure"><a id="sthref27" name="sthref27"></a>
-<p class="titleinfigure">ID Mapping for emp_id Field</p>
-<img src="img/persistence_view_empid.png" alt="JPA Details view for the emp_id field." title="JPA Details view for the emp_id field." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>Use this table to complete the remaining fields in the <span class="gui-object-title">JPA Details</span> view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the Persistence Properties view for this mapping." summary="This table lists the fields in the Persistence Properties view for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t6">Property</th>
-<th align="left" valign="bottom" id="r1c2-t6">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t6" headers="r1c1-t6">Map As</td>
-<td align="left" headers="r2c1-t6 r1c2-t6">Defines this mapping as an <span class="bold">ID Mapping</span>. Dali adds the <code>@Id</code> annotation to the entity.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t6" headers="r1c1-t6">Column</td>
-<td align="left" headers="r3c1-t6 r1c2-t6">The database column for the primary key of the table associated with the entity. Select <span class="bold">EMP_ID</span>.
-<p>Because the database column (EMP_ID) is named differently than the entity field (id), Dali adds the <code>@Column(name="EMP_ID"</code>) annotation.</p>
-</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-<li>
-<p>Leave all other fields on the tab as their defaults. Expand the <span class="bold">Primary Key Generation</span> area.</p>
-<div class="figure"><a id="sthref28" name="sthref28"></a>
-<p class="titleinfigure">Primary Key Generation for emp_id Field</p>
-<img src="img/persistence_view_empid_pk.png" alt="JPA Details view (with Primary Key options) for the emp_id field." title="JPA Details view (with Primary Key options) for the emp_id field." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>Use this table to complete the Primary Key Generation fields in the <span class="gui-object-title">JPA Details</span> view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the Persistence Properties view for this mapping." summary="This table lists the fields in the Persistence Properties view for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t7">Property</th>
-<th align="left" valign="bottom" id="r1c2-t7">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t7" headers="r1c1-t7">Generated Value</td>
-<td align="left" headers="r2c1-t7 r1c2-t7">These fields define how the primary key is generated.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t7" headers="r1c1-t7">&nbsp;&nbsp;Strategy</td>
-<td align="left" headers="r3c1-t7 r1c2-t7">For the tutorial project, use the <span class="bold">Auto</span> option.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t7" headers="r1c1-t7">&nbsp;&nbsp;Generator&nbsp;Name</td>
-<td align="left" headers="r4c1-t7 r1c2-t7">Leave this field blank.</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-</ol>
-<p>In the JPA Structure view, the <span class="bold">id</span> field is identified as the primary key by the following icon:</p>
-<div class="figure"><a id="sthref29" name="sthref29"></a>
-<p class="titleinfigure">JPA Structure for Employee Entity</p>
-<img src="img/persistence_outline_empid.png" alt="emp_id attribute of the Employee entity in the JPA Structure view." title="emp_id attribute of the Employee entity in the JPA Structure view." /><br /></div>
-<!-- class="figure" -->
-<p>Repeat this procedure to map the following primary keys (as shown in <a href="getting_started007.htm#BABDEFDF">Table: Tutorial Database Schema</a>):</p>
-<ul>
-<li type="disc">
-<p>The <span class="bold">id</span> field of the <span class="bold">Address</span> entity to the ADDRESS_ID column of the ADDRESS table.</p>
-</li>
-<li type="disc">
-<p>The <span class="bold">number</span> field of the <span class="bold">PhoneNumber</span> entity to the P_NUMBER column of the PHONE table.</p>
-</li>
-</ul>
-<p>Next, you will <a href="getting_started015.htm#BABEEFJA">Create basic mappings</a>.</p>
-</div>
-<!-- class="sect3" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started015.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started015.htm
deleted file mode 100644
index 3d5ff04..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started015.htm
+++ /dev/null
@@ -1,133 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:52 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Create basic mappings</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Create basic mappings" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABEEFJA" name="BABEEFJA"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Create basic mappings</h1>
-</td>
-</tr>
-</table>
-<p>Use a <span class="bold">Basic Mapping</span> to map an attribute directly to a database column. In the <a href="getting_started006.htm#BABIDCBA">Tutorial Object Model</a>, the <span class="bold">firstName</span> field of the <span class="bold">Employee</span> class maps directly to the F_NAME column of the EMPLOYEE database table.</p>
-<ol type="1" start="1">
-<li>
-<p>Select the <span class="bold">Employee</span> entity in the Package Explorer view.</p>
-</li>
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the <span class="bold">firstName</span> field of the <span class="bold">Employee</span> entity. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the field.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">Basic</span>. In the Column field, select <span class="bold">F_NAME</span>.</p>
-<div class="figure"><a id="sthref30" name="sthref30"></a>
-<p class="titleinfigure">Basic Mapping for firstName</p>
-<img src="img/persistence_view_firstname.png" alt="JPA Details view for the firstName field." title="JPA Details view for the firstName field." /><br /></div>
-<!-- class="figure" --></li>
-</ol>
-<p>Dali adds the <code>@Column(name="F_NAME")</code> annotation to the entity. In the JPA Structure, the <span class="bold">firstName</span> field is identified as a basic mapping as shown in the following figure:</p>
-<div class="figure"><a id="sthref31" name="sthref31"></a>
-<p class="titleinfigure">JPA Structure for Employee Entity</p>
-<img src="img/persistence_outline_fname.png" alt="The firstName attribute of the Employee entity in the JPA Structure view." title="The firstName attribute of the Employee entity in the JPA Structure view." /><br /></div>
-<!-- class="figure" -->
-<p>Repeat this procedure to map each of the following fields as <span class="bold">Basic</span> mappings:</p>
-<ul>
-<li type="disc">
-<p>Employee entity</p>
-<ul>
-<li type="circle">
-<p><span class="bold">lastName</span> field to L_NAME column</p>
-</li>
-</ul>
-</li>
-<li type="disc">
-<p>Address Entity</p>
-<ul>
-<li type="circle">
-<p><span class="bold">city</span> field to CITY column</p>
-</li>
-<li type="circle">
-<p><span class="bold">country</span> field to COUNTRY column</p>
-</li>
-<li type="circle">
-<p><span class="bold">postalCode</span> field to P_CODE column</p>
-</li>
-<li type="circle">
-<p><span class="bold">stateOrProvice</span> field to PROVINCE column</p>
-</li>
-<li type="circle">
-<p><span class="bold">street</span> field to STREET column</p>
-</li>
-</ul>
-<div align="center">
-<div class="inftblnote"><br />
-<table class="Note oac_no_warn" summary="This is a layout table to format a note" title="This is a layout table to format a note" dir="ltr" border="1" width="80%" frame="hsides" rules="groups" cellpadding="3" cellspacing="0">
-<tbody>
-<tr>
-<td align="left">
-<p class="notep1">Note:</p>
-Because the <span class="bold">city</span>, <span class="bold">country</span>, and <span class="bold">street</span> fields are named identically to their database columns, Dali automatically maps the fields; no annotations are required.</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblnote" --></div>
-</li>
-<li type="disc">
-<p>Phone Entity</p>
-<ul>
-<li type="circle">
-<p><span class="bold">areaCode</span> field to AREA_CODE column</p>
-</li>
-<li type="circle">
-<p><span class="bold">type</span> field to TYPE column</p>
-</li>
-</ul>
-<div align="center">
-<div class="inftblnote"><br />
-<table class="Note oac_no_warn" summary="This is a layout table to format a note" title="This is a layout table to format a note" dir="ltr" border="1" width="80%" frame="hsides" rules="groups" cellpadding="3" cellspacing="0">
-<tbody>
-<tr>
-<td align="left">
-<p class="notep1">Note:</p>
-Because the <span class="bold">type</span> field is named identically to its database column, Dali automatically maps the field. No annotation is required.</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblnote" --></div>
-</li>
-</ul>
-<p>Next, you will <a href="getting_started016.htm#BABGBGHF">Create one-to-one mappings</a>.</p>
-</div>
-<!-- class="sect3" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started016.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started016.htm
deleted file mode 100644
index e57c4f5..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started016.htm
+++ /dev/null
@@ -1,89 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:53 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Create one-to-one mappings</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Create one-to-one mappings" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABGBGHF" name="BABGBGHF"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Create one-to-one mappings</h1>
-</td>
-</tr>
-</table>
-<p>Use a <span class="bold">One-to-One Mapping</span> to define a relationship from an attribute to another class, with one-to-one multiplicity to a database column. In the <a href="getting_started006.htm#BABIDCBA">Tutorial Object Model</a>, the <span class="bold">address</span> field of the <span class="bold">Employee</span> class has a one-to-one relationship to the <span class="bold">Address</span> class; each employee may have a single address.</p>
-<ol type="1" start="1">
-<li>
-<p>Select the <span class="bold">Employee</span> entity in the Package Explorer view.</p>
-</li>
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the <span class="bold">address</span> field of the <span class="bold">Employee</span> entity. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the field.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">One-to-One</span>.</p>
-<div class="figure"><a id="sthref32" name="sthref32"></a>
-<p class="titleinfigure">One-to-one Mapping for address</p>
-<img src="img/persistence_view_onetoone.png" alt="JPA Details view for the address field." title="JPA Details view for the address field." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>For the Target Entity, click <span class="bold">Browse</span> and select the <span class="bold">Address</span> persistent entity. Dali adds the <code>@OneToOne(targetEntity=dali.tutorial.model.Address.class)</code> entity to the class.</p>
-<p>Leave the other fields with their default values.</p>
-</li>
-<li>
-<p>Select the <span class="bold">Override Default</span> option to specify the relationship between the Employee and Address entities. Because you had to explicitly define the ID field for the Address entity in its ID mapping, you will need to edit the default join relationship.</p>
-</li>
-<li>
-<p>Select the <span class="bold">address_ADDRESS_ID -&gt; ADDRESS_ID</span> relationship in the <span class="gui-object-title">Join Columns</span> area and click <span class="bold">Edit</span>.</p>
-</li>
-<li>
-<p>In the Edit Join Column dialog, select the following options and click <span class="bold">OK</span>.</p>
-<ul>
-<li type="disc">
-<p>Name: <span class="bold">ADDR_ID</span> (from the EMPLOYEE table)</p>
-</li>
-<li type="disc">
-<p>Referenced Column Name: <span class="bold">ADDRESS_ID</span> (from the ADDRESS table)</p>
-</li>
-</ul>
-<div class="figure"><a id="sthref33" name="sthref33"></a>
-<p class="titleinfigure">Editing Join Column for Address Mapping</p>
-<img src="img/edit_join_column_dialog.png" alt="Edit Join Column dialog for the address 1:1 mapping." title="Edit Join Column dialog for the address 1:1 mapping." /><br /></div>
-<!-- class="figure" --></li>
-</ol>
-<p>In the JPA Structure, the <span class="bold">address</span> field is identified as a one-to-one mapping, as shown in the following figure:</p>
-<div class="figure"><a id="sthref34" name="sthref34"></a>
-<p class="titleinfigure">JPA Structure for Employee Entity</p>
-<img src="img/persistence_outline_address.png" alt="The address attribute of the Employee entity in the JPA Structure view." title="The address attribute of the Employee entity in the JPA Structure view." /><br /></div>
-<!-- class="figure" -->
-<p>Next, you will <a href="getting_started017.htm#BABBEHEG">Create one-to-many mappings</a>.</p>
-</div>
-<!-- class="sect3" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started017.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started017.htm
deleted file mode 100644
index 3b69b34..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started017.htm
+++ /dev/null
@@ -1,71 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:53 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Create one-to-many mappings</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Create one-to-many mappings" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABBEHEG" name="BABBEHEG"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Create one-to-many mappings</h1>
-</td>
-</tr>
-</table>
-<p>Use a <span class="bold">One-to-Many Mapping</span> to define a relationship from an attribute to another class, with one-to-many multiplicity to a database column. In the <a href="getting_started006.htm#BABIDCBA">Tutorial Object Model</a>, the <span class="bold">phoneNumbers</span> field of the <span class="bold">Employee</span> class has a one-to-many relationship to the <span class="bold">Phone</span> class; each employee may have many phone numbers.</p>
-<ol type="1" start="1">
-<li>
-<p>Select the <span class="bold">Employee</span> entity in the Package Explorer view.</p>
-</li>
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the <span class="bold">phoneNumber</span> field of the <span class="bold">Employee</span> entity. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the field.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">One-to-Many</span>.</p>
-<div class="figure"><a id="sthref35" name="sthref35"></a>
-<p class="titleinfigure">One-to-many Mapping for phoneNumbers</p>
-<img src="img/persistence_view_onetomany.png" alt="JPA Details view for the phoneNumbers field." title="JPA Details view for the phoneNumbers field." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>Select <span class="bold">PhoneNumber</span> as the Target Entity. Leave the other fields with their default values.</p>
-</li>
-<li>
-<p>In the Join Table area, notice that Dali has selected the correct joins, based on the foreign key associations in the database tables.</p>
-</li>
-</ol>
-<p>In the JPA Structure, the <span class="bold">phoneNumbers</span> field is identified as a one-to-many mapping as shown in the following figure:</p>
-<div class="figure"><a id="sthref36" name="sthref36"></a>
-<p class="titleinfigure">JPA Structure for Employee Entity</p>
-<img src="img/persistence_outline_phone.png" alt="The phoneNumbers attribute of the Employee entity in the JPA Structure view." title="The phoneNumbers attribute of the Employee entity in the JPA Structure view." /><br /></div>
-<!-- class="figure" -->
-<p>Next, you will <a href="getting_started018.htm#BABCHIHI">Create many-to-one mappings</a>.</p>
-</div>
-<!-- class="sect3" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started018.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started018.htm
deleted file mode 100644
index 2798be8..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started018.htm
+++ /dev/null
@@ -1,89 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:53 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Create many-to-one mappings</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Create many-to-one mappings" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABCHIHI" name="BABCHIHI"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Create many-to-one mappings</h1>
-</td>
-</tr>
-</table>
-<p>Use a <span class="bold">May-to-One Mapping</span> to define a relationship from an attribute to another class, with many-to-one multiplicity to a database column. In the <a href="getting_started006.htm#BABIDCBA">Tutorial Object Model</a>, the <span class="bold">owner</span> field of the <span class="bold">PhoneNumber</span> class has a one-to-many relationship to the <span class="bold">Employee</span> class; there are many phone numbers that each employee may have.</p>
-<p>This is the "back mapping" of the one-to-many mapping you previously defined.</p>
-<ol type="1" start="1">
-<li>
-<p>Select the <span class="bold">PhoneNumber</span> entity in the Package Explorer view.</p>
-</li>
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the <span class="bold">owner</span> field of the <span class="bold">PhoneNumber</span> entity. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the field.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">Many to One</span>.</p>
-<div class="figure"><a id="sthref37" name="sthref37"></a>
-<p class="titleinfigure">Many to One Mapping for owner</p>
-<img src="img/persistence_view_manytoone.png" alt="The JPA Details view for the owner field." title="The JPA Details view for the owner field." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>Leave the other fields with their default values. Dali correctly completes the information based on the database structure and previously defined mappings.</p>
-</li>
-<li>
-<p>Use the <span class="bold">Join Columns</span> area to specify the relationship between the PhoneNumber and Employee entities. Because you had to explicitly define the ID field for the Employee entity in its ID mapping, you will need to edit the default join relationship.</p>
-</li>
-<li>
-<p>Select the <span class="bold">Override Default</span> option.</p>
-</li>
-<li>
-<p>Select the <span class="bold">owner_EMP_ID -&gt; EMP_ID</span> relationship in the <span class="gui-object-title">Join Columns</span> area and click <span class="bold">Edit</span>.</p>
-</li>
-<li>
-<p>In the Edit Join Column dialog, select the following options and click <span class="bold">OK</span>.</p>
-<ul>
-<li type="disc">
-<p>Name: <span class="bold">EMP_ID</span> (from the PHONE table)</p>
-</li>
-<li type="disc">
-<p>Referenced Column Name: <span class="bold">EMP_ID</span> (from the EMPLOYEE table)</p>
-</li>
-</ul>
-</li>
-</ol>
-<p>In the JPA Structure, the <span class="bold">owner</span> field is identified as a many-to-one mapping as shown in the following figure:</p>
-<div class="figure"><a id="sthref38" name="sthref38"></a>
-<p class="titleinfigure">JPA Structure for PhoneNumber Entity</p>
-<img src="img/persistence_outline_owner.png" alt="The owner attribute of the PhoneNumber entity in the JPA Structure view." title="The owner attribute of the PhoneNumber entity in the JPA Structure view." /><br /></div>
-<!-- class="figure" -->
-<p>Next, you will <a href="getting_started019.htm#BABIDFFG">Create version mappings</a></p>
-</div>
-<!-- class="sect3" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started019.htm b/jpa/plugins/org.eclipse.jpt.doc.user/getting_started019.htm
deleted file mode 100644
index 3b8c883..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/getting_started019.htm
+++ /dev/null
@@ -1,67 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:53 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Create version mappings</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Create version mappings" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABIDFFG" name="BABIDFFG"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Create version mappings</h1>
-</td>
-</tr>
-</table>
-<p>Use a <span class="bold">Version Mapping</span> to specify the database field used by a persistent entity for optimistic locking.</p>
-<ol type="1" start="1">
-<li>
-<p>Select the <span class="bold">Employee</span> entity in the Package Explorer view.</p>
-</li>
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the <span class="bold">version</span> field of the <span class="bold">Employee</span> entity. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the field.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">Version</span>.</p>
-<div class="figure"><a id="sthref39" name="sthref39"></a>
-<p class="titleinfigure">Version Mapping for version</p>
-<img src="img/persistence_view_version.png" alt="JPA Details view for the version field." title="JPA Details view for the version field." /><br /></div>
-<!-- class="figure" --></li>
-</ol>
-<p>Dali automatically selects the Version column in the EMPLOYEE database table. In the JPA Structure, the <span class="bold">Version</span> field is identified as a version mapping, as shown in the following figure:</p>
-<div class="figure"><a id="sthref40" name="sthref40"></a>
-<p class="titleinfigure">JPA Structure for Employee Entity</p>
-<img src="img/persistence_outline_version.png" alt="The version attribute of the Employee entity in the JPA Structure view." title="The version attribute of the Employee entity in the JPA Structure view." /><br /></div>
-<!-- class="figure" -->
-<p>Congratulations! All of the entities have been successfully mapped.</p>
-</div>
-<!-- class="sect3" -->
-<!-- class="sect2" -->
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/address_java_open.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/address_java_open.png
deleted file mode 100644
index 7da0417..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/address_java_open.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/address_jpa_details.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/address_jpa_details.png
deleted file mode 100644
index f96cc3f..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/address_jpa_details.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/address_jpa_structure.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/address_jpa_structure.png
deleted file mode 100644
index a18a656..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/address_jpa_structure.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/button_jpa_perspective.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/button_jpa_perspective.png
deleted file mode 100644
index e0a9571..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/button_jpa_perspective.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/database_explorer.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/database_explorer.png
deleted file mode 100644
index 435be3d..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/database_explorer.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/details_entitymappings.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/details_entitymappings.png
deleted file mode 100644
index 5bd4885..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/details_entitymappings.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/edit_join_column_dialog.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/edit_join_column_dialog.png
deleted file mode 100644
index 9cc32cf..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/edit_join_column_dialog.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/error_sample.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/error_sample.png
deleted file mode 100644
index 3a49646..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/error_sample.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/generate_entities.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/generate_entities.png
deleted file mode 100644
index e3cb22b..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/generate_entities.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_11mapping.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_11mapping.png
deleted file mode 100644
index 6944826..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_11mapping.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_1mmapping.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_1mmapping.png
deleted file mode 100644
index 69d3193..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_1mmapping.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_basicmapping.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_basicmapping.png
deleted file mode 100644
index b193753..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_basicmapping.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_embeddable.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_embeddable.png
deleted file mode 100644
index 645922c..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_embeddable.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_embeddedidmapping.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_embeddedidmapping.png
deleted file mode 100644
index 0587544..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_embeddedidmapping.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_embeddedmapping.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_embeddedmapping.png
deleted file mode 100644
index 4bef356..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_embeddedmapping.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_idmapping.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_idmapping.png
deleted file mode 100644
index 2b2a94b..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_idmapping.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_m1mapping.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_m1mapping.png
deleted file mode 100644
index a77a01b..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_m1mapping.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_mmmapping.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_mmmapping.png
deleted file mode 100644
index 5d5fd1c..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_mmmapping.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_nonpersistent.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_nonpersistent.png
deleted file mode 100644
index 001ef86..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_nonpersistent.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_persistent.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_persistent.png
deleted file mode 100644
index 7ea0b1d..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_persistent.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_superclass.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_superclass.png
deleted file mode 100644
index 952f11d..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_superclass.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_transientmapping.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_transientmapping.png
deleted file mode 100644
index 1a70dd9..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_transientmapping.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_versionmapping.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_versionmapping.png
deleted file mode 100644
index aa7e0a6..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/icon_versionmapping.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/inheritance_join.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/inheritance_join.png
deleted file mode 100644
index 22b6875..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/inheritance_join.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/inheritance_single.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/inheritance_single.png
deleted file mode 100644
index 3146482..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/inheritance_single.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/inheritance_tab.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/inheritance_tab.png
deleted file mode 100644
index a9d721f..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/inheritance_tab.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/java_editor_address.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/java_editor_address.png
deleted file mode 100644
index ff7eaa6..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/java_editor_address.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/jpa_details_employee.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/jpa_details_employee.png
deleted file mode 100644
index d2c21ce..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/jpa_details_employee.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/jpa_facet_dialog.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/jpa_facet_dialog.png
deleted file mode 100644
index 18c294c..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/jpa_facet_dialog.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/new_jpa_project_dialog.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/new_jpa_project_dialog.png
deleted file mode 100644
index 0fb14b1..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/new_jpa_project_dialog.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/new_project_2.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/new_project_2.png
deleted file mode 100644
index ad3ab04..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/new_project_2.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/ngrelc.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/ngrelc.png
deleted file mode 100644
index 88381a5..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/ngrelc.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/ngrelr.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/ngrelr.png
deleted file mode 100644
index 4bbc744..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/ngrelr.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/ngrelt.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/ngrelt.png
deleted file mode 100644
index 60af21f..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/ngrelt.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/open_persistence_editor.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/open_persistence_editor.png
deleted file mode 100644
index b37937c..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/open_persistence_editor.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_address.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_address.png
deleted file mode 100644
index bd9351c..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_address.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_empid.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_empid.png
deleted file mode 100644
index 90d889f..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_empid.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_entity.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_entity.png
deleted file mode 100644
index bbcbb52..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_entity.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_fields.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_fields.png
deleted file mode 100644
index 5a41682..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_fields.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_fname.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_fname.png
deleted file mode 100644
index 3b8b032..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_fname.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_owner.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_owner.png
deleted file mode 100644
index f24fe48..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_owner.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_phone.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_phone.png
deleted file mode 100644
index 25aca17..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_phone.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_version.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_version.png
deleted file mode 100644
index 4ba483e..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_version.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_view.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_view.png
deleted file mode 100644
index 769aa82..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_outline_view.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_perspective.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_perspective.png
deleted file mode 100644
index f92ea64..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_perspective.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_address.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_address.png
deleted file mode 100644
index c186d3f..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_address.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_addressid.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_addressid.png
deleted file mode 100644
index a7e71ad..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_addressid.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_embedded.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_embedded.png
deleted file mode 100644
index 91affa5..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_embedded.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_empid.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_empid.png
deleted file mode 100644
index 9c2811a..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_empid.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_empid_pk.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_empid_pk.png
deleted file mode 100644
index 46fcc69..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_empid_pk.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_employee.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_employee.png
deleted file mode 100644
index 01337ff..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_employee.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_entity.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_entity.png
deleted file mode 100644
index 0a7685a..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_entity.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_firstname.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_firstname.png
deleted file mode 100644
index 67670ff..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_firstname.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_manytoone.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_manytoone.png
deleted file mode 100644
index c9f0220..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_manytoone.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_mappedsprc.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_mappedsprc.png
deleted file mode 100644
index ceb79d9..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_mappedsprc.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_onetomany.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_onetomany.png
deleted file mode 100644
index 148c735..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_onetomany.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_onetoone.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_onetoone.png
deleted file mode 100644
index 3e2b739..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_onetoone.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_version.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_version.png
deleted file mode 100644
index fea937d..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_view_version.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_xml_editor.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_xml_editor.png
deleted file mode 100644
index b14dc15..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/persistence_xml_editor.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/properties_persistence.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/properties_persistence.png
deleted file mode 100644
index fcc9886..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/properties_persistence.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/quickstart_project.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/quickstart_project.png
deleted file mode 100644
index c7c0664..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/quickstart_project.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/secondary_tables.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/secondary_tables.png
deleted file mode 100644
index e6a9159..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/secondary_tables.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/synchornize_classes.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/synchornize_classes.png
deleted file mode 100644
index bede63b..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/synchornize_classes.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/table_entity.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/table_entity.png
deleted file mode 100644
index 1aa1dbe..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/table_entity.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/img/tutorial_object_model.png b/jpa/plugins/org.eclipse.jpt.doc.user/img/tutorial_object_model.png
deleted file mode 100644
index eb25d7d..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/img/tutorial_object_model.png
+++ /dev/null
Binary files differ
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/index.xml b/jpa/plugins/org.eclipse.jpt.doc.user/index.xml
deleted file mode 100644
index 60f79a5..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/index.xml
+++ /dev/null
@@ -1,546 +0,0 @@
-<?xml version='1.0' encoding='iso-8859-1'?>
-<index version="1.0">
-  <entry keyword="@Basic">
-    <entry keyword="Basic mapping"><topic href="tasks007.htm#sthref116" /></entry>
-  </entry>
-  <entry keyword="@Column">
-    <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref198" /></entry>
-  </entry>
-  <entry keyword="@DiscriminatorColumn">
-    <entry keyword="Specifying entity inheritance"><topic href="task_inheritance.htm#sthref103" /></entry>
-  </entry>
-  <entry keyword="@DiscriminatorValue">
-    <entry keyword="Specifying entity inheritance"><topic href="task_inheritance.htm#sthref105" /></entry>
-  </entry>
-  <entry keyword="@Embeddable">
-    <entry keyword="Embeddable"><topic href="tasks005.htm#sthref86" /></entry>
-  </entry>
-  <entry keyword="@Embedded">
-    <entry keyword="Embedded mapping"><topic href="tasks008.htm#sthref120" /></entry>
-  </entry>
-  <entry keyword="@EmbeddedId">
-    <entry keyword="Embedded ID mapping"><topic href="tasks009.htm#sthref124" /></entry>
-  </entry>
-  <entry keyword="@Entity">
-    <entry keyword="Entity"><topic href="tasks004.htm#sthref80" /></entry>
-  </entry>
-  <entry keyword="@Enumerated">
-    <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref208" /></entry>
-  </entry>
-  <entry keyword="@GeneratedValue">
-    <entry keyword="Primary Key Generation information"><topic href="ref_primary_key.htm#sthref217" /></entry>
-  </entry>
-  <entry keyword="@Id">
-    <entry keyword="ID mapping"><topic href="tasks010.htm#sthref128" /></entry>
-  </entry>
-  <entry keyword="@Inheritance">
-    <entry keyword="Specifying additional tables"><topic href="task_additonal_tables.htm#sthref98" /></entry>
-    <entry keyword="Specifying entity inheritance"><topic href="task_inheritance.htm#sthref101" /></entry>
-  </entry>
-  <entry keyword="@JoinColumn">
-    <entry keyword="Many-to-one mapping"><topic href="tasks012.htm#sthref139" /></entry>
-    <entry keyword="One-to-one mapping"><topic href="tasks014.htm#sthref149" /></entry>
-    <entry keyword="Join Table Information"><topic href="reference006.htm#sthref214" /></entry>
-    <entry keyword="Join Columns Information"><topic href="reference007.htm#sthref216" /></entry>
-  </entry>
-  <entry keyword="@Lob">
-    <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref203" /></entry>
-  </entry>
-  <entry keyword="@ManyToMany">
-    <entry keyword="Many-to-many mapping"><topic href="tasks011.htm#sthref132" /></entry>
-  </entry>
-  <entry keyword="@ManyToOne">
-    <entry keyword="Many-to-one mapping"><topic href="tasks012.htm#sthref137" /></entry>
-  </entry>
-  <entry keyword="@MappedSuperclass">
-    <entry keyword="Mapped superclass"><topic href="tasks006.htm#sthref93" /></entry>
-  </entry>
-  <entry keyword="@OneToMany">
-    <entry keyword="One-to-many mapping"><topic href="tasks013.htm#sthref142" /></entry>
-  </entry>
-  <entry keyword="@OneToOne">
-    <entry keyword="One-to-one mapping"><topic href="tasks014.htm#sthref146" /></entry>
-  </entry>
-  <entry keyword="@OrderBy">
-    <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref211" /></entry>
-  </entry>
-  <entry keyword="@SequenceGenerator">
-    <entry keyword="Primary Key Generation information"><topic href="ref_primary_key.htm#sthref219" /></entry>
-  </entry>
-  <entry keyword="@Temporal">
-    <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref205" /></entry>
-  </entry>
-  <entry keyword="@Transient">
-    <entry keyword="Transient mapping"><topic href="tasks015.htm#sthref152" /></entry>
-  </entry>
-  <entry keyword="@Version">
-    <entry keyword="Version mapping"><topic href="tasks016.htm#sthref156" /></entry>
-  </entry>
-  <entry keyword="architecture of Dali feature">
-    <entry keyword="Dali Developer Documentation"><topic href="reference017.htm#sthref241" /></entry>
-  </entry>
-  <entry keyword="attributes">
-    <entry keyword="JPA Details view">
-      <entry keyword="JPA Details view (for attributes)"><topic href="ref_persistence_map_view.htm#sthref197" /></entry>
-    </entry>
-    <entry keyword="mapping">
-      <entry keyword="Understanding OR mappings"><topic href="concept_mapping.htm#sthref44" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="basic mapping">
-    <entry keyword="@Basic">
-      <entry keyword="Basic mapping"><topic href="tasks007.htm#sthref117" /></entry>
-    </entry>
-    <entry keyword="about">
-      <entry keyword="Basic mapping"><topic href="tasks007.htm#sthref115" /></entry>
-    </entry>
-    <entry keyword="(See also mappings)"></entry>
-  </entry>
-  <entry keyword="classes">
-    <entry keyword="adding persistence to">
-      <entry keyword="Adding persistence to a class"><topic href="task_add_persistence.htm#sthref75" /></entry>
-    </entry>
-    <entry keyword="embeddable">
-      <entry keyword="Embeddable"><topic href="tasks005.htm#sthref85" /></entry>
-    </entry>
-    <entry keyword="entity">
-      <entry keyword="Entity"><topic href="tasks004.htm#sthref78" /></entry>
-    </entry>
-    <entry keyword="mapped superclass">
-      <entry keyword="Mapped superclass"><topic href="tasks006.htm#sthref91" /></entry>
-    </entry>
-    <entry keyword="synchronizing">
-      <entry keyword="Synchronizing classes"><topic href="tasks002.htm#sthref65" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="columns">
-    <entry keyword="discriminator">
-      <entry keyword="Specifying entity inheritance"><topic href="task_inheritance.htm#sthref104" /></entry>
-    </entry>
-    <entry keyword="join">
-      <entry keyword="Many-to-one mapping"><topic href="tasks012.htm#sthref138" /></entry>
-      <entry keyword="One-to-one mapping"><topic href="tasks014.htm#sthref148" /></entry>
-      <entry keyword="Join Table Information"><topic href="reference006.htm#sthref213" /></entry>
-      <entry keyword="Join Columns Information"><topic href="reference007.htm#sthref215" /></entry>
-    </entry>
-    <entry keyword="mapping to">
-      <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref199" /></entry>
-    </entry>
-    <entry keyword="value">
-      <entry keyword="Specifying entity inheritance"><topic href="task_inheritance.htm#sthref106" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="database tables">
-    <entry keyword="generating entities from">
-      <entry keyword="Generating entities from tables"><topic href="tasks017.htm#sthref162" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="database - persistence">
-    <entry keyword="connection">
-      <entry keyword="Project Properties page - JPA Options"><topic href="ref_project_properties.htm#sthref228" /></entry>
-    </entry>
-    <entry keyword="schema">
-      <entry keyword="Project Properties page - JPA Options"><topic href="ref_project_properties.htm#sthref230" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="developer documentation - Dali">
-    <entry keyword="Dali Developer Documentation"><topic href="reference017.htm#sthref240" /></entry>
-  </entry>
-  <entry keyword="eager fetch">
-    <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref201" /></entry>
-  </entry>
-  <entry keyword="embeddable class">
-    <entry keyword="@Embeddable">
-      <entry keyword="Embeddable"><topic href="tasks005.htm#sthref87" /></entry>
-    </entry>
-    <entry keyword="about">
-      <entry keyword="Embeddable"><topic href="tasks005.htm#sthref84" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="embedded ID mapping">
-    <entry keyword="@EmbeddedId">
-      <entry keyword="Embedded ID mapping"><topic href="tasks009.htm#sthref125" /></entry>
-    </entry>
-    <entry keyword="about">
-      <entry keyword="Embedded ID mapping"><topic href="tasks009.htm#sthref123" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="embedded mapping">
-    <entry keyword="@Embedded">
-      <entry keyword="Embedded mapping"><topic href="tasks008.htm#sthref121" /></entry>
-    </entry>
-    <entry keyword="about">
-      <entry keyword="Embedded mapping"><topic href="tasks008.htm#sthref119" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="entities">
-    <entry keyword="@Entity annotation">
-      <entry keyword="Entity"><topic href="tasks004.htm#sthref81" /></entry>
-    </entry>
-    <entry keyword="about">
-      <entry keyword="Understanding Java persistence"><topic href="concept_persistence.htm#sthref43" /></entry>
-    </entry>
-    <entry keyword="embeddable">
-      <entry keyword="Embeddable"><topic href="tasks005.htm#sthref88" /></entry>
-    </entry>
-    <entry keyword="from tables">
-      <entry keyword="Generating entities from tables"><topic href="tasks017.htm#sthref158" /></entry>
-      <entry keyword="Generate Entities from Tables dialog"><topic href="task_generate_entities.htm#sthref234" /></entry>
-    </entry>
-    <entry keyword="JPA Details view">
-      <entry keyword="JPA Details view (for entities)"><topic href="ref_persistence_prop_view.htm#sthref188" /></entry>
-    </entry>
-    <entry keyword="mapped superclass">
-      <entry keyword="Mapped superclass"><topic href="tasks006.htm#sthref94" /></entry>
-    </entry>
-    <entry keyword="mapping">
-      <entry keyword="Mapping an entity"><topic href="getting_started005.htm#sthref18" /></entry>
-    </entry>
-    <entry keyword="persistence">
-      <entry keyword="Creating a Java persistent entity"><topic href="getting_started004.htm#sthref10" /></entry>
-    </entry>
-    <entry keyword="persistent">
-      <entry keyword="Entity"><topic href="tasks004.htm#sthref76" /></entry>
-      <entry keyword="Entity"><topic href="tasks004.htm#sthref82" /></entry>
-    </entry>
-    <entry keyword="secondary tables">
-      <entry keyword="Secondary table information"><topic href="reference004.htm#sthref191" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="enumerated">
-    <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref207" /></entry>
-    <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref209" /></entry>
-  </entry>
-  <entry keyword="error messages - Dali">
-    <entry keyword="Validating mappings and reporting problems"><topic href="tasks018.htm#sthref163" /></entry>
-    <entry keyword="Error messages"><topic href="tasks019.htm#sthref168" /></entry>
-  </entry>
-  <entry keyword="extension points - Dali feature">
-    <entry keyword="Dali Developer Documentation"><topic href="reference017.htm#sthref242" /></entry>
-  </entry>
-  <entry keyword="fetch type">
-    <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref200" /></entry>
-  </entry>
-  <entry keyword="Generate Entities from Tables dialog">
-    <entry keyword="Generating entities from tables"><topic href="tasks017.htm#sthref161" /></entry>
-    <entry keyword="Generate Entities from Tables dialog"><topic href="task_generate_entities.htm#sthref233" /></entry>
-  </entry>
-  <entry keyword="generated values">
-    <entry keyword="ID mappings">
-      <entry keyword="Primary Key Generation information"><topic href="ref_primary_key.htm#sthref218" /></entry>
-    </entry>
-    <entry keyword="sequence">
-      <entry keyword="Primary Key Generation information"><topic href="ref_primary_key.htm#sthref220" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="ID mapping">
-    <entry keyword="@Id">
-      <entry keyword="ID mapping"><topic href="tasks010.htm#sthref129" /></entry>
-    </entry>
-    <entry keyword="about">
-      <entry keyword="ID mapping"><topic href="tasks010.htm#sthref127" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="inheritance">
-    <entry keyword="entity">
-      <entry keyword="Specifying additional tables"><topic href="task_additonal_tables.htm#sthref97" /></entry>
-      <entry keyword="Specifying entity inheritance"><topic href="task_inheritance.htm#sthref100" /></entry>
-      <entry keyword="Inheritance information"><topic href="reference005.htm#sthref194" /></entry>
-    </entry>
-    <entry keyword="joined tables">
-      <entry keyword="Specifying entity inheritance"><topic href="task_inheritance.htm#sthref112" /></entry>
-    </entry>
-    <entry keyword="single table">
-      <entry keyword="Specifying entity inheritance"><topic href="task_inheritance.htm#sthref107" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="Inheritance - in Java Details view">
-    <entry keyword="Inheritance information"><topic href="reference005.htm#sthref193" /></entry>
-  </entry>
-  <entry keyword="installation - Dali">
-    <entry keyword="Requirements and installation"><topic href="getting_started001.htm#sthref3" /></entry>
-  </entry>
-  <entry keyword="joined tables - inheritance">
-    <entry keyword="Specifying entity inheritance"><topic href="task_inheritance.htm#sthref113" /></entry>
-  </entry>
-  <entry keyword="JPA Details view">
-    <entry keyword="attributes">
-      <entry keyword="JPA Details view (for attributes)"><topic href="ref_persistence_map_view.htm#sthref195" /></entry>
-    </entry>
-    <entry keyword="entities">
-      <entry keyword="JPA Details view (for entities)"><topic href="ref_persistence_prop_view.htm#sthref186" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="JPA Development perspective">
-    <entry keyword="JPA Development perspective"><topic href="ref_persistence_perspective.htm#sthref236" /></entry>
-  </entry>
-  <entry keyword="JPA Facet dialog">
-    <entry keyword="Creating a new JPA project"><topic href="task_create_new_project.htm#sthref56" /></entry>
-  </entry>
-  <entry keyword="JPA project">
-    <entry keyword="creating new">
-      <entry keyword="Creating a new JPA project"><topic href="task_create_new_project.htm#sthref50" /></entry>
-    </entry>
-    <entry keyword="platform">
-      <entry keyword="Project Properties page - JPA Options"><topic href="ref_project_properties.htm#sthref227" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="JPA Project dialog">
-    <entry keyword="Creating a new JPA project"><topic href="task_create_new_project.htm#sthref54" /></entry>
-  </entry>
-  <entry keyword="JPA Structure view">
-    <entry keyword="JPA Structure view"><topic href="ref_persistence_outline.htm#sthref222" /></entry>
-  </entry>
-  <entry keyword="lazy fetch">
-    <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref202" /></entry>
-  </entry>
-  <entry keyword="many-to-many mapping">
-    <entry keyword="@ManyToMany">
-      <entry keyword="Many-to-many mapping"><topic href="tasks011.htm#sthref133" /></entry>
-    </entry>
-    <entry keyword="about">
-      <entry keyword="Many-to-many mapping"><topic href="tasks011.htm#sthref131" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="many-to-one mapping">
-    <entry keyword="@ManyToOne">
-      <entry keyword="Many-to-one mapping"><topic href="tasks012.htm#sthref136" /></entry>
-    </entry>
-    <entry keyword="about">
-      <entry keyword="Many-to-one mapping"><topic href="tasks012.htm#sthref135" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="mapped superclass">
-    <entry keyword="@MappedSuperclass">
-      <entry keyword="Mapped superclass"><topic href="tasks006.htm#sthref92" /></entry>
-    </entry>
-    <entry keyword="about">
-      <entry keyword="Mapped superclass"><topic href="tasks006.htm#sthref90" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="mapping entities">
-    <entry keyword="Mapping an entity"><topic href="getting_started005.htm#sthref17" /></entry>
-  </entry>
-  <entry keyword="mappings">
-    <entry keyword="about">
-      <entry keyword="Understanding OR mappings"><topic href="concept_mapping.htm#sthref45" /></entry>
-    </entry>
-    <entry keyword="basic">
-      <entry keyword="Basic mapping"><topic href="tasks007.htm#sthref114" /></entry>
-    </entry>
-    <entry keyword="embedded">
-      <entry keyword="Embedded mapping"><topic href="tasks008.htm#sthref118" /></entry>
-    </entry>
-    <entry keyword="embedded ID">
-      <entry keyword="Embedded ID mapping"><topic href="tasks009.htm#sthref122" /></entry>
-    </entry>
-    <entry keyword="ID">
-      <entry keyword="ID mapping"><topic href="tasks010.htm#sthref126" /></entry>
-    </entry>
-    <entry keyword="many-to-many">
-      <entry keyword="Many-to-many mapping"><topic href="tasks011.htm#sthref130" /></entry>
-    </entry>
-    <entry keyword="many-to-one">
-      <entry keyword="Many-to-one mapping"><topic href="tasks012.htm#sthref134" /></entry>
-    </entry>
-    <entry keyword="one-to-many">
-      <entry keyword="One-to-many mapping"><topic href="tasks013.htm#sthref140" /></entry>
-    </entry>
-    <entry keyword="one-to-one">
-      <entry keyword="One-to-one mapping"><topic href="tasks014.htm#sthref144" /></entry>
-    </entry>
-    <entry keyword="problems">
-      <entry keyword="Validating mappings and reporting problems"><topic href="tasks018.htm#sthref166" /></entry>
-    </entry>
-    <entry keyword="transient">
-      <entry keyword="Transient mapping"><topic href="tasks015.htm#sthref150" /></entry>
-    </entry>
-    <entry keyword="version">
-      <entry keyword="Version mapping"><topic href="tasks016.htm#sthref154" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="New JPA Project wizard">
-    <entry keyword="Creating a new JPA project"><topic href="task_create_new_project.htm#sthref52" /></entry>
-  </entry>
-  <entry keyword="nonpersistent">
-    <entry keyword="classes">
-      <entry keyword="Adding persistence to a class"><topic href="task_add_persistence.htm#sthref74" /></entry>
-    </entry>
-    <entry keyword="fields. See transient"></entry>
-  </entry>
-  <entry keyword="one-to-many mapping">
-    <entry keyword="@OneToMany">
-      <entry keyword="One-to-many mapping"><topic href="tasks013.htm#sthref143" /></entry>
-    </entry>
-    <entry keyword="about">
-      <entry keyword="One-to-many mapping"><topic href="tasks013.htm#sthref141" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="one-to-one mapping">
-    <entry keyword="@OneToOne">
-      <entry keyword="One-to-one mapping"><topic href="tasks014.htm#sthref147" /></entry>
-    </entry>
-    <entry keyword="about">
-      <entry keyword="One-to-one mapping"><topic href="tasks014.htm#sthref145" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="@OrderBy">
-    <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref212" /></entry>
-  </entry>
-  <entry keyword="ordering">
-    <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref210" /></entry>
-  </entry>
-  <entry keyword="orm.xml file">
-    <entry keyword="about">
-      <entry keyword="The orm.xml file"><topic href="concepts003.htm#sthref47" /></entry>
-    </entry>
-    <entry keyword="managing">
-      <entry keyword="Managing the orm.xml file"><topic href="task_manage_orm.htm#sthref68" /></entry>
-    </entry>
-    <entry keyword="sample">
-      <entry keyword="Managing the orm.xml file"><topic href="task_manage_orm.htm#sthref69" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="persistence">
-    <entry keyword="about">
-      <entry keyword="Understanding Java persistence"><topic href="concept_persistence.htm#sthref42" /></entry>
-    </entry>
-    <entry keyword="database connection">
-      <entry keyword="Project Properties page - JPA Options"><topic href="ref_project_properties.htm#sthref229" /></entry>
-    </entry>
-    <entry keyword="database schema">
-      <entry keyword="Project Properties page - JPA Options"><topic href="ref_project_properties.htm#sthref232" /></entry>
-    </entry>
-    <entry keyword="entity class">
-      <entry keyword="Adding persistence to a class"><topic href="task_add_persistence.htm#sthref73" /></entry>
-    </entry>
-    <entry keyword="options">
-      <entry keyword="Project Properties page - JPA Options"><topic href="ref_project_properties.htm#sthref224" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="Persistence XML Editor">
-    <entry keyword="Working with persistence.xml file"><topic href="tasks001.htm#sthref62" /></entry>
-  </entry>
-  <entry keyword="persistence.xml file">
-    <entry keyword="about">
-      <entry keyword="The persistence.xml file"><topic href="concepts002.htm#sthref46" /></entry>
-    </entry>
-    <entry keyword="editor">
-      <entry keyword="Working with persistence.xml file"><topic href="tasks001.htm#sthref63" /></entry>
-    </entry>
-    <entry keyword="managing">
-      <entry keyword="Managing the persistence.xml file"><topic href="task_manage_persistence.htm#sthref57" /></entry>
-      <entry keyword="Working with persistence.xml file"><topic href="tasks001.htm#sthref60" /></entry>
-      <entry keyword="Working with orm.xml file"><topic href="tasks003.htm#sthref71" /></entry>
-    </entry>
-    <entry keyword="sample">
-      <entry keyword="Managing the persistence.xml file"><topic href="task_manage_persistence.htm#sthref58" /></entry>
-    </entry>
-    <entry keyword="synchronizing with classes">
-      <entry keyword="Synchronizing classes"><topic href="tasks002.htm#sthref66" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="persistent entity">
-    <entry keyword="Entity"><topic href="tasks004.htm#sthref77" /></entry>
-  </entry>
-  <entry keyword="perspective - JPA Development">
-    <entry keyword="JPA Development perspective"><topic href="ref_persistence_perspective.htm#sthref237" /></entry>
-  </entry>
-  <entry keyword="platform - JPA">
-    <entry keyword="Project Properties page - JPA Options"><topic href="ref_project_properties.htm#sthref226" /></entry>
-  </entry>
-  <entry keyword="problems">
-    <entry keyword="Validating mappings and reporting problems"><topic href="tasks018.htm#sthref165" /></entry>
-  </entry>
-  <entry keyword="projects - JPA">
-    <entry keyword="creating new">
-      <entry keyword="Creating a new project"><topic href="getting_started003.htm#sthref6" /></entry>
-      <entry keyword="Creating a new JPA project"><topic href="task_create_new_project.htm#sthref49" /></entry>
-    </entry>
-    <entry keyword="options">
-      <entry keyword="Project Properties page - JPA Options"><topic href="ref_project_properties.htm#sthref225" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="quick start - Dali">
-    <entry keyword="Dali quick start"><topic href="getting_started002.htm#sthref5" /></entry>
-  </entry>
-  <entry keyword="requirements">
-    <entry keyword="Dali Java Persistence Tools">
-      <entry keyword="Requirements and installation"><topic href="getting_started001.htm#sthref4" /></entry>
-    </entry>
-    <entry keyword="persistent entities">
-      <entry keyword="Entity"><topic href="tasks004.htm#sthref79" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="schema - database">
-    <entry keyword="Project Properties page - JPA Options"><topic href="ref_project_properties.htm#sthref231" /></entry>
-  </entry>
-  <entry keyword="secondary tables">
-    <entry keyword="Secondary table information"><topic href="reference004.htm#sthref189" /></entry>
-  </entry>
-  <entry keyword="Secondary Tables - in Java Details view">
-    <entry keyword="Secondary table information"><topic href="reference004.htm#sthref192" /></entry>
-  </entry>
-  <entry keyword="single table inheritance">
-    <entry keyword="Specifying entity inheritance"><topic href="task_inheritance.htm#sthref108" /></entry>
-  </entry>
-  <entry keyword="superclass">
-    <entry keyword="Mapped superclass"><topic href="tasks006.htm#sthref95" /></entry>
-  </entry>
-  <entry keyword="tables">
-    <entry keyword="creating entities from">
-      <entry keyword="Generating entities from tables"><topic href="tasks017.htm#sthref159" /></entry>
-      <entry keyword="Generate Entities from Tables dialog"><topic href="task_generate_entities.htm#sthref235" /></entry>
-    </entry>
-    <entry keyword="inheritance">
-      <entry keyword="Specifying entity inheritance"><topic href="task_inheritance.htm#sthref109" /></entry>
-    </entry>
-    <entry keyword="secondary">
-      <entry keyword="Secondary table information"><topic href="reference004.htm#sthref190" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="temporal">
-    <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref204" /></entry>
-    <entry keyword="General information"><topic href="ref_mapping_general.htm#sthref206" /></entry>
-  </entry>
-  <entry keyword="transient mapping">
-    <entry keyword="@Transient">
-      <entry keyword="Transient mapping"><topic href="tasks015.htm#sthref153" /></entry>
-    </entry>
-    <entry keyword="about">
-      <entry keyword="Transient mapping"><topic href="tasks015.htm#sthref151" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="tutorial - Dali">
-    <entry keyword="Dali basic tutorial"><topic href="getting_started006.htm#sthref21" /></entry>
-  </entry>
-  <entry keyword="version mapping">
-    <entry keyword="@Version">
-      <entry keyword="Version mapping"><topic href="tasks016.htm#sthref157" /></entry>
-    </entry>
-    <entry keyword="about">
-      <entry keyword="Version mapping"><topic href="tasks016.htm#sthref155" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="views">
-    <entry keyword="JPA Details view">
-      <entry keyword="JPA Details view (for entities)"><topic href="ref_persistence_prop_view.htm#sthref187" /></entry>
-      <entry keyword="JPA Details view (for attributes)"><topic href="ref_persistence_map_view.htm#sthref196" /></entry>
-    </entry>
-    <entry keyword="JPA Structure view">
-      <entry keyword="JPA Structure view"><topic href="ref_persistence_outline.htm#sthref221" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="warning messages - Dali">
-    <entry keyword="Validating mappings and reporting problems"><topic href="tasks018.htm#sthref164" /></entry>
-  </entry>
-  <entry keyword="wizards">
-    <entry keyword="New JPA Project wizard">
-      <entry keyword="Creating a new JPA project"><topic href="task_create_new_project.htm#sthref51" /></entry>
-    </entry>
-  </entry>
-  <entry keyword="XML editor">
-    <entry keyword="Working with persistence.xml file"><topic href="tasks001.htm#sthref59" /></entry>
-    <entry keyword="Working with orm.xml file"><topic href="tasks003.htm#sthref70" /></entry>
-  </entry>
-</index>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/legal.htm b/jpa/plugins/org.eclipse.jpt.doc.user/legal.htm
deleted file mode 100644
index 12d8b69..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/legal.htm
+++ /dev/null
@@ -1,45 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:59 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Legal</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content=" Legal" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="sthref248" name="sthref248"></a></p>
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Legal</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref249" name="sthref249"></a></p>
-<p class="subhead2">Notices</p>
-<p>The material in this guide is copyright &copy; 2006, 2007 by Oracle.</p>
-<p><a href="about.htm">Terms and conditions regarding the use of this guide.</a></p>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/plugin.properties b/jpa/plugins/org.eclipse.jpt.doc.user/plugin.properties
deleted file mode 100644
index 8565495..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/plugin.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 Oracle.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle. - initial API and implementation
-###############################################################################
-# ====================================================================
-# To code developer:
-#   Do NOT change the properties between this line and the
-#   "%%% END OF TRANSLATED PROPERTIES %%%" line.
-#   Make a new property name, append to the end of the file and change
-#   the code to use the new property.
-# ====================================================================
-
-# ====================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# ====================================================================
-
-pluginName = Java Persistence Documentation - Doc
-providerName = Eclipse.org
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/plugin.xml b/jpa/plugins/org.eclipse.jpt.doc.user/plugin.xml
deleted file mode 100644
index a267bbc..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/plugin.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-	<!-- =========== -->
-	<!-- Define TOC  -->
-	<!-- =========== -->
-	<extension point="org.eclipse.help.toc">
-		<toc file="toc.xml" primary="true"/>
-	</extension>
-	<!-- =========== -->
-	<!-- Define F1   -->
-	<!-- =========== -->
-	<extension point="org.eclipse.help.contexts">
-		<contexts file="contexts.xml" plugin="org.eclipse.jpt.ui"/>
-	</extension>
-	<!-- ==================== -->
-	<!-- Define Keyword Index -->
-	<!-- ==================== -->
-	<extension point="org.eclipse.help.index">
-		<index file="index.xml"/>
-	</extension>
-	<!-- =========== -->
-	<!-- Cheatsheets -->
-	<!-- =========== -->
-	<extension point="org.eclipse.ui.cheatsheets.cheatSheetContent">
-		<category name="JPA Development" id="com.jpa.category"/>
-		<cheatsheet name="Create a JPA project" category="com.jpa.category" contentFile="$nl$/cheatsheets/add_persistence.xml" id="org.eclipse.jpa.cheatsheet.createproject1">
-			<description>This cheat sheet helps you create a JPA project.</description>
-		</cheatsheet>
-		<cheatsheet name="Create a persistent entity" category="com.jpa.category" contentFile="$nl$/cheatsheets/create_entity.xml" id="org.eclipse.jpa.cheatsheet.addentity">
-			<description>This cheat sheet helps you create a Java persistent entity.</description>
-		</cheatsheet>
-		<cheatsheet name="Map a persistent entity" category="com.jpa.category" contentFile="$nl$/cheatsheets/map_entity.xml" id="org.eclipse.jpa.cheatsheet.mapentity">
-			<description>This cheat sheet helps you map the a Java persistent entity to a database table.</description>
-		</cheatsheet>
-	</extension>
-</plugin>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/ref_details_orm.htm b/jpa/plugins/org.eclipse.jpt.doc.user/ref_details_orm.htm
deleted file mode 100644
index 32768d4..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/ref_details_orm.htm
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>JPA Details view (for orm.xml)</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="JPA Details view (for orm.xml)" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACGDGHC" name="CACGDGHC"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>JPA Details view (for orm.xml)</h1>
-</td>
-</tr>
-</table>
-<p>The <span class="gui-object-title">JPA Details</span> view displays the default mapping and persistence information for the project and contains the following areas:</p>
-<ul>
-<li type="disc">
-<p><a href="reference008.htm#CACCACGH">General information</a></p>
-</li>
-<li type="disc">
-<p><a href="reference009.htm#CACEAGBG">Persistence Unit information</a></p>
-</li>
-</ul>
-<p>These defaults can be overridden by the settings on a specific entity or mapping.</p>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/ref_jpa_facet.htm b/jpa/plugins/org.eclipse.jpt.doc.user/ref_jpa_facet.htm
deleted file mode 100644
index bdfd5fd..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/ref_jpa_facet.htm
+++ /dev/null
@@ -1,91 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>JPA Facet page</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="JPA Facet page" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACIFDIF" name="CACIFDIF"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>JPA Facet page</h1>
-</td>
-</tr>
-</table>
-<p>This table lists the properties available on the JPA Facet page of the <a href="ref_new_jpa_project_wizard.htm#CACBJGBG">Create New JPA Project wizard</a>.</p>
-<div class="inftblinformal">
-<table class="Informal" title="This table describes the options on the Generate DDL - Objects page." summary="This table describes the options on the Generate DDL - Objects page." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t3">Property</th>
-<th align="left" valign="bottom" id="r1c2-t3">Description</th>
-<th align="left" valign="bottom" id="r1c3-t3">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t3" headers="r1c1-t3">Platform</td>
-<td align="left" headers="r2c1-t3 r1c2-t3">Vendor-specific JPA implementation.</td>
-<td align="left" headers="r2c1-t3 r1c3-t3">Generic</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t3" headers="r1c1-t3">Connection</td>
-<td align="left" headers="r3c1-t3 r1c2-t3">Select the database connection to use with the project. Dali requires an active database connection to use and validate the persistent entities and mappings.
-<p>Click <span class="bold">Add connection</span> to create a new database connection.</p>
-</td>
-<td align="left" headers="r3c1-t3 r1c3-t3"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t3" headers="r1c1-t3">JPA Implementation</td>
-<td align="left" headers="r4c1-t3 r1c2-t3">Select to use the <span class="bold">JPA implementation provided by the server at runtime</span>, or select a specific <span class="bold">implementation library</span> that contain the Java Persistence API (JPA) and entities to be added to the project's Java Build Path.
-<p>Click <span class="bold">Configure default JPA implementation library</span> to create a default library for the project or click <span class="bold">Configure user libraries</span> to define additional libraries.</p>
-</td>
-<td align="left" headers="r4c1-t3 r1c3-t3">Determined by server.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t3" headers="r1c1-t3">Persistent class management</td>
-<td align="left" headers="r5c1-t3 r1c2-t3">Specify if Dali will <span class="bold">discover annotated classes automatically</span>, or if the <span class="bold">annotated classes must be listed in the persistence.xml</span> file.
-<p><span class="bold">Note</span>: To insure application portability, you should explicitly list the managed persistence classes that are included in the persistence unit.</p>
-</td>
-<td align="left" headers="r5c1-t3 r1c3-t3">Determined by server.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r6c1-t3" headers="r1c1-t3">Create orm.xml</td>
-<td align="left" headers="r6c1-t3 r1c2-t3">Specify if Dali should create a default <code>orm.xml</code> file for your entity mappings and persistence unit defaults.</td>
-<td align="left" headers="r6c1-t3 r1c3-t3">Selected</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblinformal" --></div>
-<!-- class="sect3" -->
-<!-- class="sect2" -->
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/ref_mapping_general.htm b/jpa/plugins/org.eclipse.jpt.doc.user/ref_mapping_general.htm
deleted file mode 100644
index a14d1e4..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/ref_mapping_general.htm
+++ /dev/null
@@ -1,213 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>General information</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="General information" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACBHFIJ" name="CACBHFIJ"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>General information</h1>
-</td>
-</tr>
-</table>
-<p>This table lists the General properties available in the <span class="gui-object-title">Java Details view</span> for each mapping type.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table describes the options on the Persistence Properties view." summary="This table describes the options on the Persistence Properties view." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t6">Property</th>
-<th align="left" valign="bottom" id="r1c2-t6">Description</th>
-<th align="left" valign="bottom" id="r1c3-t6">Default</th>
-<th align="left" valign="bottom" id="r1c4-t6">Available for Mapping Type</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t6" headers="r1c1-t6">Map As</td>
-<td align="left" headers="r2c1-t6 r1c2-t6">Define the mapping type for the attribute</td>
-<td align="left" headers="r2c1-t6 r1c3-t6">Basic</td>
-<td align="left" headers="r2c1-t6 r1c4-t6">All mapping types</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t6" headers="r1c1-t6"><a id="CACGCBHB" name="CACGCBHB"></a>Column</td>
-<td align="left" headers="r3c1-t6 r1c2-t6"><a id="sthref198" name="sthref198"></a><a id="sthref199" name="sthref199"></a>The database column that contains the value for the attribute. This field corresponds to the <code>@Column</code> annotation.</td>
-<td align="left" headers="r3c1-t6 r1c3-t6">By default, the Column is assumed to be named identically to the attribute.</td>
-<td align="left" headers="r3c1-t6 r1c4-t6"><a href="tasks007.htm#BABBABCE">Basic mapping</a>, <a href="tasks008.htm#BABCBHDF">Embedded mapping</a>, <a href="tasks010.htm#BABGCBHG">ID mapping</a>, <a href="tasks016.htm#BABHIBII">Version mapping</a></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t6" headers="r1c1-t6">&nbsp;&nbsp;Name</td>
-<td align="left" headers="r4c1-t6 r1c2-t6">Name of the database column.
-<p>This field corresponds to the <code>@Column</code> annotation.</p>
-</td>
-<td align="left" headers="r4c1-t6 r1c3-t6"><br /></td>
-<td align="left" headers="r4c1-t6 r1c4-t6"><a href="tasks007.htm#BABBABCE">Basic mapping</a>, <a href="tasks008.htm#BABCBHDF">Embedded mapping</a>, <a href="tasks010.htm#BABGCBHG">ID mapping</a></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t6" headers="r1c1-t6">&nbsp;&nbsp;Table</td>
-<td align="left" headers="r5c1-t6 r1c2-t6">Name of the database table that contains the selected column.</td>
-<td align="left" headers="r5c1-t6 r1c3-t6"><br /></td>
-<td align="left" headers="r5c1-t6 r1c4-t6"><a href="tasks007.htm#BABBABCE">Basic mapping</a>, <a href="tasks008.htm#BABCBHDF">Embedded mapping</a>, <a href="tasks010.htm#BABGCBHG">ID mapping</a></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r6c1-t6" headers="r1c1-t6"><a id="CACGGGHB" name="CACGGGHB"></a><a id="sthref200" name="sthref200"></a><a id="sthref201" name="sthref201"></a><a id="sthref202" name="sthref202"></a>Fetch Type</td>
-<td align="left" headers="r6c1-t6 r1c2-t6">Defines how data is loaded from the database:
-<ul>
-<li type="disc">
-<p>Eager - Data is loaded in before it is actually needed.</p>
-</li>
-<li type="disc">
-<p>Lazy - Data is loaded only when required by the transaction.</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r6c1-t6 r1c3-t6">Eager</td>
-<td align="left" headers="r6c1-t6 r1c4-t6"><a href="tasks007.htm#BABBABCE">Basic mapping</a>, <a href="tasks014.htm#BABFHBCJ">One-to-one mapping</a></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r7c1-t6" headers="r1c1-t6">Optional</td>
-<td align="left" headers="r7c1-t6 r1c2-t6">Specifies if this field is can be null.</td>
-<td align="left" headers="r7c1-t6 r1c3-t6">Yes</td>
-<td align="left" headers="r7c1-t6 r1c4-t6"><a href="tasks007.htm#BABBABCE">Basic mapping</a>, <a href="tasks014.htm#BABFHBCJ">One-to-one mapping</a></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r8c1-t6" headers="r1c1-t6"><a id="CACBBIBI" name="CACBBIBI"></a><a id="sthref203" name="sthref203"></a>Lob</td>
-<td align="left" headers="r8c1-t6 r1c2-t6">Specify if the field is mapped to <code>java.sql.Clob</code> or <code>java.sql.Blob</code>.
-<p>This field corresponds to the <code>@Lob</code> annotation.</p>
-</td>
-<td align="left" headers="r8c1-t6 r1c3-t6"><br /></td>
-<td align="left" headers="r8c1-t6 r1c4-t6"><a href="tasks007.htm#BABBABCE">Basic mapping</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r9c1-t6" headers="r1c1-t6"><a id="CACEAJGD" name="CACEAJGD"></a><a id="sthref204" name="sthref204"></a><a id="sthref205" name="sthref205"></a><a id="sthref206" name="sthref206"></a>Temporal</td>
-<td align="left" headers="r9c1-t6 r1c2-t6">Specifies if this field is one of the following:
-<ul>
-<li type="disc">
-<p>Date - <code>java.sql.Date</code></p>
-</li>
-<li type="disc">
-<p>Time - <code>java.sql.Time</code></p>
-</li>
-<li type="disc">
-<p>Timestamp - <code>java.sql.Timestamp</code></p>
-</li>
-</ul>
-<p>This field corresponds to the <code>@Temporal</code> annotation.</p>
-</td>
-<td align="left" headers="r9c1-t6 r1c3-t6"><br /></td>
-<td align="left" headers="r9c1-t6 r1c4-t6"><a href="tasks007.htm#BABBABCE">Basic mapping</a>, <a href="tasks010.htm#BABGCBHG">ID mapping</a></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r10c1-t6" headers="r1c1-t6"><a id="sthref207" name="sthref207"></a><a id="sthref208" name="sthref208"></a><a id="sthref209" name="sthref209"></a>Enumerated</td>
-<td align="left" headers="r10c1-t6 r1c2-t6">Specify how to persist enumerated constraints if the <code>String</code> value suits your application requirements or to match an existing database schema.
-<ul>
-<li type="disc">
-<p>ordinal</p>
-</li>
-<li type="disc">
-<p><code>String</code></p>
-</li>
-</ul>
-<p>This field corresponds to the <code>@Enumerated</code> annotation.</p>
-</td>
-<td align="left" headers="r10c1-t6 r1c3-t6">Ordinal</td>
-<td align="left" headers="r10c1-t6 r1c4-t6"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r11c1-t6" headers="r1c1-t6">Target Entity</td>
-<td align="left" headers="r11c1-t6 r1c2-t6">The persistent entity to which the attribute is mapped.</td>
-<td align="left" headers="r11c1-t6 r1c3-t6"><br /></td>
-<td align="left" headers="r11c1-t6 r1c4-t6"><a href="tasks014.htm#BABFHBCJ">One-to-one mapping</a>,, <a href="tasks013.htm#BABHGEBD">One-to-many mapping</a> <a href="tasks011.htm#BABEIEGD">Many-to-many mapping</a>, <a href="tasks012.htm#BABHFAFJ">Many-to-one mapping</a></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r12c1-t6" headers="r1c1-t6"><a id="CACJAIHB" name="CACJAIHB"></a>Cascade Type</td>
-<td align="left" headers="r12c1-t6 r1c2-t6">Specify which operations are propagated throughout the entity.
-<ul>
-<li type="disc">
-<p>All - All operations</p>
-</li>
-<li type="disc">
-<p>Persist</p>
-</li>
-<li type="disc">
-<p>Merge</p>
-</li>
-<li type="disc">
-<p>Move</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r12c1-t6 r1c3-t6"><br /></td>
-<td align="left" headers="r12c1-t6 r1c4-t6"><a href="tasks014.htm#BABFHBCJ">One-to-one mapping</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r13c1-t6" headers="r1c1-t6"><a id="CACJDJJA" name="CACJDJJA"></a>Mapped By</td>
-<td align="left" headers="r13c1-t6 r1c2-t6">The field in the database table that "owns" the relationship. This field is required only on the non-owning side of the relationship.</td>
-<td align="left" headers="r13c1-t6 r1c3-t6"><br /></td>
-<td align="left" headers="r13c1-t6 r1c4-t6"><a href="tasks014.htm#BABFHBCJ">One-to-one mapping</a>, <a href="tasks013.htm#BABHGEBD">One-to-many mapping</a></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r14c1-t6" headers="r1c1-t6"><a id="CACDADIH" name="CACDADIH"></a><a id="sthref210" name="sthref210"></a><a id="sthref211" name="sthref211"></a><a id="sthref212" name="sthref212"></a>Order By</td>
-<td align="left" headers="r14c1-t6 r1c2-t6">Specify the default order for objects returned from a query:
-<ul>
-<li type="disc">
-<p>No ordering</p>
-</li>
-<li type="disc">
-<p>Primary key</p>
-</li>
-<li type="disc">
-<p>Custom ordering</p>
-</li>
-</ul>
-<p>This field corresponds to the <code>@OrderBy</code> annotation.</p>
-</td>
-<td align="left" headers="r14c1-t6 r1c3-t6">Primary key</td>
-<td align="left" headers="r14c1-t6 r1c4-t6"><a href="tasks013.htm#BABHGEBD">One-to-many mapping</a>. <a href="tasks011.htm#BABEIEGD">Many-to-many mapping</a>, <a href="tasks012.htm#BABHFAFJ">Many-to-one mapping</a></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r15c1-t6" headers="r1c1-t6">Attribute Overrides</td>
-<td align="left" headers="r15c1-t6 r1c2-t6">Overrides Basic mappings of a mapped superclass. (for example, if the inherited column name is incompatible with a pre-existing data model, or invalid as a column name in your database).</td>
-<td align="left" headers="r15c1-t6 r1c3-t6"><br /></td>
-<td align="left" headers="r15c1-t6 r1c4-t6"><a href="tasks008.htm#BABCBHDF">Embedded mapping</a>
-<p><a href="tasks008.htm#BABCBHDF">Embedded mapping</a></p>
-<br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" -->
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a></div>
-<!-- class="sect3" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/ref_new_jpa_project.htm b/jpa/plugins/org.eclipse.jpt.doc.user/ref_new_jpa_project.htm
deleted file mode 100644
index be37cfa..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/ref_new_jpa_project.htm
+++ /dev/null
@@ -1,91 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>New JPA Project page</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="New JPA Project page" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACBJAGC" name="CACBJAGC"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>New JPA Project page</h1>
-</td>
-</tr>
-</table>
-<p>This table lists the properties available on the New JPA Project page of the <a href="ref_new_jpa_project_wizard.htm#CACBJGBG">Create New JPA Project wizard</a>.</p>
-<div class="inftblinformal">
-<table class="Informal" title="This table describes the options on the Generate DDL - Objects page." summary="This table describes the options on the Generate DDL - Objects page." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t2">Property</th>
-<th align="left" valign="bottom" id="r1c2-t2">Description</th>
-<th align="left" valign="bottom" id="r1c3-t2">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t2" headers="r1c1-t2">Project name</td>
-<td align="left" headers="r2c1-t2 r1c2-t2">Name of the Eclipse JPA project.</td>
-<td align="left" headers="r2c1-t2 r1c3-t2"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t2" headers="r1c1-t2">Project contents</td>
-<td align="left" headers="r3c1-t2 r1c2-t2">Location of the workspace in which to save the project.
-<p>Unselect The <span class="bold">Use Default</span> option and click <span class="bold">Browse</span> to select a new location.</p>
-</td>
-<td align="left" headers="r3c1-t2 r1c3-t2">Current workspace</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t2" headers="r1c1-t2">Target runtime</td>
-<td align="left" headers="r4c1-t2 r1c2-t2">Select a pre-defined target for the project.
-<p>Click <span class="bold">New</span> to create a new environment with the New Server Runtime wizard.</p>
-</td>
-<td align="left" headers="r4c1-t2 r1c3-t2"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t2" headers="r1c1-t2">Configurations</td>
-<td align="left" headers="r5c1-t2 r1c2-t2">Select a project configuration with pre-defined facets.
-<p>Select <span class="bold">&lt;custom&gt;</span> to manually select the facets for this project.</p>
-</td>
-<td align="left" headers="r5c1-t2 r1c3-t2">Utility JPA project with Java 5.0</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r6c1-t2" headers="r1c1-t2">EAR membership</td>
-<td align="left" headers="r6c1-t2 r1c2-t2">Specify if this project should be included in an EAR file for deployment.
-<p>Select the <span class="bold">EAR Project Name</span>, or click <span class="bold">New</span> to create a new EAR project.</p>
-</td>
-<td align="left" headers="r6c1-t2 r1c3-t2"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblinformal" --></div>
-<!-- class="sect3" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/ref_new_jpa_project_wizard.htm b/jpa/plugins/org.eclipse.jpt.doc.user/ref_new_jpa_project_wizard.htm
deleted file mode 100644
index 4fcec9c..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/ref_new_jpa_project_wizard.htm
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Create New JPA Project wizard</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Create New JPA Project wizard" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACBJGBG" name="CACBJGBG"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Create New JPA Project wizard</h1>
-</td>
-</tr>
-</table>
-<p>The Create New JPA Project wizard allows you to create a new Java project using JPA. The wizard consists of the following pages:</p>
-<ul>
-<li type="disc">
-<p><a href="ref_new_jpa_project.htm#CACBJAGC">New JPA Project page</a></p>
-</li>
-<li type="disc">
-<p>Project Facets page</p>
-</li>
-<li type="disc">
-<p><a href="ref_jpa_facet.htm#CACIFDIF">JPA Facet page</a></p>
-</li>
-</ul>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/ref_persistence_map_view.htm b/jpa/plugins/org.eclipse.jpt.doc.user/ref_persistence_map_view.htm
deleted file mode 100644
index b93ae33..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/ref_persistence_map_view.htm
+++ /dev/null
@@ -1,57 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>JPA Details view (for attributes)</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="JPA Details view (for attributes)" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABIFBAF" name="BABIFBAF"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>JPA Details view (for attributes)</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref195" name="sthref195"></a><a id="sthref196" name="sthref196"></a><a id="sthref197" name="sthref197"></a>The <span class="gui-object-title">JPA Details</span> view displays the persistence information for the currently selected mapped attribute and contains the following areas:</p>
-<ul>
-<li type="disc">
-<p><a href="ref_mapping_general.htm#CACBHFIJ">General information</a></p>
-</li>
-<li type="disc">
-<p><a href="reference006.htm#CACBAEBC">Join Table Information</a></p>
-</li>
-<li type="disc">
-<p><a href="reference007.htm#CACFCEJC">Join Columns Information</a></p>
-</li>
-<li type="disc">
-<p><a href="ref_primary_key.htm#CACFCCAB">Primary Key Generation information</a></p>
-</li>
-</ul>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/ref_persistence_outline.htm b/jpa/plugins/org.eclipse.jpt.doc.user/ref_persistence_outline.htm
deleted file mode 100644
index 92cc34d..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/ref_persistence_outline.htm
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>JPA Structure view</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="JPA Structure view" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABEGGFE" name="BABEGGFE"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>JPA Structure view</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref221" name="sthref221"></a><a id="sthref222" name="sthref222"></a>The <span class="gui-object-title">JPA Structure</span> view displays an outline of the structure (its attributes and mappings) of the entity that is currently selected or opened in the editor. The structural elements shown in the outline are the entity and its fields.</p>
-<div class="figure"><a id="sthref223" name="sthref223"></a>
-<p class="titleinfigure">Sample JPA Structure View</p>
-<img src="img/persistence_outline_view.png" alt="Sample JPA Structure view for an entity." title="Sample JPA Structure view for an entity." /><br /></div>
-<!-- class="figure" -->
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_perspective.htm#BABIFBDB">JPA Development perspective</a>
-<p>&nbsp;</p>
-</div>
-<!-- class="sect2" -->
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/ref_persistence_perspective.htm b/jpa/plugins/org.eclipse.jpt.doc.user/ref_persistence_perspective.htm
deleted file mode 100644
index 1dbc792..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/ref_persistence_perspective.htm
+++ /dev/null
@@ -1,65 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>JPA Development perspective</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="JPA Development perspective" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABIFBDB" name="BABIFBDB"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>JPA Development perspective</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref236" name="sthref236"></a><a id="sthref237" name="sthref237"></a>The <span class="bold">JPA Development perspective</span> defines the initial set and layout of views in the Workbench window when using Dali. By default, the <span class="gui-object-title">JPA Development perspective</span> includes the following vies:</p>
-<ul>
-<li type="disc">
-<p><a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a></p>
-</li>
-<li type="disc">
-<p><a href="ref_persistence_prop_view.htm#BABFAEBB">JPA Details view (for entities)</a></p>
-</li>
-<li type="disc">
-<p><a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a></p>
-</li>
-<li type="disc">
-<p><a href="ref_details_orm.htm#CACGDGHC">JPA Details view (for orm.xml)</a></p>
-</li>
-</ul>
-<div class="figure"><a id="sthref238" name="sthref238"></a>
-<p class="titleinfigure">Sample JPA Development Perspective</p>
-<img src="img/persistence_perspective.png" alt="JPA Development perspective with the JPA Structure and JPA Details views." title="JPA Development perspective with the JPA Structure and JPA Details views." /><br /></div>
-<!-- class="figure" -->
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<p><a href="../org.eclipse.platform.doc.user/concepts/concepts-4.htm">Perspectives</a></p>
-</div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/ref_persistence_prop_view.htm b/jpa/plugins/org.eclipse.jpt.doc.user/ref_persistence_prop_view.htm
deleted file mode 100644
index a6ea107..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/ref_persistence_prop_view.htm
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>JPA Details view (for entities)</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="JPA Details view (for entities)" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABFAEBB" name="BABFAEBB"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>JPA Details view (for entities)</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref186" name="sthref186"></a><a id="sthref187" name="sthref187"></a><a id="sthref188" name="sthref188"></a>The <span class="gui-object-title">JPA Details</span> view displays the persistence information for the currently selected entity and contains the following tabs:</p>
-<ul>
-<li type="disc">
-<p><a href="reference003.htm#CACCAGGC">General information</a></p>
-</li>
-<li type="disc">
-<p><a href="reference004.htm#CACBHIDA">Secondary table information</a></p>
-</li>
-<li type="disc">
-<p><a href="reference005.htm#CACFHGHE">Inheritance information</a></p>
-</li>
-</ul>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/ref_primary_key.htm b/jpa/plugins/org.eclipse.jpt.doc.user/ref_primary_key.htm
deleted file mode 100644
index d5084e7..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/ref_primary_key.htm
+++ /dev/null
@@ -1,144 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Primary Key Generation information</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Primary Key Generation information" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACFCCAB" name="CACFCCAB"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Primary Key Generation information</h1>
-</td>
-</tr>
-</table>
-<p>This table lists the fields available in the <span class="gui-object-title">Primary Key Generation</span> area in JPA Details view for <a href="tasks010.htm#BABGCBHG">ID mapping</a> types.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table describes the options on the Join Columns tab." summary="This table describes the options on the Join Columns tab." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t9">Property</th>
-<th align="left" valign="bottom" id="r1c2-t9">Description</th>
-<th align="left" valign="bottom" id="r1c3-t9">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t9" headers="r1c1-t9"><a id="CACBAJBC" name="CACBAJBC"></a>Primary Key Generation</td>
-<td align="left" headers="r2c1-t9 r1c2-t9"><a id="sthref217" name="sthref217"></a><a id="sthref218" name="sthref218"></a>These fields define how the primary key is generated. These fields correspond to the <code>@GeneratedValue</code> annotation.</td>
-<td align="left" headers="r2c1-t9 r1c3-t9">Generated Value</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t9" headers="r1c1-t9"><a id="CACJEEEC" name="CACJEEEC"></a>&nbsp;&nbsp;&nbsp;Strategy</td>
-<td align="left" headers="r3c1-t9 r1c2-t9">
-<ul>
-<li type="disc">Auto</li>
-<li type="disc">
-<p>Identity - Values are assigned by the database's <span class="bold">Identity</span> column.</p>
-</li>
-<li type="disc">
-<p>Sequence - Values are assigned by a sequence table (see <a href="#CACFFHEH">Sequence&nbsp;Generator</a>).</p>
-</li>
-<li type="disc">
-<p>Table - Values are assigned by a database table (see <a href="#CACGFEAH">Table Generator</a>).</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r3c1-t9 r1c3-t9">Auto</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t9" headers="r1c1-t9"><a id="BABEEAHJ" name="BABEEAHJ"></a>&nbsp;&nbsp;Generator Name</td>
-<td align="left" headers="r4c1-t9 r1c2-t9">Unique name of the generated value.</td>
-<td align="left" headers="r4c1-t9 r1c3-t9"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t9" headers="r1c1-t9"><a id="CACGFEAH" name="CACGFEAH"></a>Table Generator</td>
-<td align="left" headers="r5c1-t9 r1c2-t9">These fields define the database table used for generating the primary key and correspond to the <code>@TableGenerator</code> annotation.
-<p>These fields apply only when <span class="bold">Strategy</span>&nbsp;=&nbsp;<span class="bold">Table</span>.</p>
-</td>
-<td align="left" headers="r5c1-t9 r1c3-t9"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r6c1-t9" headers="r1c1-t9">&nbsp;&nbsp;Name</td>
-<td align="left" headers="r6c1-t9 r1c2-t9">Unique name of the generator.</td>
-<td align="left" headers="r6c1-t9 r1c3-t9"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r7c1-t9" headers="r1c1-t9">&nbsp;&nbsp;Table</td>
-<td align="left" headers="r7c1-t9 r1c2-t9">Database table that stores the generated ID values.</td>
-<td align="left" headers="r7c1-t9 r1c3-t9"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r8c1-t9" headers="r1c1-t9">&nbsp;&nbsp;Primary Key Column</td>
-<td align="left" headers="r8c1-t9 r1c2-t9">The column in the table generator's <span class="bold">Table</span> that contains the primary key.</td>
-<td align="left" headers="r8c1-t9 r1c3-t9"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r9c1-t9" headers="r1c1-t9">&nbsp;&nbsp;Value Column</td>
-<td align="left" headers="r9c1-t9 r1c2-t9">The column that stores the generated ID values.</td>
-<td align="left" headers="r9c1-t9 r1c3-t9"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r10c1-t9" headers="r1c1-t9">&nbsp;&nbsp;Primary Key Column Value</td>
-<td align="left" headers="r10c1-t9 r1c2-t9">The value for the <span class="bold">Primary Key Column</span> in the generator table.</td>
-<td align="left" headers="r10c1-t9 r1c3-t9"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r11c1-t9" headers="r1c1-t9"><a id="CACFFHEH" name="CACFFHEH"></a>Sequence&nbsp;Generator</td>
-<td align="left" headers="r11c1-t9 r1c2-t9"><a id="sthref219" name="sthref219"></a><a id="sthref220" name="sthref220"></a>These fields define the specific sequence used for generating the primary key and correspond to the <code>@SequenceGenerator</code> annotation.
-<p>These fields apply only when <span class="bold">Strategy</span> = <span class="bold">Sequence</span>.</p>
-</td>
-<td align="left" headers="r11c1-t9 r1c3-t9"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r12c1-t9" headers="r1c1-t9">&nbsp;&nbsp;Name</td>
-<td align="left" headers="r12c1-t9 r1c2-t9">Name of the sequence table to use for defining primary key values.</td>
-<td align="left" headers="r12c1-t9 r1c3-t9"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r13c1-t9" headers="r1c1-t9">&nbsp;&nbsp;Sequence</td>
-<td align="left" headers="r13c1-t9 r1c2-t9">Unique name of the sequence.</td>
-<td align="left" headers="r13c1-t9 r1c3-t9"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" -->
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="tasks010.htm#BABGCBHG">ID mapping</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a></div>
-<!-- class="sect3" -->
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/ref_project_properties.htm b/jpa/plugins/org.eclipse.jpt.doc.user/ref_project_properties.htm
deleted file mode 100644
index 9fc5005..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/ref_project_properties.htm
+++ /dev/null
@@ -1,80 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Project Properties page - JPA Options</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Project Properties page - JPA Options" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABJHBCI" name="BABJHBCI"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Project Properties page - JPA Options</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref224" name="sthref224"></a><a id="sthref225" name="sthref225"></a>Use the <span class="gui-object-title">JPA</span> options on the <span class="gui-object-title">Properties</span> page to select the database connection to use with the project.</p>
-<p>This table lists the properties available in the <span class="gui-object-title">Persistence Properties page</span>.</p>
-<div class="inftblinformal">
-<table class="Informal" title="This table describes the options on the Persistence Properties page." summary="This table describes the options on the Persistence Properties page." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t12">Property</th>
-<th align="left" valign="bottom" id="r1c2-t12">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t12" headers="r1c1-t12"><a id="sthref226" name="sthref226"></a><a id="sthref227" name="sthref227"></a><a id="sthref228" name="sthref228"></a><a id="sthref229" name="sthref229"></a>Platform</td>
-<td align="left" headers="r2c1-t12 r1c2-t12">Select the vendor-specific platform.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t12" headers="r1c1-t12"><a id="sthref230" name="sthref230"></a><a id="sthref231" name="sthref231"></a><a id="sthref232" name="sthref232"></a>Connection</td>
-<td align="left" headers="r3c1-t12 r1c2-t12">The database connection used to map the persistent entities.
-<ul>
-<li type="disc">
-<p>To create a new connection, click <span class="bold">Add Connections</span>.</p>
-</li>
-<li type="disc">
-<p>To reconnect to an existing connection, click <span class="bold">Reconnect</span>.</p>
-</li>
-</ul>
-</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblinformal" -->
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="tasks021.htm#BABDBCBI">Modifying persistent project properties</a></div>
-<!-- class="sect2" -->
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference.htm
deleted file mode 100644
index 5dc89a2..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference.htm
+++ /dev/null
@@ -1,65 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Reference</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content=" Reference" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="sthref185" name="sthref185"></a></p>
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Reference</h1>
-</td>
-</tr>
-</table>
-<p>This section includes detailed help information for each of the following elements in the Dali OR Mapping Tool:</p>
-<ul>
-<li type="disc">
-<p><a href="reference001.htm#CACJJJJH">Wizards</a></p>
-</li>
-<li type="disc">
-<p><a href="reference002.htm#CACDJIIG">Property pages</a></p>
-</li>
-<li type="disc">
-<p><a href="reference010.htm#CACDEIEE">Preferences</a></p>
-</li>
-<li type="disc">
-<p><a href="reference011.htm#CACGEJDA">Dialogs</a></p>
-</li>
-<li type="disc">
-<p><a href="ref_persistence_perspective.htm#BABIFBDB">JPA Development perspective</a></p>
-</li>
-<li type="disc">
-<p><a href="reference013.htm#CACDHCIA">Icons and buttons</a></p>
-</li>
-<li type="disc">
-<p><a href="reference017.htm#CACBBDIB">Dali Developer Documentation</a></p>
-</li>
-</ul>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference001.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference001.htm
deleted file mode 100644
index d0a856b8..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference001.htm
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Wizards</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Wizards" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACJJJJH" name="CACJJJJH"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Wizards</h1>
-</td>
-</tr>
-</table>
-<p>This section includes information on the following wizards:</p>
-<ul>
-<li type="disc">
-<p><a href="ref_new_jpa_project_wizard.htm#CACBJGBG">Create New JPA Project wizard</a></p>
-</li>
-</ul>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference002.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference002.htm
deleted file mode 100644
index b5a99a9..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference002.htm
+++ /dev/null
@@ -1,57 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Property pages</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Property pages" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACDJIIG" name="CACDJIIG"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Property pages</h1>
-</td>
-</tr>
-</table>
-<p>This section includes information on the following property pages:</p>
-<ul>
-<li type="disc">
-<p><a href="ref_persistence_prop_view.htm#BABFAEBB">JPA Details view (for entities)</a></p>
-</li>
-<li type="disc">
-<p><a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a></p>
-</li>
-<li type="disc">
-<p><a href="ref_details_orm.htm#CACGDGHC">JPA Details view (for orm.xml)</a></p>
-</li>
-<li type="disc">
-<p><a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a></p>
-</li>
-</ul>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference003.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference003.htm
deleted file mode 100644
index 58601b1..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference003.htm
+++ /dev/null
@@ -1,115 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>General information</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="General information" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACCAGGC" name="CACCAGGC"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>General information</h1>
-</td>
-</tr>
-</table>
-<p>This table lists the General information fields available in the <span class="gui-object-title">JPA Details</span> view for each entity type.</p>
-<div class="inftblinformal">
-<table class="Informal" title="This table describes the options on the Persistence Properties view, General tab." summary="This table describes the options on the Persistence Properties view, General tab." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t4">Property</th>
-<th align="left" valign="bottom" id="r1c2-t4">Description</th>
-<th align="left" valign="bottom" id="r1c3-t4">Default</th>
-<th align="left" valign="bottom" id="r1c4-t4">Available for Entity&nbsp;Type</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t4" headers="r1c1-t4">Map As</td>
-<td align="left" headers="r2c1-t4 r1c2-t4">Specify the type of entity: <span class="bold">Entity</span>, Mapped Superclass, Embeddable.</td>
-<td align="left" headers="r2c1-t4 r1c3-t4">Entity</td>
-<td align="left" headers="r2c1-t4 r1c4-t4"><a href="tasks004.htm#BABGBIEE">Entity</a>, <a href="tasks005.htm#BABFEICE">Embeddable</a>, and <a href="tasks006.htm#BABDAGCI">Mapped superclass</a></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t4" headers="r1c1-t4">Name</td>
-<td align="left" headers="r3c1-t4 r1c2-t4">The name of this entity. By default, the class name is used as the entity name.</td>
-<td align="left" headers="r3c1-t4 r1c3-t4"><br /></td>
-<td align="left" headers="r3c1-t4 r1c4-t4"><a href="tasks004.htm#BABGBIEE">Entity</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t4" headers="r1c1-t4">Table</td>
-<td align="left" headers="r4c1-t4 r1c2-t4">The primary database table associated with the entity.</td>
-<td align="left" headers="r4c1-t4 r1c3-t4"><br /></td>
-<td align="left" headers="r4c1-t4 r1c4-t4"><a href="tasks004.htm#BABGBIEE">Entity</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t4" headers="r1c1-t4">Catalog</td>
-<td align="left" headers="r5c1-t4 r1c2-t4">The database catalog that contains the <span class="bold">Table</span>.</td>
-<td align="left" headers="r5c1-t4 r1c3-t4">As defined in <code>orm.xml</code>.</td>
-<td align="left" headers="r5c1-t4 r1c4-t4"><a href="tasks004.htm#BABGBIEE">Entity</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r6c1-t4" headers="r1c1-t4">Schema</td>
-<td align="left" headers="r6c1-t4 r1c2-t4">The database schema that contains the <span class="bold">Table</span>.</td>
-<td align="left" headers="r6c1-t4 r1c3-t4">As defined in <code>orm.xml</code>.</td>
-<td align="left" headers="r6c1-t4 r1c4-t4"><a href="tasks004.htm#BABGBIEE">Entity</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r7c1-t4" headers="r1c1-t4">Attribute Overrides</td>
-<td align="left" headers="r7c1-t4 r1c2-t4">Specify a property or field to be overridden (from the default mappings). Select <span class="bold">Override Default</span>.</td>
-<td align="left" headers="r7c1-t4 r1c3-t4"><br /></td>
-<td align="left" headers="r7c1-t4 r1c4-t4"><a href="tasks004.htm#BABGBIEE">Entity</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r8c1-t4" headers="r1c1-t4">&nbsp;&nbsp;Column</td>
-<td align="left" headers="r8c1-t4 r1c2-t4">The database column (from the <span class="bold">Table Name</span>) mapped to the entity.</td>
-<td align="left" headers="r8c1-t4 r1c3-t4"><br /></td>
-<td align="left" headers="r8c1-t4 r1c4-t4"><a href="tasks004.htm#BABGBIEE">Entity</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r9c1-t4" headers="r1c1-t4">&nbsp;&nbsp;Table</td>
-<td align="left" headers="r9c1-t4 r1c2-t4">Name of the database table that contains the selected column.</td>
-<td align="left" headers="r9c1-t4 r1c3-t4"><br /></td>
-<td align="left" headers="r9c1-t4 r1c4-t4"><a href="tasks004.htm#BABGBIEE">Entity</a><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblinformal" -->
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_add_persistence.htm#BABHICAI">Adding persistence to a class</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_prop_view.htm#BABFAEBB">JPA Details view (for entities)</a></div>
-<!-- class="sect3" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference004.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference004.htm
deleted file mode 100644
index 74775a8..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference004.htm
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Secondary table information</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Secondary table information" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACBHIDA" name="CACBHIDA"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Secondary table information</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref189" name="sthref189"></a><a id="sthref190" name="sthref190"></a><a id="sthref191" name="sthref191"></a><a id="sthref192" name="sthref192"></a>Use the <span class="gui-object-title">Secondary Tables</span> area in the <span class="gui-object-title">Java Details</span> view to associate additional tables with an entity. Use this area if the data associated with an entity is spread across multiple tables.</p>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_additonal_tables.htm#CIHGBIEI">Specifying additional tables</a><br />
-<a href="task_add_persistence.htm#BABHICAI">Adding persistence to a class</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_prop_view.htm#BABFAEBB">JPA Details view (for entities)</a></div>
-<!-- class="sect3" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference005.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference005.htm
deleted file mode 100644
index c905aae..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference005.htm
+++ /dev/null
@@ -1,108 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Inheritance information</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Inheritance information" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACFHGHE" name="CACFHGHE"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Inheritance information</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref193" name="sthref193"></a><a id="sthref194" name="sthref194"></a>This table lists the fields available on the <span class="gui-object-title">Inheritance</span> area in the <span class="gui-object-title">Java Details</span> view for each entity type.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table describes the options on the Persistence Properties view, Inheritance tab." summary="This table describes the options on the Persistence Properties view, Inheritance tab." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t5">Property</th>
-<th align="left" valign="bottom" id="r1c2-t5">Description</th>
-<th align="left" valign="bottom" id="r1c3-t5">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t5" headers="r1c1-t5">Strategy</td>
-<td align="left" headers="r2c1-t5 r1c2-t5">Specify the strategy to use when mapping a class or class hierarchy:
-<ul>
-<li type="disc">
-<p>Single table - All classes in the hierarchy are mapped to a single table.</p>
-</li>
-<li type="disc">
-<p>Joined - The root of the hierarchy is mapped to a single table; each child maps to its own table.</p>
-</li>
-<li type="disc">
-<p>Table per class - Each class is mapped to a separate table.</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r2c1-t5 r1c3-t5">Single table</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t5" headers="r1c1-t5">Discriminator Column</td>
-<td align="left" headers="r3c1-t5 r1c2-t5">Use to specify the name of the discriminator column when using a <span class="bold">Single</span> or <span class="bold">Joined</span> inheritance strategy.</td>
-<td align="left" headers="r3c1-t5 r1c3-t5"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t5" headers="r1c1-t5">Discriminator Type</td>
-<td align="left" headers="r4c1-t5 r1c2-t5">Set this field to set the discriminator type to <code>Char</code> or <code>Integer</code> (instead of its default: <code>String</code>). The <span class="bold">Discriminator Value</span> must conform to this type.</td>
-<td align="left" headers="r4c1-t5 r1c3-t5">String</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t5" headers="r1c1-t5">Discriminator Value</td>
-<td align="left" headers="r5c1-t5 r1c2-t5">Specify the discriminator value used to differentiate an entity in this inheritance hierarchy. The value must conform to the specified <span class="bold">Discriminator Type</span>.</td>
-<td align="left" headers="r5c1-t5 r1c3-t5"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r6c1-t5" headers="r1c1-t5">Primary Key Join Columns</td>
-<td align="left" headers="r6c1-t5 r1c2-t5">
-<p>Select <span class="bold">Override Default</span>.</p>
-<p>This field corresponds with @PrimaryKeyJoinColumn annotation.</p>
-</td>
-<td align="left" headers="r6c1-t5 r1c3-t5"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" -->
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_inheritance.htm#CIHCCCJD">Specifying entity inheritance</a><br />
-<a href="task_add_persistence.htm#BABHICAI">Adding persistence to a class</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_prop_view.htm#BABFAEBB">JPA Details view (for entities)</a></div>
-<!-- class="sect3" -->
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference006.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference006.htm
deleted file mode 100644
index 45b9c12..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference006.htm
+++ /dev/null
@@ -1,84 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Join Table Information</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Join Table Information" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACBAEBC" name="CACBAEBC"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Join Table Information</h1>
-</td>
-</tr>
-</table>
-<p>Use area to specify a mapped column for joining an entity association. By default, the mapping is assumed to have a single join.</p>
-<p>This table lists the fields available on the <span class="gui-object-title">Join Table</span> area in <span class="gui-object-title">the JPA Details</span> view for <a href="tasks013.htm#BABHGEBD">One-to-many mapping</a> and <a href="tasks011.htm#BABEIEGD">Many-to-many mapping</a> mapping types.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table describes the options on the Join Table tab." summary="This table describes the options on the Join Table tab." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t7">Property</th>
-<th align="left" valign="bottom" id="r1c2-t7">Description</th>
-<th align="left" valign="bottom" id="r1c3-t7">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t7" headers="r1c1-t7">Name</td>
-<td align="left" headers="r2c1-t7 r1c2-t7">Name of the join table that contains the foreign key column.</td>
-<td align="left" headers="r2c1-t7 r1c3-t7">By default, the name is assumed to be the primary tables associated with the entities concatenated with an underscore.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t7" headers="r1c1-t7"><a id="CACBBDFG" name="CACBBDFG"></a>Join Columns</td>
-<td align="left" headers="r3c1-t7 r1c2-t7"><a id="sthref213" name="sthref213"></a><a id="sthref214" name="sthref214"></a>Specify a mapped column for joining an entity association. This field corresponds to the <code>@JoinColum</code> attribute.
-<p>Select <span class="bold">Override Default</span>, then Add, Edit, or Remove the join columns.</p>
-</td>
-<td align="left" headers="r3c1-t7 r1c3-t7">By default, the mapping is assumed to have a single join.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t7" headers="r1c1-t7">Inverse Join Columns</td>
-<td align="left" headers="r4c1-t7 r1c2-t7">Select <span class="bold">Override Default</span>, then Add, Edit, or Remove the join columns.</td>
-<td align="left" headers="r4c1-t7 r1c3-t7"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" -->
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="reference012.htm#CACCGEHC">Edit Join Columns Dialog</a></div>
-<!-- class="sect3" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference007.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference007.htm
deleted file mode 100644
index fb51f2e..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference007.htm
+++ /dev/null
@@ -1,73 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Join Columns Information</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Join Columns Information" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACFCEJC" name="CACFCEJC"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Join Columns Information</h1>
-</td>
-</tr>
-</table>
-<p>This table lists the fields available in the <span class="gui-object-title">Join Table</span> area in <span class="gui-object-title">JPA Details</span> view for <a href="tasks012.htm#BABHFAFJ">Many-to-one mapping</a> and <a href="tasks014.htm#BABFHBCJ">One-to-one mapping</a> mapping types.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table describes the options on the Join Columns tab." summary="This table describes the options on the Join Columns tab." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t8">Property</th>
-<th align="left" valign="bottom" id="r1c2-t8">Description</th>
-<th align="left" valign="bottom" id="r1c3-t8">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t8" headers="r1c1-t8">Join Column</td>
-<td align="left" headers="r2c1-t8 r1c2-t8"><a id="sthref215" name="sthref215"></a><a id="sthref216" name="sthref216"></a>Specify a mapped column for joining an entity association. This field corresponds to the <code>@JoinColum</code> attribute.
-<p>Select <span class="bold">Override Default</span>, then Add, Edit, or Remove the join columns.</p>
-</td>
-<td align="left" headers="r2c1-t8 r1c3-t8">By default, the mapping is assumed to have a single join.</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" -->
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="reference012.htm#CACCGEHC">Edit Join Columns Dialog</a></div>
-<!-- class="sect3" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference008.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference008.htm
deleted file mode 100644
index 8e81971..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference008.htm
+++ /dev/null
@@ -1,100 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>General information</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="General information" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACCACGH" name="CACCACGH"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>General information</h1>
-</td>
-</tr>
-</table>
-<p>This table lists the General information fields available in the <span class="gui-object-title">JPA Details</span> view for each entity type.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table describes the options on the Persistence Properties view, General tab." summary="This table describes the options on the Persistence Properties view, General tab." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t10">Property</th>
-<th align="left" valign="bottom" id="r1c2-t10">Description</th>
-<th align="left" valign="bottom" id="r1c3-t10">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t10" headers="r1c1-t10">Package</td>
-<td align="left" headers="r2c1-t10 r1c2-t10">The Java package that contains the persistent entities. Click <span class="bold">Browse</span> and select the package</td>
-<td align="left" headers="r2c1-t10 r1c3-t10"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t10" headers="r1c1-t10">Schema</td>
-<td align="left" headers="r3c1-t10 r1c2-t10">The database schema that contains the <span class="bold">Table</span>.
-<p>This field corresponds to the <code>&lt;schema&gt;</code> element in the <code>orm.xml</code> file.</p>
-</td>
-<td align="left" headers="r3c1-t10 r1c3-t10"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t10" headers="r1c1-t10">Catalog</td>
-<td align="left" headers="r4c1-t10 r1c2-t10">The database catalog that contains the <span class="bold">Table</span>.
-<p>This field corresponds to the <code>&lt;catalog&gt;</code> element in the <code>orm.xml</code> file.</p>
-</td>
-<td align="left" headers="r4c1-t10 r1c3-t10"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t10" headers="r1c1-t10">Access</td>
-<td align="left" headers="r5c1-t10 r1c2-t10">Specify the default access method for the variables in the project:
-<ul>
-<li type="disc">
-<p>Property</p>
-</li>
-<li type="disc">
-<p>Field</p>
-</li>
-</ul>
-<p>This field corresponds to the <code>&lt;access&gt;</code> element in the <code>orm.xml</code> file.</p>
-</td>
-<td align="left" headers="r5c1-t10 r1c3-t10"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" -->
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_add_persistence.htm#BABHICAI">Adding persistence to a class</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_prop_view.htm#BABFAEBB">JPA Details view (for entities)</a></div>
-<!-- class="sect3" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference009.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference009.htm
deleted file mode 100644
index 5a84da5..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference009.htm
+++ /dev/null
@@ -1,102 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Persistence Unit information</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Persistence Unit information" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACEAGBG" name="CACEAGBG"></a></p>
-<div class="sect3"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Persistence Unit information</h1>
-</td>
-</tr>
-</table>
-<p>This table lists the Persistence Unit information fields available in the <span class="gui-object-title">JPA Details</span> view for each entity type. These fields are contained in the <code>&lt;persistence-unit-metadata&gt;</code> element in the <code>orm.xml</code> file.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table describes the options on the Persistence Properties view, General tab." summary="This table describes the options on the Persistence Properties view, General tab." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t11">Property</th>
-<th align="left" valign="bottom" id="r1c2-t11">Description</th>
-<th align="left" valign="bottom" id="r1c3-t11">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t11" headers="r1c1-t11">XML Mapping Data Complete</td>
-<td align="left" headers="r2c1-t11 r1c2-t11">Specifies that the Java classes in this persistence unit are fully specified by their metadata. Any annotations will be ignored.
-<p>This field corresponds to the <code>&lt;xml-mapping-metadata-complete&gt;</code> element in the <code>orm.xml</code> file.</p>
-</td>
-<td align="left" headers="r2c1-t11 r1c3-t11"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t11" headers="r1c1-t11">Package</td>
-<td align="left" headers="r3c1-t11 r1c2-t11">The Java package that contains the persistent entities for this persistence unit.
-<p>Click <span class="bold">Browse</span> and select the package</p>
-</td>
-<td align="left" headers="r3c1-t11 r1c3-t11"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t11" headers="r1c1-t11">Schema</td>
-<td align="left" headers="r4c1-t11 r1c2-t11">The database schema that contains the <span class="bold">Table</span>.
-<p>This field corresponds to the <code>&lt;schema&gt;</code> element in the <code>orm.xml</code> file.</p>
-</td>
-<td align="left" headers="r4c1-t11 r1c3-t11"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t11" headers="r1c1-t11">Catalog</td>
-<td align="left" headers="r5c1-t11 r1c2-t11">The database catalog that contains the <span class="bold">Table</span>.
-<p>This field corresponds to the <code>&lt;catalog&gt;</code> element in the <code>orm.xml</code> file.</p>
-</td>
-<td align="left" headers="r5c1-t11 r1c3-t11"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r6c1-t11" headers="r1c1-t11">Cascade Persist</td>
-<td align="left" headers="r6c1-t11 r1c2-t11">Adds cascade-persist to the set of cascade options in entity relationships of the persistence unit.
-<p>This field corresponds to the <code>&lt;cascade-persist&gt;</code> element in the <code>orm.xml</code> file.</p>
-</td>
-<td align="left" headers="r6c1-t11 r1c3-t11"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" -->
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_add_persistence.htm#BABHICAI">Adding persistence to a class</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_prop_view.htm#BABFAEBB">JPA Details view (for entities)</a></div>
-<!-- class="sect3" -->
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference010.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference010.htm
deleted file mode 100644
index 87bfc6b..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference010.htm
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Preferences</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Preferences" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACDEIEE" name="CACDEIEE"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Preferences</h1>
-</td>
-</tr>
-</table>
-<p>This section includes information on the following preference pages:</p>
-<ul>
-<li type="disc">
-<p><a href="ref_project_properties.htm#BABJHBCI">Project Properties page - JPA Options</a></p>
-</li>
-</ul>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference011.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference011.htm
deleted file mode 100644
index 942eaf5..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference011.htm
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Dialogs</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Dialogs" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACGEJDA" name="CACGEJDA"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Dialogs</h1>
-</td>
-</tr>
-</table>
-<p>This section includes information on the following preference pages:</p>
-<ul>
-<li type="disc">
-<p><a href="task_generate_entities.htm#CACDAFJD">Generate Entities from Tables dialog</a></p>
-</li>
-<li type="disc">
-<p><a href="reference012.htm#CACCGEHC">Edit Join Columns Dialog</a></p>
-</li>
-</ul>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference012.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference012.htm
deleted file mode 100644
index 510ecb3..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference012.htm
+++ /dev/null
@@ -1,71 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Edit Join Columns Dialog</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Edit Join Columns Dialog" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACCGEHC" name="CACCGEHC"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Edit Join Columns Dialog</h1>
-</td>
-</tr>
-</table>
-<p>Use the <span class="gui-object-title">Join Columns</span> dialog to create or modify the join tables and columns in relationship mappings.</p>
-<p>This table lists the properties available in the <span class="gui-object-title">Join Columns</span> dialog.</p>
-<div class="inftblinformal">
-<table class="Informal" title="This table describes the options on the Join Columns dialog." summary="This table describes the options on the Join Columns dialog." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t14">Property</th>
-<th align="left" valign="bottom" id="r1c2-t14">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t14" headers="r1c1-t14">Name</td>
-<td align="left" headers="r2c1-t14 r1c2-t14">Name of the joint table column that contains the foreign key column.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t14" headers="r1c1-t14">Referenced Column Name</td>
-<td align="left" headers="r3c1-t14 r1c2-t14">Name of the database column that contains the foreign key reference for the entity relationship.</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblinformal" -->
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="reference006.htm#CACBAEBC">Join Table Information</a><br />
-<a href="reference007.htm#CACFCEJC">Join Columns Information</a></div>
-<!-- class="sect2" -->
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference013.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference013.htm
deleted file mode 100644
index 08937e2..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference013.htm
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:58 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Icons and buttons</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Icons and buttons" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACDHCIA" name="CACDHCIA"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Icons and buttons</h1>
-</td>
-</tr>
-</table>
-<p>This section includes information on each of the icons and buttons used in the Dali OR Mapping Tool.</p>
-<ul>
-<li type="disc">
-<p><a href="reference014.htm#CACGEACG">Icons</a></p>
-</li>
-<li type="disc">
-<p><a href="reference015.htm#CACDJCEI">Buttons</a></p>
-</li>
-</ul>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference014.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference014.htm
deleted file mode 100644
index 043d0a0..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference014.htm
+++ /dev/null
@@ -1,116 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:58 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Icons</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Icons" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACGEACG" name="CACGEACG"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Icons</h1>
-</td>
-</tr>
-</table>
-<p>The following icons are used throughout the Dali OR Mapping Tool.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table describes the icons used in the Dali plug-in." summary="This table describes the icons used in the Dali plug-in." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t15">Icon</th>
-<th align="left" valign="bottom" id="r1c2-t15">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t15" headers="r1c1-t15"><img src="img/icon_nonpersistent.png" alt="Nonpersistent class icon" title="Nonpersistent class icon" /><br /></td>
-<td align="left" headers="r2c1-t15 r1c2-t15">Nonpersistent class</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t15" headers="r1c1-t15"><img src="img/icon_persistent.png" alt="Persistent entity icon" title="Persistent entity icon" /><br /></td>
-<td align="left" headers="r3c1-t15 r1c2-t15"><a href="tasks004.htm#BABGBIEE">Entity</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t15" headers="r1c1-t15"><img src="img/icon_embeddable.png" alt="Embeddable entity icon" title="Embeddable entity icon" /><br /></td>
-<td align="left" headers="r4c1-t15 r1c2-t15"><a href="tasks005.htm#BABFEICE">Embeddable</a> entity</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t15" headers="r1c1-t15"><img src="img/icon_superclass.png" alt="Mapped superclass icon" title="Mapped superclass icon" /><br /></td>
-<td align="left" headers="r5c1-t15 r1c2-t15"><a href="tasks006.htm#BABDAGCI">Mapped superclass</a></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r6c1-t15" headers="r1c1-t15"><img src="img/icon_basicmapping.png" alt="Basic mapping icon" title="Basic mapping icon" /><br /></td>
-<td align="left" headers="r6c1-t15 r1c2-t15"><a href="tasks007.htm#BABBABCE">Basic mapping</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r7c1-t15" headers="r1c1-t15"><img src="img/icon_embeddedmapping.png" alt="Embedded mapping icon" title="Embedded mapping icon" /><br /></td>
-<td align="left" headers="r7c1-t15 r1c2-t15"><a href="tasks008.htm#BABCBHDF">Embedded mapping</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r8c1-t15" headers="r1c1-t15"><img src="img/icon_embeddedidmapping.png" alt="Embedded ID mapping icon" title="Embedded ID mapping icon" /><br /></td>
-<td align="left" headers="r8c1-t15 r1c2-t15"><a href="tasks009.htm#CIHDIAEE">Embedded ID mapping</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r9c1-t15" headers="r1c1-t15"><img src="img/icon_idmapping.png" alt="ID mapping icon" title="ID mapping icon" /><br /></td>
-<td align="left" headers="r9c1-t15 r1c2-t15"><a href="tasks010.htm#BABGCBHG">ID mapping</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r10c1-t15" headers="r1c1-t15"><img src="img/icon_mmmapping.png" alt="Many-to-many mapping icon" title="Many-to-many mapping icon" /><br /></td>
-<td align="left" headers="r10c1-t15 r1c2-t15"><a href="tasks011.htm#BABEIEGD">Many-to-many mapping</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r11c1-t15" headers="r1c1-t15"><img src="img/icon_m1mapping.png" alt="Many-to-one mapping icon" title="Many-to-one mapping icon" /><br /></td>
-<td align="left" headers="r11c1-t15 r1c2-t15"><a href="tasks012.htm#BABHFAFJ">Many-to-one mapping</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r12c1-t15" headers="r1c1-t15"><img src="img/icon_1mmapping.png" alt="One-to-many mapping icon" title="One-to-many mapping icon" /><br /></td>
-<td align="left" headers="r12c1-t15 r1c2-t15"><a href="tasks013.htm#BABHGEBD">One-to-many mapping</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r13c1-t15" headers="r1c1-t15"><img src="img/icon_11mapping.png" alt="One-to-one mapping icon" title="One-to-one mapping icon" /><br /></td>
-<td align="left" headers="r13c1-t15 r1c2-t15"><a href="tasks014.htm#BABFHBCJ">One-to-one mapping</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r14c1-t15" headers="r1c1-t15"><img src="img/icon_transientmapping.png" alt="Transient mapping icon" title="Transient mapping icon" /><br /></td>
-<td align="left" headers="r14c1-t15 r1c2-t15"><a href="tasks015.htm#BABHFHEI">Transient mapping</a><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r15c1-t15" headers="r1c1-t15"><img src="img/icon_versionmapping.png" alt="Version mapping icon" title="Version mapping icon" /><br /></td>
-<td align="left" headers="r15c1-t15 r1c2-t15"><a href="tasks016.htm#BABHIBII">Version mapping</a><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" -->
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<p><a href="reference013.htm#CACDHCIA">Icons and buttons</a></p>
-</div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference015.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference015.htm
deleted file mode 100644
index 37531be..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference015.htm
+++ /dev/null
@@ -1,65 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:58 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Buttons</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Buttons" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACDJCEI" name="CACDJCEI"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Buttons</h1>
-</td>
-</tr>
-</table>
-<p>The following buttons are used throughout the Dali OR Mapping Tool.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table describes the buttons used in the Dali plug-in." summary="This table describes the buttons used in the Dali plug-in." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t16">Icon</th>
-<th align="left" valign="bottom" id="r1c2-t16">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t16" headers="r1c1-t16"><img src="img/button_jpa_perspective.png" alt="Persistence Perspective button" title="Persistence Perspective button" /><br /></td>
-<td align="left" headers="r2c1-t16 r1c2-t16">JPA Development perspective</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" -->
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<p><a href="reference013.htm#CACDHCIA">Icons and buttons</a></p>
-</div>
-<!-- class="sect2" -->
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference016.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference016.htm
deleted file mode 100644
index 7012743..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference016.htm
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:58 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Javadoc</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Javadoc" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<div class="sect1"><!-- infolevel="all" infotype="General" --><a id="sthref239" name="sthref239"></a>
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Javadoc</h1>
-</td>
-</tr>
-</table>
-<p>There is no public API for Release 1.0.0. Please refer to the <a href="reference017.htm#CACBBDIB">Dali Developer Documentation</a> for additional information.</p>
-</div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/reference017.htm b/jpa/plugins/org.eclipse.jpt.doc.user/reference017.htm
deleted file mode 100644
index 080d092..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/reference017.htm
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:58 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Dali Developer Documentation</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Dali Developer Documentation" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACBBDIB" name="CACBBDIB"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Dali Developer Documentation</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref240" name="sthref240"></a><a id="sthref241" name="sthref241"></a><a id="sthref242" name="sthref242"></a>Additional Dali documentation is available online at:</p>
-<p><code><a href="http://wiki.eclipse.org/index.php/Dali_Developer_Documentation">http://wiki.eclipse.org/index.php/Dali_Developer_Documentation</a></code></p>
-<p>This developer documentation includes information about:</p>
-<ul>
-<li type="disc">
-<p>Dali architecture</p>
-</li>
-<li type="disc">
-<p>Plugins that comprise the Dali JPA Eclipse feature</p>
-</li>
-<li type="disc">
-<p>Extension points</p>
-</li>
-</ul>
-</div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/task_add_persistence.htm b/jpa/plugins/org.eclipse.jpt.doc.user/task_add_persistence.htm
deleted file mode 100644
index fbb1ed0..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/task_add_persistence.htm
+++ /dev/null
@@ -1,65 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:54 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Adding persistence to a class</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Adding persistence to a class" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABHICAI" name="BABHICAI"></a></p>
-<div class="sect1">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Adding persistence to a class</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref73" name="sthref73"></a><a id="sthref74" name="sthref74"></a><a id="sthref75" name="sthref75"></a>You can make a Java class into one of the following persistent types:</p>
-<ul>
-<li type="disc">
-<p><a href="tasks004.htm#BABGBIEE">Entity</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks005.htm#BABFEICE">Embeddable</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks006.htm#BABDAGCI">Mapped superclass</a></p>
-</li>
-</ul>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related tasks" title="Related tasks" /><br />
-<br />
-<a href="task_additonal_tables.htm#CIHGBIEI">Specifying additional tables</a><br />
-<a href="task_inheritance.htm#CIHCCCJD">Specifying entity inheritance</a><br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_persistence.htm#BABCAHIC">Understanding Java persistence</a><br />
-<a href="concepts003.htm#CHDBIJAC">The orm.xml file</a><br />
-<a href="concepts002.htm#CHDHAGIH">The persistence.xml file</a> <!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/task_additonal_tables.htm b/jpa/plugins/org.eclipse.jpt.doc.user/task_additonal_tables.htm
deleted file mode 100644
index 1416205..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/task_additonal_tables.htm
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:54 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Specifying additional tables</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Specifying additional tables" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CIHGBIEI" name="CIHGBIEI"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Specifying additional tables</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref97" name="sthref97"></a><a id="sthref98" name="sthref98"></a>An entity may inherit properties from other entities. You can specify a specific strategy to use for inheritance.</p>
-<p>Use this procedure to specify inheritance (<code>@Inheritance)</code> for an existing entity (<code>@Entity</code>):</p>
-<ol type="1" start="1">
-<li>
-<p>Select the entity in the <span class="gui-object-title">Package Explorer</span>.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">JPA Details</span> view, select the <span class="gui-object-action">Secondary Tables</span> information.</p>
-<div class="figure"><a id="sthref99" name="sthref99"></a>
-<p class="titleinfigure">Specifying Secondary Tables</p>
-<img src="img/secondary_tables.png" alt="Secondary Tables area on the JPA Details view." title="Secondary Tables area on the JPA Details view." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>Click <span class="bold">Add</span> to associate an additional table with the entity. The Edit Secondary Table dialog appears</p>
-</li>
-<li>
-<p>Select the <span class="bold">Name</span>, <span class="bold">Catalog</span>, and <span class="bold">Schema</span> of the additional table to associate with the entity.</p>
-</li>
-</ol>
-<p>Eclipse adds the following annotations the entity:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-@SecondaryTable(name="NAME", catalog = "CATALOG", schema = "SCHEMA"
-
-
-</pre>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_add_persistence.htm#BABHICAI">Adding persistence to a class</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_persistence.htm#BABCAHIC">Understanding Java persistence</a><br /></div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/task_create_new_project.htm b/jpa/plugins/org.eclipse.jpt.doc.user/task_create_new_project.htm
deleted file mode 100644
index b6d33fa..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/task_create_new_project.htm
+++ /dev/null
@@ -1,103 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:53 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Creating a new JPA project</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Creating a new JPA project" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CIHHEJCJ" name="CIHHEJCJ"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Creating a new JPA project</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref49" name="sthref49"></a><a id="sthref50" name="sthref50"></a>Use this procedure to create a new JPA project.</p>
-<ol type="1" start="1">
-<li>
-<p>Select <span class="bold">File &gt; New &gt; Other</span>. The New Project dialog appears.</p>
-</li>
-<li>
-<p><a id="sthref51" name="sthref51"></a><a id="sthref52" name="sthref52"></a>On the New Project dialog, select <span class="bold">JPA &gt; JPA Project</span> and click <span class="bold">Next</span>. The New JPA Project wizard appears.</p>
-<div class="figure"><a id="sthref53" name="sthref53"></a>
-<p class="titleinfigure"><a id="sthref54" name="sthref54"></a>New JPA Project</p>
-<img src="img/new_jpa_project_dialog.png" alt="The New JPA Project dialog." title="The New JPA Project dialog." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>Complete the fields on the <a href="ref_new_jpa_project.htm#CACBJAGC">New JPA Project page</a> to specify the project name and location, target runtime, and pre-defined configuration.</p>
-</li>
-<li>
-<p>Click <span class="bold">Next</span>. The Project Facets page appears.</p>
-</li>
-<li>
-<p>Select the project facets to use to create the project and click <span class="bold">Next</span>. The JPA Facet page appears.</p>
-<div class="figure"><a id="sthref55" name="sthref55"></a>
-<p class="titleinfigure"><a id="sthref56" name="sthref56"></a>New JPA Project</p>
-<img src="img/jpa_facet_dialog.png" alt="The JPA Facet dialog" title="The JPA Facet dialog" /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>Complete the fields on the <a href="ref_jpa_facet.htm#CACIFDIF">JPA Facet page</a> to specify your vender-specific platform, database connection, and JPA implementation library.</p>
-<div align="center">
-<div class="inftblnote"><br />
-<table class="Note oac_no_warn" summary="This is a layout table to format a note" title="This is a layout table to format a note" dir="ltr" border="1" width="80%" frame="hsides" rules="groups" cellpadding="3" cellspacing="0">
-<tbody>
-<tr>
-<td align="left">
-<p class="notep1">Note:</p>
-If the server runtime does not provide a JPA implementation, you must explicitly select a JPA implementation library.
-<p>To insure the portability of your application, you must explicitly list the managed persistence classes that are included in the persistence unit. If the server supports EJB 3.0, the persistent classes will be discovered automatically.</p>
-</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblnote" --></div>
-</li>
-<li>
-<p>Click <span class="bold">Finish</span>. You should now open the <a href="ref_persistence_perspective.htm#BABIFBDB">JPA Development perspective</a>.</p>
-</li>
-</ol>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_new_jpa_project_wizard.htm#CACBJGBG">Create New JPA Project wizard</a><br />
-<a href="ref_persistence_perspective.htm#BABIFBDB">JPA Development perspective</a>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related tasks" title="Related tasks" /><br />
-<br />
-<a href="task_manage_persistence.htm#CIHDAJID">Managing the persistence.xml file</a><br />
-<a href="task_add_persistence.htm#BABHICAI">Adding persistence to a class</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_persistence.htm#BABCAHIC">Understanding Java persistence</a><br />
-<a href="concepts002.htm#CHDHAGIH">The persistence.xml file</a><br /></div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/task_generate_entities.htm b/jpa/plugins/org.eclipse.jpt.doc.user/task_generate_entities.htm
deleted file mode 100644
index 743ece1..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/task_generate_entities.htm
+++ /dev/null
@@ -1,74 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:57 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Generate Entities from Tables dialog</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Generate Entities from Tables dialog" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CACDAFJD" name="CACDAFJD"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Generate Entities from Tables dialog</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref233" name="sthref233"></a><a id="sthref234" name="sthref234"></a><a id="sthref235" name="sthref235"></a>Use the <span class="gui-object-title">Generate Entities</span> dialog to create Java persistent entities from your database tables and columns.</p>
-<p>This table lists the properties available in the <span class="gui-object-title">Generate Entities dialog</span>.</p>
-<div class="inftblinformal">
-<table class="Informal" title="This table describes the options on the Generate Entities dialog." summary="This table describes the options on the Generate Entities dialog." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t13">Property</th>
-<th align="left" valign="bottom" id="r1c2-t13">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t13" headers="r1c1-t13">Source Folder</td>
-<td align="left" headers="r2c1-t13 r1c2-t13">Enter a project folder name in which to generate the Java persistent entities, or click <span class="bold">Browse</span> to select an existing folder.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t13" headers="r1c1-t13">Package</td>
-<td align="left" headers="r3c1-t13 r1c2-t13">Enter a package name in which to generate the Java persistent entities, or click <span class="bold">Browse</span> to select an existing package.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t13" headers="r1c1-t13">Tables</td>
-<td align="left" headers="r4c1-t13 r1c2-t13">Select the tables from which to create Java persistent entities. The tables shown are determined by the database connection that you defined in the <a href="ref_project_properties.htm#BABJHBCI">Project Properties page - JPA Options</a>.</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblinformal" -->
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<p><a href="tasks017.htm#BABBAGFI">Generating entities from tables</a></p>
-<p>&nbsp;</p>
-</div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/task_inheritance.htm b/jpa/plugins/org.eclipse.jpt.doc.user/task_inheritance.htm
deleted file mode 100644
index 42015c0..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/task_inheritance.htm
+++ /dev/null
@@ -1,143 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:54 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Specifying entity inheritance</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Specifying entity inheritance" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CIHCCCJD" name="CIHCCCJD"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Specifying entity inheritance</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref100" name="sthref100"></a><a id="sthref101" name="sthref101"></a>An entity may inherit properties from other entities. You can specify a specific strategy to use for inheritance.</p>
-<p>Use this procedure to specify inheritance (<code>@Inheritance)</code> for an existing entity (<code>@Entity</code>):</p>
-<ol type="1" start="1">
-<li>
-<p>Select the entity in the <span class="gui-object-title">Package Explorer</span>.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">JPA Details</span> view, select the <span class="gui-object-action">Inheritance</span> information.</p>
-<div class="figure"><a id="sthref102" name="sthref102"></a>
-<p class="titleinfigure">Specifying Inheritance</p>
-<img src="img/inheritance_tab.png" alt="Selecting the Inheritance area on the JPA Details view." title="Selecting the Inheritance area on the JPA Details view." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>In the <span class="bold">Strategy</span> list, select one of the following the inheritance strategies:</p>
-<ul>
-<li type="disc">
-<p>A single table (default)</p>
-</li>
-<li type="disc">
-<p>Joined table</p>
-</li>
-<li type="disc">
-<p>One table per class</p>
-</li>
-</ul>
-</li>
-<li>
-<p>Use the following table to complete the remaining fields on the tab. See <a href="reference005.htm#CACFHGHE">"Inheritance information"</a> for additional details.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table describes the options on the Persistence Properties view, Inheritance tab." summary="This table describes the options on the Persistence Properties view, Inheritance tab." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t3">Property</th>
-<th align="left" valign="bottom" id="r1c2-t3">Description</th>
-<th align="left" valign="bottom" id="r1c3-t3">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t3" headers="r1c1-t3"><a id="sthref103" name="sthref103"></a><a id="sthref104" name="sthref104"></a>Discriminator Column</td>
-<td align="left" headers="r2c1-t3 r1c2-t3">Name of the discriminator column when using a <span class="bold">Single</span> or <span class="bold">Joined</span> inheritance strategy.
-<p>This field corresponds to the <code>@DiscriminatorColumn</code> annotation.</p>
-</td>
-<td align="left" headers="r2c1-t3 r1c3-t3"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t3" headers="r1c1-t3">Discriminator Type</td>
-<td align="left" headers="r3c1-t3 r1c2-t3">Set the discriminator type to <code>Char</code> or <code>Integer</code> (instead of its default: <code>String</code>). The <span class="bold">Discriminator Value</span> must conform to this type.</td>
-<td align="left" headers="r3c1-t3 r1c3-t3">String</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t3" headers="r1c1-t3"><a id="sthref105" name="sthref105"></a><a id="sthref106" name="sthref106"></a>Discriminator Value</td>
-<td align="left" headers="r4c1-t3 r1c2-t3">Specify the discriminator value used to differentiate an entity in this inheritance hierarchy. The value must conform to the specified <span class="bold">Discriminator Type</span>.
-<p>This field corresponds to the <code>@DiscriminatorValue</code> annotation.</p>
-</td>
-<td align="left" headers="r4c1-t3 r1c3-t3"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t3" headers="r1c1-t3">Override Default</td>
-<td align="left" headers="r5c1-t3 r1c2-t3">Use this field to specify custom primary key join columns.
-<p>This field corresponds to the <code>@PrimaryKeyJoinClumn</code> annotation.</p>
-</td>
-<td align="left" headers="r5c1-t3 r1c3-t3"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-</ol>
-<p>Eclipse adds the following annotations the entity field:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-@Inheritance(strategy=InheritanceType.<span class="italic">&lt;INHERITANCE_STRATEGY&gt;</span>)
-@DiscriminatorColumn(name="<span class="italic">&lt;DISCRIMINATOR_COLUMN&gt;</span>",
-    discriminatorType=<span class="italic">&lt;DISCRIMINATOR_TYPE&gt;</span>)
-@DiscriminatorValue(value-"<span class="italic">&lt;DISCRIMINATOR_VALUE&gt;</span>")
-@PrimaryKeyJoinColumn(name="<span class="italic">&lt;JOIN_COLUMN_NAME&gt;</span>", 
-    referencedColumnName = "<span class="italic">&lt;REFERENCED_COLUMN_NAME&gt;</span>")
-
-
-</pre>
-<p><a id="sthref107" name="sthref107"></a><a id="sthref108" name="sthref108"></a><a id="sthref109" name="sthref109"></a>The following figures illustrates the different inheritance strategies.</p>
-<div class="figure"><a id="sthref110" name="sthref110"></a>
-<p class="titleinfigure">Single Table Inheritance</p>
-<img src="img/inheritance_single.png" alt="This figure illustrates entity inheritance in a single table." title="This figure illustrates entity inheritance in a single table." /><br /></div>
-<!-- class="figure" -->
-<div class="figure"><a id="sthref111" name="sthref111"></a>
-<p class="titleinfigure"><a id="sthref112" name="sthref112"></a><a id="sthref113" name="sthref113"></a>Joined Table Inheritance</p>
-<img src="img/inheritance_join.png" alt="This figure shows a sample joined inheritance table strategy." title="This figure shows a sample joined inheritance table strategy." /><br /></div>
-<!-- class="figure" -->
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_add_persistence.htm#BABHICAI">Adding persistence to a class</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_persistence.htm#BABCAHIC">Understanding Java persistence</a><br /></div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/task_manage_orm.htm b/jpa/plugins/org.eclipse.jpt.doc.user/task_manage_orm.htm
deleted file mode 100644
index c749d97..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/task_manage_orm.htm
+++ /dev/null
@@ -1,69 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:54 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Managing the orm.xml file</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Managing the orm.xml file" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CIHDGDCD" name="CIHDGDCD"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1><a id="sthref68" name="sthref68"></a>Managing the orm.xml file</h1>
-</td>
-</tr>
-</table>
-<p>When creating a JPA project, (see <a href="task_create_new_project.htm#CIHHEJCJ">"Creating a new JPA project"</a>) you can also create the <code>orm.xml</code> file that defines the mapping metadata and defaults.</p>
-<p><a id="sthref69" name="sthref69"></a>Eclipse creates the <code>META-INF\orm.xml</code> file in your project's directory:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;persistence version="<span class="italic">&lt;PERSISTENCE_VERSION&gt;</span>"
-      xmlns="http://java.sun.com/xml/ns/persistence"
-      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
-      http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"&gt;
-  &lt;persistence-unit name="<span class="italic">&lt;PERSISTENCE_UNIT_NAME&gt;</span>"&gt;
-    &lt;provider="<span class="italic">&lt;PERSISTENCE_PROVIDER&gt;</span>" /&gt;
-  &lt;/persistence-unit&gt;
-&lt;/persistence&gt;
-
-</pre>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_new_jpa_project_wizard.htm#CACBJGBG">Create New JPA Project wizard</a>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="tasks003.htm#CIHBCDCE">Working with orm.xml file</a><br />
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concepts003.htm#CHDBIJAC">The orm.xml file</a><br />
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/task_manage_persistence.htm b/jpa/plugins/org.eclipse.jpt.doc.user/task_manage_persistence.htm
deleted file mode 100644
index 18bd864..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/task_manage_persistence.htm
+++ /dev/null
@@ -1,69 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:53 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Managing the persistence.xml file</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Managing the persistence.xml file" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CIHDAJID" name="CIHDAJID"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1><a id="sthref57" name="sthref57"></a>Managing the persistence.xml file</h1>
-</td>
-</tr>
-</table>
-<p>When creating a JPA project, (see <a href="task_create_new_project.htm#CIHHEJCJ">"Creating a new JPA project"</a>) you can also create the <code>persistence.xml</code> file.</p>
-<p><a id="sthref58" name="sthref58"></a>Eclipse creates the <code>META-INF\persistence.xml</code> file in your project's directory:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;persistence version="<span class="italic">&lt;PERSISTENCE_VERSION&gt;</span>"
-      xmlns="http://java.sun.com/xml/ns/persistence"
-      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
-      http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"&gt;
-  &lt;persistence-unit name="<span class="italic">&lt;PERSISTENCE_UNIT_NAME&gt;</span>"&gt;
-    &lt;provider="<span class="italic">&lt;PERSISTENCE_PROVIDER&gt;</span>" /&gt;
-  &lt;/persistence-unit&gt;
-&lt;/persistence&gt;
-
-</pre>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_new_jpa_project_wizard.htm#CACBJGBG">Create New JPA Project wizard</a>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="tasks001.htm#CIHEJAIE">Working with persistence.xml file</a><br />
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concepts002.htm#CHDHAGIH">The persistence.xml file</a><br />
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/task_mapping.htm b/jpa/plugins/org.eclipse.jpt.doc.user/task_mapping.htm
deleted file mode 100644
index 8c1d6df..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/task_mapping.htm
+++ /dev/null
@@ -1,78 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:55 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Mapping an entity</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Mapping an entity" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABDGBIJ" name="BABDGBIJ"></a></p>
-<div class="sect1">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Mapping an entity</h1>
-</td>
-</tr>
-</table>
-<p>Dali supports the following mapping types for Java persistent entities:</p>
-<ul>
-<li type="disc">
-<p><a href="tasks007.htm#BABBABCE">Basic mapping</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks008.htm#BABCBHDF">Embedded mapping</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks009.htm#CIHDIAEE">Embedded ID mapping</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks010.htm#BABGCBHG">ID mapping</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks011.htm#BABEIEGD">Many-to-many mapping</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks012.htm#BABHFAFJ">Many-to-one mapping</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks013.htm#BABHGEBD">One-to-many mapping</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks014.htm#BABFHBCJ">One-to-one mapping</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks015.htm#BABHFHEI">Transient mapping</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks016.htm#BABHIBII">Version mapping</a></p>
-</li>
-</ul>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_mapping.htm#BABBDJFI">Understanding OR mappings</a> <!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks.htm
deleted file mode 100644
index 7209833..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks.htm
+++ /dev/null
@@ -1,74 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:53 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Tasks</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content=" Tasks" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="sthref48" name="sthref48"></a></p>
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Tasks</h1>
-</td>
-</tr>
-</table>
-<p>This section includes detailed step-by-step procedures for accessing the Dali OR mapping tool functionality.</p>
-<ul>
-<li type="disc">
-<p><a href="task_create_new_project.htm#CIHHEJCJ">Creating a new JPA project</a></p>
-</li>
-<li type="disc">
-<p><a href="task_manage_persistence.htm#CIHDAJID">Managing the persistence.xml file</a></p>
-</li>
-<li type="disc">
-<p><a href="task_manage_orm.htm#CIHDGDCD">Managing the orm.xml file</a></p>
-</li>
-<li type="disc">
-<p><a href="task_add_persistence.htm#BABHICAI">Adding persistence to a class</a></p>
-</li>
-<li type="disc">
-<p><a href="task_additonal_tables.htm#CIHGBIEI">Specifying additional tables</a></p>
-</li>
-<li type="disc">
-<p><a href="task_inheritance.htm#CIHCCCJD">Specifying entity inheritance</a></p>
-</li>
-<li type="disc">
-<p><a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks017.htm#BABBAGFI">Generating entities from tables</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks018.htm#BABFAIBA">Validating mappings and reporting problems</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks021.htm#BABDBCBI">Modifying persistent project properties</a></p>
-</li>
-</ul>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks001.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks001.htm
deleted file mode 100644
index 5b643a4..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks001.htm
+++ /dev/null
@@ -1,67 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:53 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Working with persistence.xml file</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Working with persistence.xml file" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CIHEJAIE" name="CIHEJAIE"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Working with persistence.xml file</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref59" name="sthref59"></a><a id="sthref60" name="sthref60"></a>You can work with the <code>persistence.xml</code> by using the XML Editor.</p>
-<p>Use this procedure to work with the <code>persistence.xml</code> file:</p>
-<ol type="1" start="1">
-<li>
-<p>Right-click the <code>persistence.xml</code> file in the <span class="gui-object-title">Package Explorer</span> and select <span class="gui-object-action">Open With &gt; XML Editor</span>.</p>
-<div class="figure"><a id="sthref61" name="sthref61"></a>
-<p class="titleinfigure">Opening the Persistence XML Editor</p>
-<img src="img/open_persistence_editor.png" alt="This figure shows the Open &gt; Persistence XML Editor option for the persistence.xml file." title="This figure shows the Open &gt; Persistence XML Editor option for the persistence.xml file." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p><a id="sthref62" name="sthref62"></a><a id="sthref63" name="sthref63"></a>Use the <span class="gui-object-title">Persistence XML Editor</span> to edit the <code>persistence.xml</code> file.</p>
-<div class="figure"><a id="sthref64" name="sthref64"></a>
-<p class="titleinfigure">Persistence XML Editor</p>
-<img src="img/persistence_xml_editor.png" alt="This figure shows the Persistence XML Editor." title="This figure shows the Persistence XML Editor." /><br /></div>
-<!-- class="figure" --></li>
-</ol>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="#CIHEJAIE">Working with persistence.xml file</a><br />
-<a href="../org.eclipse.wst.xmleditor.doc.user/topics/cworkXML.html">Working with XML Files</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concepts002.htm#CHDHAGIH">The persistence.xml file</a><br /></div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks002.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks002.htm
deleted file mode 100644
index 2f1129c..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks002.htm
+++ /dev/null
@@ -1,67 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:54 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Synchronizing classes</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Synchronizing classes" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CIHFEBAI" name="CIHFEBAI"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Synchronizing classes</h1>
-</td>
-</tr>
-</table>
-<p>As you work with the classes in your Java project, you will need to update the <code>persistence.xml</code> file to reflect the changes. <a id="sthref65" name="sthref65"></a><a id="sthref66" name="sthref66"></a></p>
-<p>Use this procedure to synchronize the <code>persistence.xml</code> file:</p>
-<ol type="1" start="1">
-<li>
-<p>Right-click the <code>persistence.xml</code> file in the <span class="gui-object-title">Package Explorer</span> and select <span class="gui-object-action">JPA Tools &gt; Synchronize Classes</span>.</p>
-<div class="figure"><a id="sthref67" name="sthref67"></a>
-<p class="titleinfigure">Synchronizing the persistence.xml File</p>
-<img src="img/synchornize_classes.png" alt="This figure shows the JPA Tools &gt; Synchronize Classes option." title="This figure shows the JPA Tools &gt; Synchronize Classes option." /><br /></div>
-<!-- class="figure" -->
-<p>Dali adds the necessary <code>&lt;class&gt;</code> elements to the <code>persistence.xml</code> file.</p>
-</li>
-<li>
-<p>Use the <span class="gui-object-title">Persistence XML Editor</span> to continue editing the <code>persistence.xml</code> file.</p>
-</li>
-</ol>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="tasks001.htm#CIHEJAIE">Working with persistence.xml file</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concepts002.htm#CHDHAGIH">The persistence.xml file</a><br />
-<br /></div>
-<!-- class="sect2" -->
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks003.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks003.htm
deleted file mode 100644
index c652365..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks003.htm
+++ /dev/null
@@ -1,68 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:54 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Working with orm.xml file</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Working with orm.xml file" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CIHBCDCE" name="CIHBCDCE"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Working with orm.xml file</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref70" name="sthref70"></a><a id="sthref71" name="sthref71"></a>You can work with the <code>orm.xml</code> by using the JPA Details view.</p>
-<p>Use this procedure to work with the <code>orm.xml</code> file:</p>
-<ol type="1" start="1">
-<li>
-<p>Right-click the <code>orm.xml</code> file in the <span class="gui-object-title">Package Explorer</span> and select <span class="gui-object-action">Open</span>.</p>
-</li>
-<li>
-<p>In the JPA Structure view, select <span class="bold">EntityMappings</span>.</p>
-</li>
-<li>
-<p>Use the JPA Details view to configure the entity mapping and persistence unit defaults.</p>
-<div class="figure"><a id="sthref72" name="sthref72"></a>
-<p class="titleinfigure">JPA Details view for EntityMappings (orm.xml)</p>
-<img src="img/details_entitymappings.png" alt="JPA Details view for orm.xml file." title="JPA Details view for orm.xml file." /><br /></div>
-<!-- class="figure" --></li>
-</ol>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="#CIHBCDCE">Working with orm.xml file</a><br />
-<a href="../org.eclipse.wst.xmleditor.doc.user/topics/cworkXML.html">Working with XML Files</a><br />
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concepts003.htm#CHDBIJAC">The orm.xml file</a><br /></div>
-<!-- class="sect2" -->
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks004.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks004.htm
deleted file mode 100644
index 1330b04..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks004.htm
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:54 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Entity</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Entity" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABGBIEE" name="BABGBIEE"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Entity</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref76" name="sthref76"></a><a id="sthref77" name="sthref77"></a><a id="sthref78" name="sthref78"></a><a id="sthref79" name="sthref79"></a>An <span class="bold">Entity</span> is a persistent domain object.</p>
-<p>An entity <span class="italic">can be</span>:</p>
-<ul>
-<li type="disc">
-<p>Abstract or concrete classes. Entities may also extend non-entity classes as well as entity classes, and non-entity classes may extend entity classes.</p>
-</li>
-</ul>
-<p>An entity <span class="italic">must have</span>:</p>
-<ul>
-<li type="disc">
-<p>A no-arg constructor (public or protected); the entity class may have other constructors as well.</p>
-</li>
-</ul>
-<p><a id="sthref80" name="sthref80"></a><a id="sthref81" name="sthref81"></a><a id="sthref82" name="sthref82"></a>Each persistent entity must be mapped to a database table and contain a primary key. Persistent entities are identified by the <code>@Entity</code> annotation.</p>
-<p>Use this procedure to add persistence to an existing entity:</p>
-<ol type="1" start="1">
-<li>
-<p>Open the Java class in the <span class="gui-object-title">Package Explorer.</span></p>
-</li>
-<li>
-<p>Select the class in the JPA Structure view.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">JPA Details</span> view, use the <span class="gui-object-action">Map As</span> field to select <span class="gui-object-action">Entity</span>.</p>
-<div class="figure"><a id="sthref83" name="sthref83"></a>
-<p class="titleinfigure">Selecting Entity Persistence</p>
-<img src="img/persistence_view_entity.png" alt="Selecting entity persistence on the JPA Details view." title="Selecting entity persistence on the JPA Details view." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>Complete the remaining <a href="ref_persistence_prop_view.htm#BABFAEBB">JPA Details view (for entities)</a>.</p>
-</li>
-</ol>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related tasks" title="Related tasks" /><br />
-<br />
-<a href="task_add_persistence.htm#BABHICAI">Adding persistence to a class</a><br />
-<a href="task_additonal_tables.htm#CIHGBIEI">Specifying additional tables</a><br />
-<a href="task_inheritance.htm#CIHCCCJD">Specifying entity inheritance</a><br /></div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks005.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks005.htm
deleted file mode 100644
index 4fea3e0..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks005.htm
+++ /dev/null
@@ -1,72 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:54 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Embeddable</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Embeddable" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABFEICE" name="BABFEICE"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Embeddable</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref84" name="sthref84"></a><a id="sthref85" name="sthref85"></a>An <span class="bold">Embedded</span> class is a class whose instances are stored as part of an owning entity; it shares the identity of the owning entity. Each field of the embedded class is mapped to the database table associated with the owning entity.</p>
-<p>To override the mapping information for a specific subclass, use the <code>@AttributeOverride</code> annotation for that specific class.</p>
-<p><a id="sthref86" name="sthref86"></a><a id="sthref87" name="sthref87"></a><a id="sthref88" name="sthref88"></a>An embeddable entity is identified by the <code>@Embeddable</code> annotation.</p>
-<p>Use this procedure to add embeddable persistence to an existing entity:</p>
-<ol type="1" start="1">
-<li>
-<p>Open the Java class in the <span class="gui-object-title">Package Explorer</span>.</p>
-</li>
-<li>
-<p>Select the class in the JPA Structure view.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">JPA Details</span> view, use the <span class="gui-object-action">Map As</span> drop-list to select <span class="gui-object-action">Embeddable</span>.</p>
-<div class="figure"><a id="sthref89" name="sthref89"></a>
-<p class="titleinfigure">Selecting Embeddable Persistence</p>
-<img src="img/persistence_view_embedded.png" alt="Selecting embedded persistence on the JPA Details view." title="Selecting embedded persistence on the JPA Details view." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>Complete the remaining <a href="ref_persistence_prop_view.htm#BABFAEBB">JPA Details view (for entities)</a>.</p>
-</li>
-</ol>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related tasks" title="Related tasks" /><br />
-<dl>
-<dd><a href="task_add_persistence.htm#BABHICAI">Adding persistence to a class</a></dd>
-<dd><a href="task_additonal_tables.htm#CIHGBIEI">Specifying additional tables</a></dd>
-<dd><a href="task_inheritance.htm#CIHCCCJD">Specifying entity inheritance</a></dd>
-</dl>
-</div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks006.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks006.htm
deleted file mode 100644
index 0012aa2..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks006.htm
+++ /dev/null
@@ -1,86 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:54 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Mapped superclass</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Mapped superclass" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABDAGCI" name="BABDAGCI"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Mapped superclass</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref90" name="sthref90"></a><a id="sthref91" name="sthref91"></a>An entities that extend a <span class="bold">Mapped Superclass</span> class inherit the persistent state and mapping information from a superclass. You should use a mapped superclass to define mapping information that is common to multiple entity classes.</p>
-<p>A mapped superclass <span class="italic">can be</span>:</p>
-<ul>
-<li type="disc">
-<p>Abstract or concrete classes</p>
-</li>
-</ul>
-<p>A mapped superclass <span class="italic">cannot be</span>:</p>
-<ul>
-<li type="disc">
-<p>Be queried or passed as an argument to Entity-Manager or Query operations</p>
-</li>
-<li type="disc">
-<p>Be the target of a persistent relationship</p>
-</li>
-</ul>
-<p>A mapped superclass does not have a defined database table. Instead, its mapping information is derived from its superclass. To override the mapping information for a specific subclass, use the <code>@AttributeOverride</code> annotation for that specific class.</p>
-<p><a id="sthref92" name="sthref92"></a><a id="sthref93" name="sthref93"></a><a id="sthref94" name="sthref94"></a><a id="sthref95" name="sthref95"></a>A mapped superclass is identified by the <code>@MappedSuperclass</code> annotation.</p>
-<p>Use this procedure to add Mapped Superclass persistence to an existing entity:</p>
-<ol type="1" start="1">
-<li>
-<p>Open the Java class in the <span class="gui-object-title">Package Explorer</span>.</p>
-</li>
-<li>
-<p>Select the class in the JPA Structure view.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">JPA Details</span> view, use the <span class="gui-object-action">Map As</span> drop-list to select <span class="gui-object-action">Mapped Superclass</span>.</p>
-<div class="figure"><a id="sthref96" name="sthref96"></a>
-<p class="titleinfigure">Selecting Mapped Superclass Persistence</p>
-<img src="img/persistence_view_mappedsprc.png" alt="Selecting embedded persistence on the JPA Details view." title="Selecting embedded persistence on the JPA Details view." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>Complete the remaining <a href="ref_persistence_prop_view.htm#BABFAEBB">JPA Details view (for entities)</a>.</p>
-</li>
-</ol>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related tasks" title="Related tasks" /><br />
-<br />
-<a href="task_add_persistence.htm#BABHICAI">Adding persistence to a class</a><br />
-<a href="task_additonal_tables.htm#CIHGBIEI">Specifying additional tables</a><br />
-<a href="task_inheritance.htm#CIHCCCJD">Specifying entity inheritance</a><br /></div>
-<!-- class="sect2" -->
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks007.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks007.htm
deleted file mode 100644
index 4ad3ef6..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks007.htm
+++ /dev/null
@@ -1,206 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:55 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Basic mapping</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Basic mapping" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABBABCE" name="BABBABCE"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Basic mapping</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref114" name="sthref114"></a><a id="sthref115" name="sthref115"></a><a id="sthref116" name="sthref116"></a><a id="sthref117" name="sthref117"></a>Use a <span class="bold">Basic Mapping</span> to map an attribute directly to a database column. Basic mappings may be used only with the following attribute types:</p>
-<ul>
-<li type="disc">
-<p>Java primitive types and wrappers of the primitive types</p>
-</li>
-<li type="disc">
-<p><code>java.lang.String, java.math.BigInteger</code></p>
-</li>
-<li type="disc">
-<p><code>java.math.BigDecimal</code></p>
-</li>
-<li type="disc">
-<p><code>java.util.Date</code></p>
-</li>
-<li type="disc">
-<p><code>java.util.Calendar, java.sql.Date</code></p>
-</li>
-<li type="disc">
-<p><code>java.sql.Time</code></p>
-</li>
-<li type="disc">
-<p><code>java.sql.Timestamp</code></p>
-</li>
-<li type="disc">
-<p><code>byte[]</code></p>
-</li>
-<li type="disc">
-<p><code>Byte[]</code></p>
-</li>
-<li type="disc">
-<p><code>char[]</code></p>
-</li>
-<li type="disc">
-<p><code>Character[]</code></p>
-</li>
-<li type="disc">
-<p>enums</p>
-</li>
-<li type="disc">
-<p>any other type that implements <code>Serializable</code></p>
-</li>
-</ul>
-<p>To create a basic mapping:</p>
-<ol type="1" start="1">
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the field to map. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the selected field.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">Basic</span>.</p>
-</li>
-<li>
-<p>Use this table to complete the remaining fields on the <span class="gui-object-title">JPA Details</span> view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the Persistence Properties view for this mapping." summary="This table lists the fields in the Persistence Properties view for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t4">Property</th>
-<th align="left" valign="bottom" id="r1c2-t4">Description</th>
-<th align="left" valign="bottom" id="r1c3-t4">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t4" headers="r1c1-t4">Map As</td>
-<td align="left" headers="r2c1-t4 r1c2-t4">Defines this mapping as a <span class="bold">Basic Mapping</span>.
-<p>This field corresponds to the <code>@Basic</code> annotation.</p>
-</td>
-<td align="left" headers="r2c1-t4 r1c3-t4">Basic</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t4" headers="r1c1-t4">Column</td>
-<td align="left" headers="r3c1-t4 r1c2-t4">The database column mapped to the entity attribute. See <a href="ref_mapping_general.htm#CACGCBHB">"Column"</a> for details.
-<ul>
-<li type="disc">
-<p>Name - Name of the database column.</p>
-</li>
-<li type="disc">
-<p>Table - Name of the database table.</p>
-</li>
-<li type="disc">
-<p>Insertable - Specify if the column is always included in <code>SQL INSERT</code> statements.</p>
-</li>
-<li type="disc">
-<p>Updatable - Specify if the column is always included in <code>SQL UPDATE</code> statements.</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r3c1-t4 r1c3-t4">By default, the Column is assumed to be named identically to the attribute and always included in the <code>INSERT</code> and <code>UPDATE</code> statements.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t4" headers="r1c1-t4">Table</td>
-<td align="left" headers="r4c1-t4 r1c2-t4">Name of the database table.</td>
-<td align="left" headers="r4c1-t4 r1c3-t4"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t4" headers="r1c1-t4">Fetch</td>
-<td align="left" headers="r5c1-t4 r1c2-t4">Defines how data is loaded from the database. See <a href="ref_mapping_general.htm#CACGGGHB">"Fetch Type"</a> for details.
-<ul>
-<li type="disc">
-<p>Eager</p>
-</li>
-<li type="disc">
-<p>Lazy</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r5c1-t4 r1c3-t4">Eager</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r6c1-t4" headers="r1c1-t4">Optional</td>
-<td align="left" headers="r6c1-t4 r1c2-t4">Specifies if this field is can be null.</td>
-<td align="left" headers="r6c1-t4 r1c3-t4">Yes</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r7c1-t4" headers="r1c1-t4">Lob</td>
-<td align="left" headers="r7c1-t4 r1c2-t4">Specifies if this is a large objects (BLOB or CLOB). See <a href="ref_mapping_general.htm#CACBBIBI">"Lob"</a> for details.</td>
-<td align="left" headers="r7c1-t4 r1c3-t4"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r8c1-t4" headers="r1c1-t4">Temporal</td>
-<td align="left" headers="r8c1-t4 r1c2-t4">Specifies the type of data. See <a href="ref_mapping_general.htm#CACEAJGD">"Temporal"</a> for details.
-<ul>
-<li type="disc">
-<p>Date</p>
-</li>
-<li type="disc">
-<p>Time</p>
-</li>
-<li type="disc">
-<p>Timestamp</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r8c1-t4 r1c3-t4"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-</ol>
-<p>Eclipse adds the following annotations to the field:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-@Column(name="<span class="italic">&lt;COLUMN_NAME&gt;</span>", table="<span class="italic">&lt;COLUMN_TABLE&gt;</span>", 
-    insertable=<span class="italic">&lt;INSERTABLE&gt;</span>, updatable=<span class="italic">&lt;UPDATABLE&gt;</span>)
-@Basic(fetch=FetchType.<span class="italic">&lt;FETCH_TYPE&gt;</span>, optional = <span class="italic">&lt;OPTIONAL&gt;</span>)
-@Temporal(TemporalType.<span class="italic">&lt;TEMPORAL&gt;</span>)
-
-
-</pre>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a><br />
-<a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_mapping.htm#BABBDJFI">Understanding OR mappings</a><br />
-<a href="concepts001.htm#BABBGFJG">Understanding EJB 3.0 Java Persistence API</a></div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks008.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks008.htm
deleted file mode 100644
index bdbba71..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks008.htm
+++ /dev/null
@@ -1,120 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:55 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Embedded mapping</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Embedded mapping" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABCBHDF" name="BABCBHDF"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Embedded mapping</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref118" name="sthref118"></a><a id="sthref119" name="sthref119"></a><a id="sthref120" name="sthref120"></a><a id="sthref121" name="sthref121"></a>Use an <span class="bold">Embedded Mapping</span> to specify a persistent field or property of an entity whose value is an instance of an embeddable class.</p>
-<ol type="1" start="1">
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the field to map. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the selected field.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">Embedded</span>.</p>
-</li>
-<li>
-<p>Use this table to complete the remaining fields on the <span class="gui-object-title">JPA Details</span> view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the Persistence Properties view for this mapping." summary="This table lists the fields in the Persistence Properties view for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t5">Property</th>
-<th align="left" valign="bottom" id="r1c2-t5">Description</th>
-<th align="left" valign="bottom" id="r1c3-t5">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t5" headers="r1c1-t5">Map As</td>
-<td align="left" headers="r2c1-t5 r1c2-t5">Defines this mapping as a <span class="bold">Embedded</span>.
-<p>This field corresponds to the <code>@Embedded</code> annotation.</p>
-</td>
-<td align="left" headers="r2c1-t5 r1c3-t5">Embedded</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t5" headers="r1c1-t5">Attribute Overrides</td>
-<td align="left" headers="r3c1-t5 r1c2-t5">Specify to override the default mapping of an entity's attribute. Select <span class="bold">Override Default</span>.</td>
-<td align="left" headers="r3c1-t5 r1c3-t5"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t5" headers="r1c1-t5">Columns</td>
-<td align="left" headers="r4c1-t5 r1c2-t5">The database column (and its table) mapped to the entity attribute. See <a href="ref_mapping_general.htm#CACGCBHB">"Column"</a> for details.
-<ul>
-<li type="disc">
-<p>Name - Name of the database column.</p>
-</li>
-<li type="disc">
-<p>Table - Name of the database table.</p>
-</li>
-<li type="disc">
-<p>Insertable - Specify if the column is always included in <code>SQL INSERT</code> statements.</p>
-</li>
-<li type="disc">
-<p>Updatable - Specify if the column is always included in <code>SQL UPDATE</code> statements.</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r4c1-t5 r1c3-t5"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-</ol>
-<p>Eclipse adds the following annotations to the field:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-@Embedded
-@AttributeOverride(column=@Column(table="<span class="italic">&lt;COLUMN_TABLE&gt;</span>", name = "<span class="italic">&lt;COLUMN_NAME&gt;</span>"))
-
-</pre>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a><br />
-<a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_mapping.htm#BABBDJFI">Understanding OR mappings</a><br />
-<a href="concepts001.htm#BABBGFJG">Understanding EJB 3.0 Java Persistence API</a></div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks009.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks009.htm
deleted file mode 100644
index 6999dd1..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks009.htm
+++ /dev/null
@@ -1,94 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:55 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Embedded ID mapping</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Embedded ID mapping" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CIHDIAEE" name="CIHDIAEE"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Embedded ID mapping</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref122" name="sthref122"></a><a id="sthref123" name="sthref123"></a><a id="sthref124" name="sthref124"></a><a id="sthref125" name="sthref125"></a>Use an <span class="bold">Embedded ID Mapping</span> to specify the primary key of an embedded ID. These mappings may be used with a <a href="tasks005.htm#BABFEICE">Embeddable</a> entities.</p>
-<ol type="1" start="1">
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the field to map. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the selected field.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">Embedded Id</span>.</p>
-</li>
-<li>
-<p>Use this table to complete the remaining fields on the <span class="gui-object-title">JPA Details</span> view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the Persistence Properties view for this mapping." summary="This table lists the fields in the Persistence Properties view for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t6">Property</th>
-<th align="left" valign="bottom" id="r1c2-t6">Description</th>
-<th align="left" valign="bottom" id="r1c3-t6">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t6" headers="r1c1-t6">Map As</td>
-<td align="left" headers="r2c1-t6 r1c2-t6">Defines this mapping as a <span class="bold">Embedded Id</span>.
-<p>This field corresponds to the <code>@EmbeddedId</code> annotation.</p>
-</td>
-<td align="left" headers="r2c1-t6 r1c3-t6">Embedded Id</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-</ol>
-<p>Eclipse adds the following annotations to the field:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-@EmbeddedId
-
-</pre>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a><br />
-<a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_mapping.htm#BABBDJFI">Understanding OR mappings</a><br />
-<a href="concepts001.htm#BABBGFJG">Understanding EJB 3.0 Java Persistence API</a></div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks010.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks010.htm
deleted file mode 100644
index 5472078..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks010.htm
+++ /dev/null
@@ -1,176 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:55 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>ID mapping</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="ID mapping" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABGCBHG" name="BABGCBHG"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>ID mapping</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref126" name="sthref126"></a><a id="sthref127" name="sthref127"></a><a id="sthref128" name="sthref128"></a><a id="sthref129" name="sthref129"></a>Use an <span class="bold">ID Mapping</span> to specify the primary key of an entity. ID mappings may be used with a <a href="tasks004.htm#BABGBIEE">Entity</a> or <a href="tasks006.htm#BABDAGCI">Mapped superclass</a>. Each <a href="tasks004.htm#BABGBIEE">Entity</a> must have an ID mapping.</p>
-<ol type="1" start="1">
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the field to map. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the selected.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">ID</span>.</p>
-</li>
-<li>
-<p>Use this table to complete the <a href="ref_mapping_general.htm#CACBHFIJ">General information</a> fields in the <span class="gui-object-title">JPA Details</span> view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the Persistence Properties view for this mapping." summary="This table lists the fields in the Persistence Properties view for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t7">Property</th>
-<th align="left" valign="bottom" id="r1c2-t7">Description</th>
-<th align="left" valign="bottom" id="r1c3-t7">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t7" headers="r1c1-t7">Map As</td>
-<td align="left" headers="r2c1-t7 r1c2-t7">Defines this mapping as an <span class="bold">ID Mapping</span>.
-<p>This field corresponds to the <code>@Id</code> annotation.</p>
-</td>
-<td align="left" headers="r2c1-t7 r1c3-t7">ID</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t7" headers="r1c1-t7">Column</td>
-<td align="left" headers="r3c1-t7 r1c2-t7">The database column mapped to the entity attribute. See <a href="ref_mapping_general.htm#CACGCBHB">"Column"</a> for details.</td>
-<td align="left" headers="r3c1-t7 r1c3-t7">By default, the Column is assumed to be named identically to the attribute.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t7" headers="r1c1-t7">Table</td>
-<td align="left" headers="r4c1-t7 r1c2-t7">The database table mapped to the entity attribute.</td>
-<td align="left" headers="r4c1-t7 r1c3-t7">By default, the Table is assumed to be identical to the table associated with the entity.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t7" headers="r1c1-t7">Temporal</td>
-<td align="left" headers="r5c1-t7 r1c2-t7">Specifies the type of data. See <a href="ref_mapping_general.htm#CACEAJGD">"Temporal"</a> for details.
-<ul>
-<li type="disc">
-<p>Date</p>
-</li>
-<li type="disc">
-<p>Time</p>
-</li>
-<li type="disc">
-<p>Timestamp</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r5c1-t7 r1c3-t7"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-<li>
-<p>Use this table to complete the fields in <a href="ref_primary_key.htm#CACFCCAB">Primary Key Generation information</a> area in the <span class="gui-object-title">JPA Details</span> view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the PK Generation tab." summary="This table lists the fields in the PK Generation tab." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t8">Property</th>
-<th align="left" valign="bottom" id="r1c2-t8">Description</th>
-<th align="left" valign="bottom" id="r1c3-t8">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t8" headers="r1c1-t8">Primary Key Generation</td>
-<td align="left" headers="r2c1-t8 r1c2-t8">These fields define how the primary key is generated.</td>
-<td align="left" headers="r2c1-t8 r1c3-t8"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t8" headers="r1c1-t8">&nbsp;&nbsp;Strategy</td>
-<td align="left" headers="r3c1-t8 r1c2-t8">See <a href="ref_primary_key.htm#CACBAJBC">"Primary Key Generation"</a> for details.
-<ul>
-<li type="disc">
-<p>Auto</p>
-</li>
-<li type="disc">
-<p>Sequence</p>
-</li>
-<li type="disc">
-<p>Identity</p>
-</li>
-<li type="disc">
-<p>Table</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r3c1-t8 r1c3-t8">Auto</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t8" headers="r1c1-t8">&nbsp;&nbsp;Generator&nbsp;Name</td>
-<td align="left" headers="r4c1-t8 r1c2-t8">Name of the primary key generator specified in the <span class="bold">Strategy</span></td>
-<td align="left" headers="r4c1-t8 r1c3-t8"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-</ol>
-<p>Additional fields will appear in the <a href="ref_primary_key.htm#CACFCCAB">Primary Key Generation information</a> area, depending on the selected Strategy. See <a href="ref_persistence_map_view.htm#BABIFBAF">"JPA Details view (for attributes)"</a> for additional information.</p>
-<p>Eclipse adds the following annotations to the field:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-@Id
-@Column(name="<span class="italic">&lt;COLUMN_NAME&gt;</span>", table="<span class="italic">&lt;TABLE_NAME&gt;</span>", insertable=<span class="italic">&lt;INSERTABLE&gt;</span>,
-    updatable=<span class="italic">&lt;UPDATABLE&gt;</span>)
-@Temporal(<span class="italic">&lt;TEMPORAL&gt;</span>)
-@GeneratedValue(strategy=GeneratorType.<span class="italic">&lt;STRATEGY&gt;</span>, generator="<span class="italic">&lt;GENERATOR_NAME&gt;</span>")@TableGenerator(name="<span class="italic">&lt;TABLE_GENERATOR_NAME&gt;</span>", table = "<span class="italic">&lt;TABLE_GENERATOR_TABLE&gt;</span>", 
-    pkColumnName = "<span class="italic">&lt;TABLE_GENERATOR_PK&gt;</span>", 
-    valueColumnName = "<span class="italic">&lt;TABLE_GENERATOR_VALUE_COLUMN&gt;</span>", 
-    pkColumnValue = "<span class="italic">&lt;TABLE_GENERATOR_PK_COLUMN_VALUE&gt;</span>")@SequenceGenerator(name="<span class="italic">&lt;SEQUENCE_GENERATOR_NAME&gt;</span>", 
-    sequenceName="<span class="italic">&lt;SEQUENCE_GENERATOR_SEQUENCE&gt;</span>")
-
-</pre>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a><br />
-<a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_mapping.htm#BABBDJFI">Understanding OR mappings</a><br />
-<a href="concepts001.htm#BABBGFJG">Understanding EJB 3.0 Java Persistence API</a></div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks011.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks011.htm
deleted file mode 100644
index ae12cc0..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks011.htm
+++ /dev/null
@@ -1,179 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:55 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Many-to-many mapping</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Many-to-many mapping" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABEIEGD" name="BABEIEGD"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Many-to-many mapping</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref130" name="sthref130"></a><a id="sthref131" name="sthref131"></a><a id="sthref132" name="sthref132"></a><a id="sthref133" name="sthref133"></a>Use a <span class="bold">Many-to-Many Mapping</span> to define a many-valued association with many-to-many multiplicity. A many-to-many mapping has two sides: the <span class="italic">owning side</span> and <span class="italic">non-owning side</span>. You must specify the join table on the owning side. For bidirectional mappings, either side may be the owning side.</p>
-<ol type="1" start="1">
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the field to map. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the selected.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">Many-to-Many</span>.</p>
-</li>
-<li>
-<p>Use this table to complete the <a href="ref_mapping_general.htm#CACBHFIJ">General information</a> fields of the <span class="gui-object-title">JPA Details</span> view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the Persistence Properties view for this mapping." summary="This table lists the fields in the Persistence Properties view for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t9">Property</th>
-<th align="left" valign="bottom" id="r1c2-t9">Description</th>
-<th align="left" valign="bottom" id="r1c3-t9">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t9" headers="r1c1-t9">Map As</td>
-<td align="left" headers="r2c1-t9 r1c2-t9">Defines this mapping as a <span class="bold">Many to Many Mapping</span>.
-<p>This field corresponds to the <code>@ManyToMany</code> annotation.</p>
-</td>
-<td align="left" headers="r2c1-t9 r1c3-t9">Many to Many</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t9" headers="r1c1-t9">Target Entity</td>
-<td align="left" headers="r3c1-t9 r1c2-t9">The entity to which this attribute is mapped.</td>
-<td align="left" headers="r3c1-t9 r1c3-t9">null
-<p>You do not need to explicitly specify the target entity, since it can be inferred from the type of object being referenced.</p>
-</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t9" headers="r1c1-t9">Fetch</td>
-<td align="left" headers="r4c1-t9 r1c2-t9">Defines how data is loaded from the database. See <a href="ref_mapping_general.htm#CACGGGHB">"Fetch Type"</a> for details.
-<ul>
-<li type="disc">
-<p>Eager</p>
-</li>
-<li type="disc">
-<p>Lazy</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r4c1-t9 r1c3-t9">Lazy</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t9" headers="r1c1-t9">Mapped By</td>
-<td align="left" headers="r5c1-t9 r1c2-t9">The database field that owns the relationship.</td>
-<td align="left" headers="r5c1-t9 r1c3-t9"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r6c1-t9" headers="r1c1-t9">Order By</td>
-<td align="left" headers="r6c1-t9 r1c2-t9">Specify the default order for objects returned from a query. See <a href="ref_mapping_general.htm#CACDADIH">"Order By"</a> for details.
-<ul>
-<li type="disc">
-<p>No ordering</p>
-</li>
-<li type="disc">
-<p>Primary key</p>
-</li>
-<li type="disc">
-<p>Custom</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r6c1-t9 r1c3-t9">No ordering</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-<li>
-<p>Use this table to complete the fields in the <a href="reference006.htm#CACBAEBC">Join Table Information</a> area in the <span class="gui-object-title">JPA Details</span> view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the Join Table tab of the Persistence Properties view for this mapping." summary="This table lists the fields in the Join Table tab of the Persistence Properties view for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t10">Property</th>
-<th align="left" valign="bottom" id="r1c2-t10">Description</th>
-<th align="left" valign="bottom" id="r1c3-t10">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t10" headers="r1c1-t10">Name</td>
-<td align="left" headers="r2c1-t10 r1c2-t10">Name of the join table that contains the foreign key column.</td>
-<td align="left" headers="r2c1-t10 r1c3-t10">You must specify the join table on the owning side.
-<p>By default, the name is assumed to be the primary tables associated with the entities concatenated with an underscore.</p>
-</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t10" headers="r1c1-t10">Join Columns</td>
-<td align="left" headers="r3c1-t10 r1c2-t10">Select <span class="bold">Override Default</span>, then Add, Edit, or Remove the join columns.</td>
-<td align="left" headers="r3c1-t10 r1c3-t10">By default, the name is assumed to be the primary tables associated with the entities concatenated with an underscore.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t10" headers="r1c1-t10">Inverse Join Columns</td>
-<td align="left" headers="r4c1-t10 r1c2-t10">Select <span class="bold">Override Default</span>, then Add, Edit, or Remove the join columns.</td>
-<td align="left" headers="r4c1-t10 r1c3-t10">By default, the mapping is assumed to have a single join.</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-<li>
-<p>To add a new Join or Inverse Join Column, click <span class="gui-object-action">Add</span>.</p>
-<p>To edit an existing Join or Inverse Join Column, select the field to and click <span class="gui-object-action">Edit</span>.</p>
-</li>
-</ol>
-<p>Eclipse adds the following annotations to the field:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-@JoinTable(joinColumns=@JoinColumn(name="<span class="italic">&lt;JOIN_COLUMN&gt;</span>"), 
-    name = "<span class="italic">&lt;JOIN_TABLE_NAME&gt;</span>")
-@ManyToMany(cascade=CascadeType.<span class="italic">&lt;CASCADE_TYPE&gt;</span>, fetch=FetchType.<span class="italic">&lt;FETCH_TYPE&gt;</span>,
-    targetEntity=<span class="italic">&lt;TARGET_ENTITY&gt;</span>, mappedBy = "<span class="italic">&lt;MAPPED_BY&gt;</span>")
-@OrderBy("<span class="italic">&lt;ORDER_BY&gt;</span>")
-
-
-</pre>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a><br />
-<a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_mapping.htm#BABBDJFI">Understanding OR mappings</a><br />
-<a href="concepts001.htm#BABBGFJG">Understanding EJB 3.0 Java Persistence API</a></div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks012.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks012.htm
deleted file mode 100644
index 82abc53..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks012.htm
+++ /dev/null
@@ -1,134 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:55 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Many-to-one mapping</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Many-to-one mapping" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABHFAFJ" name="BABHFAFJ"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Many-to-one mapping</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref134" name="sthref134"></a><a id="sthref135" name="sthref135"></a><a id="sthref136" name="sthref136"></a><a id="sthref137" name="sthref137"></a>Use a <span class="bold">Many-to-One</span> mapping to defines a single-valued association to another entity class that has many-to-one multiplicity.</p>
-<ol type="1" start="1">
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the field to map. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the selected.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">Many-to-One</span>.</p>
-</li>
-<li>
-<p>Use this table to complete the <a href="ref_mapping_general.htm#CACBHFIJ">General information</a> fields JPA Details view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields ion the General tab for this mapping." summary="This table lists the fields ion the General tab for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t11">Property</th>
-<th align="left" valign="bottom" id="r1c2-t11">Description</th>
-<th align="left" valign="bottom" id="r1c3-t11">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t11" headers="r1c1-t11">Target Entity</td>
-<td align="left" headers="r2c1-t11 r1c2-t11">The entity to which this attribute is mapped.</td>
-<td align="left" headers="r2c1-t11 r1c3-t11">null
-<p>You do not need to explicitly specify the target entity, since it can be inferred from the type of object being referenced.</p>
-</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t11" headers="r1c1-t11">Fetch Type</td>
-<td align="left" headers="r3c1-t11 r1c2-t11">Defines how data is loaded from the database. See <a href="ref_mapping_general.htm#CACGGGHB">"Fetch Type"</a> for details.
-<ul>
-<li type="disc">
-<p>Eager</p>
-</li>
-<li type="disc">
-<p>Lazy</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r3c1-t11 r1c3-t11">Eager</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-<li>
-<p>Use this table to complete the fields on the <a href="reference007.htm#CACFCEJC">Join Columns Information</a> tab in the <span class="gui-object-title">JPA Details</span> view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the Persistence Properties view for this mapping." summary="This table lists the fields in the Persistence Properties view for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t12">Property</th>
-<th align="left" valign="bottom" id="r1c2-t12">Description</th>
-<th align="left" valign="bottom" id="r1c3-t12">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t12" headers="r1c1-t12">Join Column</td>
-<td align="left" headers="r2c1-t12 r1c2-t12"><a id="sthref138" name="sthref138"></a><a id="sthref139" name="sthref139"></a>Specify a mapped column for joining an entity association. This field corresponds to the <code>@JoinColum</code> attribute.
-<p>Select <span class="bold">Override Default</span>, then Add, Edit, or Remove the join columns.</p>
-</td>
-<td align="left" headers="r2c1-t12 r1c3-t12">By default, the mapping is assumed to have a single join.</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-</ol>
-<p>Eclipse adds the following annotations to the field:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-@JoinTable(joinColumns=@JoinColumn(name="<span class="italic">&lt;JOIN_COLUMN&gt;</span>"), 
-    name = "<span class="italic">&lt;JOIN_TABLE_NAME&gt;</span>")
-@ManyToOne(targetEntity=<span class="italic">&lt;TARGET_ENTITY&gt;</span>, fetch=<span class="italic">&lt;FETCH_TYPE&gt;</span>, 
-    cascade=<span class="italic">&lt;CASCADE_TYPE&gt;</span>)
-
-</pre>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a><br />
-<a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_mapping.htm#BABBDJFI">Understanding OR mappings</a><br />
-<a href="concepts001.htm#BABBGFJG">Understanding EJB 3.0 Java Persistence API</a></div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks013.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks013.htm
deleted file mode 100644
index 5c5ac09..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks013.htm
+++ /dev/null
@@ -1,169 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:55 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>One-to-many mapping</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="One-to-many mapping" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABHGEBD" name="BABHGEBD"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>One-to-many mapping</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref140" name="sthref140"></a><a id="sthref141" name="sthref141"></a><a id="sthref142" name="sthref142"></a><a id="sthref143" name="sthref143"></a>Use a <span class="bold">One-to-Many Mapping</span> to define a relationship with one-to-many multiplicity.</p>
-<ol type="1" start="1">
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the field to map. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the selected.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">One-to-many</span>.</p>
-</li>
-<li>
-<p>Use this table to complete the <a href="ref_mapping_general.htm#CACBHFIJ">General information</a> fields JPA Details view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the General tab of the Persistence Properties view for this mapping." summary="This table lists the fields in the General tab of the Persistence Properties view for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t13">Property</th>
-<th align="left" valign="bottom" id="r1c2-t13">Description</th>
-<th align="left" valign="bottom" id="r1c3-t13">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t13" headers="r1c1-t13">Target Entity</td>
-<td align="left" headers="r2c1-t13 r1c2-t13">The entity to which this attribute is mapped.</td>
-<td align="left" headers="r2c1-t13 r1c3-t13"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t13" headers="r1c1-t13">Fetch Type</td>
-<td align="left" headers="r3c1-t13 r1c2-t13">Defines how data is loaded from the database. See <a href="ref_mapping_general.htm#CACGGGHB">"Fetch Type"</a> for details.
-<ul>
-<li type="disc">
-<p>Eager</p>
-</li>
-<li type="disc">
-<p>Lazy</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r3c1-t13 r1c3-t13">Eager</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t13" headers="r1c1-t13">Mapped By</td>
-<td align="left" headers="r4c1-t13 r1c2-t13">The database field that owns the relationship.</td>
-<td align="left" headers="r4c1-t13 r1c3-t13"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r5c1-t13" headers="r1c1-t13">Order By</td>
-<td align="left" headers="r5c1-t13 r1c2-t13">Specify the default order for objects returned from a query. See <a href="ref_mapping_general.htm#CACDADIH">"Order By"</a> for details.
-<ul>
-<li type="disc">
-<p>No ordering</p>
-</li>
-<li type="disc">
-<p>Primary key</p>
-</li>
-<li type="disc">
-<p>Custom</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r5c1-t13 r1c3-t13">No ordering</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-<li>
-<p>Use this table to complete the <a href="reference006.htm#CACBAEBC">Join Table Information</a> fields in the JPA Details view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the Join Table tab of the Persistence Properties view for this mapping." summary="This table lists the fields in the Join Table tab of the Persistence Properties view for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t14">Property</th>
-<th align="left" valign="bottom" id="r1c2-t14">Description</th>
-<th align="left" valign="bottom" id="r1c3-t14">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t14" headers="r1c1-t14">Name</td>
-<td align="left" headers="r2c1-t14 r1c2-t14">Name of the join table</td>
-<td align="left" headers="r2c1-t14 r1c3-t14">By default, the name is assumed to be the primary tables associated with the entities concatenated with an underscore.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t14" headers="r1c1-t14">Join Columns</td>
-<td align="left" headers="r3c1-t14 r1c2-t14">Specify two or more join columns (that is, a primary key).</td>
-<td align="left" headers="r3c1-t14 r1c3-t14"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t14" headers="r1c1-t14">Inverse Join Columns</td>
-<td align="left" headers="r4c1-t14 r1c2-t14">The join column on the owned (or inverse) side of the association: the owned entity's primary key column.</td>
-<td align="left" headers="r4c1-t14 r1c3-t14"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-</ol>
-<p>Eclipse adds the following annotations to the field:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-@OneToMany(targetEntity=<span class="italic">&lt;TARGET_ENTITY&gt;</span>)
-@Column(name="<span class="italic">&lt;COLUMN&gt;</span>")
-
-
-@OneToMany(targetEntity=<span class="italic">&lt;TARGET_ENTITY&gt;</span>.class, cascade=CascadeType.<span class="italic">&lt;CASCADE_TYPE&gt;</span>, 
-    fetch = FetchType.<span class="italic">&lt;FETCH_TYPE&gt;</span>, mappedBy = "<span class="italic">&lt;MAPPED_BY&gt;</span>")@OrderBy("<span class="italic">&lt;ORDER_BY&gt;</span>")
-@JoinTable(name="<span class="italic">&lt;JOIN_TABLE_NAME&gt;</span>", joinColumns=@JoinColumn(name=
-    "<span class="italic">&lt;JOIN_COLUMN_NAME&gt;</span>", referencedColumnName="<span class="italic">&lt;JOIN_COLUMN_REFERENCED_COLUMN&gt;</span>"), 
-    inverseJoinColumns=@JoinColumn(name="<span class="italic">&lt;INVERSE_JOIN_COLUMN_NAME&gt;</span>", 
-    referencedColumnName="<span class="italic">&lt;INVERSE_JOIN_COLUMN_REFERENCED_COLUMN&gt;</span>"))
-
-
-</pre>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a><br />
-<a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_mapping.htm#BABBDJFI">Understanding OR mappings</a><br />
-<a href="concepts001.htm#BABBGFJG">Understanding EJB 3.0 Java Persistence API</a></div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks014.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks014.htm
deleted file mode 100644
index c67cbd6..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks014.htm
+++ /dev/null
@@ -1,141 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:56 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>One-to-one mapping</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="One-to-one mapping" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABFHBCJ" name="BABFHBCJ"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>One-to-one mapping</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref144" name="sthref144"></a><a id="sthref145" name="sthref145"></a><a id="sthref146" name="sthref146"></a><a id="sthref147" name="sthref147"></a>Use a <span class="bold">One-to-One Mapping</span> to define a relationship with one-to-many multiplicity.</p>
-<ol type="1" start="1">
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the field to map. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the selected.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">One-to-one</span>.</p>
-</li>
-<li>
-<p>Use this table to complete the <a href="ref_mapping_general.htm#CACBHFIJ">General information</a> fields in the JPA Details view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the Persistence Properties view for this mapping." summary="This table lists the fields in the Persistence Properties view for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t15">Property</th>
-<th align="left" valign="bottom" id="r1c2-t15">Description</th>
-<th align="left" valign="bottom" id="r1c3-t15">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t15" headers="r1c1-t15">Target Entity</td>
-<td align="left" headers="r2c1-t15 r1c2-t15">The entity to which this attribute is mapped.</td>
-<td align="left" headers="r2c1-t15 r1c3-t15">null
-<p>You do not need to explicitly specify the target entity, since it can be inferred from the type of object being referenced.</p>
-</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t15" headers="r1c1-t15">Fetch Type</td>
-<td align="left" headers="r3c1-t15 r1c2-t15">Defines how data is loaded from the database. See <a href="ref_mapping_general.htm#CACGGGHB">"Fetch Type"</a> for details.
-<ul>
-<li type="disc">
-<p>Eager</p>
-</li>
-<li type="disc">
-<p>Lazy</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r3c1-t15 r1c3-t15">Eager</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t15" headers="r1c1-t15">Mapped By</td>
-<td align="left" headers="r4c1-t15 r1c2-t15">The database field that owns the relationship.</td>
-<td align="left" headers="r4c1-t15 r1c3-t15"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-<li>
-<p>Use this table to complete the <a href="reference007.htm#CACFCEJC">Join Columns Information</a> fields in the <span class="gui-object-title">JPA Details</span> view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the Persistence Properties view for this mapping." summary="This table lists the fields in the Persistence Properties view for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t16">Property</th>
-<th align="left" valign="bottom" id="r1c2-t16">Description</th>
-<th align="left" valign="bottom" id="r1c3-t16">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t16" headers="r1c1-t16">Join Column</td>
-<td align="left" headers="r2c1-t16 r1c2-t16"><a id="sthref148" name="sthref148"></a><a id="sthref149" name="sthref149"></a>Specify a mapped column for joining an entity association. This field corresponds to the <code>@JoinColum</code> attribute.
-<p>Select <span class="bold">Override Default</span>, then Add, Edit, or Remove the join columns.</p>
-</td>
-<td align="left" headers="r2c1-t16 r1c3-t16">By default, the mapping is assumed to have a single join.</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-</ol>
-<p>Eclipse adds the following annotations to the field:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-@OneToOne(targetEntity=<span class="italic">&lt;TARGET_ENTITY&gt;</span>, cascade=CascadeType.<span class="italic">&lt;CASCADE_TYPE&gt;</span>, 
-    fetch = FetchType.<span class="italic">&lt;FETCH_TYPE&gt;</span>, mappedBy = "<span class="italic">&lt;MAPPED_BY&gt;</span>")
-@JoinColumn(name="<span class="italic">&lt;JOIN_COLUMN_NAME&gt;</span>", referencedColumnName=
-    "<span class="italic">&lt;JOIN_COLUMN_REFERENCED_COLUMN&gt;</span>", insertable = <span class="italic">&lt;INSERTABLE&gt;</span>, 
-    updatable = <span class="italic">&lt;UPDATABLE&gt;</span>)
-
-
-</pre>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a><br />
-<a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_mapping.htm#BABBDJFI">Understanding OR mappings</a><br />
-<a href="concepts001.htm#BABBGFJG">Understanding EJB 3.0 Java Persistence API</a></div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks015.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks015.htm
deleted file mode 100644
index acf9215..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks015.htm
+++ /dev/null
@@ -1,72 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:56 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Transient mapping</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Transient mapping" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABHFHEI" name="BABHFHEI"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Transient mapping</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref150" name="sthref150"></a><a id="sthref151" name="sthref151"></a><a id="sthref152" name="sthref152"></a><a id="sthref153" name="sthref153"></a>Use the Transient Mapping to specify a or field of the entity class that <span class="italic">is not</span> persistent.</p>
-<p>To create a version mapping:</p>
-<ol type="1" start="1">
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the field to map. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the selected.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">Transient</span>.</p>
-</li>
-</ol>
-<p>Eclipse adds the following annotation to the field:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-@Transient
-
-</pre>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a><br />
-<a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_mapping.htm#BABBDJFI">Understanding OR mappings</a><br />
-<a href="concepts001.htm#BABBGFJG">Understanding EJB 3.0 Java Persistence API</a></div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks016.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks016.htm
deleted file mode 100644
index c1b4291..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks016.htm
+++ /dev/null
@@ -1,135 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:56 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Version mapping</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Version mapping" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABHIBII" name="BABHIBII"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Version mapping</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref154" name="sthref154"></a><a id="sthref155" name="sthref155"></a><a id="sthref156" name="sthref156"></a><a id="sthref157" name="sthref157"></a>Use a <span class="bold">Version Mapping</span> to specify the field used for optimistic locking. If the entity is associated with multiple tables, you should use a version mapping only with the primary table. You should have only a single version mapping per persistent entity. Version mappings may be used only with the following attribute types:</p>
-<ul>
-<li type="disc">
-<p><code>int</code></p>
-</li>
-<li type="disc">
-<p><code>Integer</code></p>
-</li>
-<li type="disc">
-<p><code>short, Short</code></p>
-</li>
-<li type="disc">
-<p><code>long, Long</code></p>
-</li>
-<li type="disc">
-<p><code>Timestamp</code></p>
-</li>
-</ul>
-<p>To create a version mapping:</p>
-<ol type="1" start="1">
-<li>
-<p>In the <a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a>, select the field to map. The <a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a> displays the properties for the selected.</p>
-</li>
-<li>
-<p>In the <span class="gui-object-title">Map As</span> field, select <span class="gui-object-action">Version</span>.</p>
-</li>
-<li>
-<p>Use this table to complete the remaining fields in the JPA Details view.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the Persistence Properties view for this mapping." summary="This table lists the fields in the Persistence Properties view for this mapping." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t17">Property</th>
-<th align="left" valign="bottom" id="r1c2-t17">Description</th>
-<th align="left" valign="bottom" id="r1c3-t17">Default</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t17" headers="r1c1-t17">Column</td>
-<td align="left" headers="r2c1-t17 r1c2-t17">The database column mapped to the entity attribute. See <a href="ref_mapping_general.htm#CACGCBHB">"Column"</a> for details.</td>
-<td align="left" headers="r2c1-t17 r1c3-t17">By default, the Column is assumed to be named identically to the attribute and always included in the <code>INSERT</code> and <code>UPDATE</code> statements.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t17" headers="r1c1-t17">Table</td>
-<td align="left" headers="r3c1-t17 r1c2-t17">Name of the database table. This must be the primary table associated with the attribute's entity.</td>
-<td align="left" headers="r3c1-t17 r1c3-t17"><br /></td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r4c1-t17" headers="r1c1-t17">Temporal</td>
-<td align="left" headers="r4c1-t17 r1c2-t17">Specifies the type of data. See <a href="ref_mapping_general.htm#CACEAJGD">"Temporal"</a> for details.
-<ul>
-<li type="disc">
-<p>Date</p>
-</li>
-<li type="disc">
-<p>Time</p>
-</li>
-<li type="disc">
-<p>Timestamp</p>
-</li>
-</ul>
-</td>
-<td align="left" headers="r4c1-t17 r1c3-t17"><br /></td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-</ol>
-<p>Eclipse adds the following annotations to the field:</p>
-<pre xml:space="preserve" class="oac_no_warn">
-@Version
-@Column(table="<span class="italic">&lt;COLUMN_TABLE&gt;</span>", name="&lt;<span class="italic">COLUMN_NAME</span>&gt;")
-
-
-</pre>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_mapping.htm#BABDGBIJ">Mapping an entity</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_persistence_outline.htm#BABEGGFE">JPA Structure view</a><br />
-<a href="ref_persistence_map_view.htm#BABIFBAF">JPA Details view (for attributes)</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_mapping.htm#BABBDJFI">Understanding OR mappings</a><br />
-<a href="concepts001.htm#BABBGFJG">Understanding EJB 3.0 Java Persistence API</a></div>
-<!-- class="sect2" -->
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks017.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks017.htm
deleted file mode 100644
index dc62498..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks017.htm
+++ /dev/null
@@ -1,74 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:56 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Generating entities from tables</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Generating entities from tables" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABBAGFI" name="BABBAGFI"></a></p>
-<div class="sect1">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Generating entities from tables</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref158" name="sthref158"></a><a id="sthref159" name="sthref159"></a>Use this procedure to generate Java persistent entities from database tables. You must create a JPA project and establish a database connection <span class="italic">before</span> generating persistent entities. See <a href="task_create_new_project.htm#CIHHEJCJ">"Creating a new JPA project"</a> for more information.</p>
-<ol type="1" start="1">
-<li>
-<p>Right-click the JPA project in the <span class="gui-object-title">Package Explorer</span> and select <span class="gui-object-action">JPA Tools &gt; Generate Entities</span>.</p>
-<div class="figure"><a id="sthref160" name="sthref160"></a>
-<p class="titleinfigure">Generating Entities</p>
-<img src="img/generate_entities.png" alt="Using the JPA Tools &gt; Generate Entities menu option." title="Using the JPA Tools &gt; Generate Entities menu option." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>If you are not currently connected to the database, the Database Connection page appears. Select your database connection and schema, and click <span class="bold">Reconnect</span>.</p>
-<p>To create a new database connection, click <span class="bold">Add connection</span>.</p>
-<p>After connecting to the database, click <span class="bold">Next</span>.</p>
-</li>
-<li>
-<p><a id="sthref161" name="sthref161"></a><a id="sthref162" name="sthref162"></a>On the <a href="task_generate_entities.htm#CACDAFJD">Generate Entities from Tables dialog</a> dialog, select the tables from which to generate Java persistent entities and click <span class="bold">Finish</span>.</p>
-</li>
-</ol>
-<p>Eclipse creates a Java persistent entity for each database table. Each entity contains fields based on the table's columns. Eclipse will also generate entity relationships (such as one-to-one) based on the table constraints. <a href="#CIHJIJJC">Figure: Generating Entities from Tables</a> illustrates how Eclipse generates entities from tables.</p>
-<div class="figure"><a id="CIHJIJJC" name="CIHJIJJC"></a>
-<p class="titleinfigure">Generating Entities from Tables</p>
-<img src="img/table_entity.png" alt="This figure shows the EMPLOYEE and ADDRESS entities generated from database tables." title="This figure shows the EMPLOYEE and ADDRESS entities generated from database tables." /><br /></div>
-<!-- class="figure" -->
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br /></div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks018.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks018.htm
deleted file mode 100644
index 986b4fa..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks018.htm
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:56 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Validating mappings and reporting problems</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Validating mappings and reporting problems" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABFAIBA" name="BABFAIBA"></a></p>
-<div class="sect1">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Validating mappings and reporting problems</h1>
-</td>
-</tr>
-</table>
-<p><a id="sthref163" name="sthref163"></a><a id="sthref164" name="sthref164"></a><a id="sthref165" name="sthref165"></a><a id="sthref166" name="sthref166"></a>Errors and warnings on persistent entities and mappings are indicated with a red error or yellow warning next to the resource with the error, as well as the parent containers up to the project.</p>
-<div class="figure"><a id="sthref167" name="sthref167"></a>
-<p class="titleinfigure">Sample Errors and Warnings</p>
-<img src="img/error_sample.png" alt="This figure shows sample error and warning icons in the Explorer view." title="This figure shows sample error and warning icons in the Explorer view." /><br /></div>
-<!-- class="figure" -->
-<p>This section contains information on the following:</p>
-<ul>
-<li type="disc">
-<p><a href="tasks019.htm#CIHFEDEI">Error messages</a></p>
-</li>
-<li type="disc">
-<p><a href="tasks020.htm#CIHGEAIJ">Warning messages</a></p>
-</li>
-</ul>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<p><a href="../org.eclipse.platform.doc.user/concepts/cprbview.htm">Problems view</a></p>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" --></div>
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks019.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks019.htm
deleted file mode 100644
index 1ea8850..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks019.htm
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:56 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Error messages</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Error messages" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CIHFEDEI" name="CIHFEDEI"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Error messages<a id="sthref168" name="sthref168"></a></h1>
-</td>
-</tr>
-</table>
-<p>This section contains information on error messages (including how to resolve the issue) you may encounter while working with Dali.</p>
-<a id="sthref169" name="sthref169"></a>
-<p class="subhead2">Attribute "<span class="italic">&lt;ATTRIBUTE__NAME&gt;</span>" has invalid mapping type in this context</p>
-<p>The mapped attribute is invalid. Either change the mapping type or change the entity type.</p>
-<p>See <a href="task_mapping.htm#BABDGBIJ">"Mapping an entity"</a> for more information.</p>
-<a id="sthref170" name="sthref170"></a>
-<p class="subhead2">Attribute "<span class="italic">&lt;ATTRIBUTE_NAME&gt;</span>" cannot be resolved.</p>
-<p>Dali cannot map the attribute to a database table and column. Verify that you database connection information is correct.</p>
-<p>See <a href="task_create_new_project.htm#CIHHEJCJ">"Creating a new JPA project"</a> for more information.</p>
-<a id="sthref171" name="sthref171"></a>
-<p class="subhead2">Class "<span class="italic">&lt;CLASS_NAME&gt;</span>" is not annotated as a persistent class.</p>
-<p>The class has not been identified as a persistent class. Configure the class as an Entity, Mapped Superclass, or Embeddable persistent entity.</p>
-<p>See <a href="task_add_persistence.htm#BABHICAI">"Adding persistence to a class"</a>.</p>
-<a id="sthref172" name="sthref172"></a>
-<p class="subhead2">Column "<span class="italic">&lt;COLUMN_NAME&gt;</span>" cannot be resolved.</p>
-<p>You mapped an entity's field to an incorrect or invalid column in the database table. By default, Dali will attempt to map each field in the entity with an identically named row in the database table. If the field's name differs from the row's name, you must explicitly create the mapping.</p>
-<p>Map the field to a valid row in the database table as shown in <a href="task_mapping.htm#BABDGBIJ">"Mapping an entity"</a>.</p>
-<a id="sthref173" name="sthref173"></a>
-<p class="subhead2">Duplicate class "<span class="italic">&lt;CLASS_NAME&gt;</span>".</p>
-<p>You created to persistence classes with the same name. Each Java class must have a unique name. See <a href="task_add_persistence.htm#BABHICAI">"Adding persistence to a class"</a> for more information.</p>
-<a id="sthref174" name="sthref174"></a>
-<p class="subhead2">Entity does not have an Id or Embedded Id.</p>
-<p>You created a persistent entity without identifying its primary key. A persistent entity must have a primary key field designated with an <code>@Id</code> or <code>@EmbeddedId</code> annotation.</p>
-<p>Add an ID mapping to the entity as shown in <a href="tasks010.htm#BABGCBHG">"ID mapping"</a> or <a href="tasks009.htm#CIHDIAEE">"Embedded ID mapping"</a>.</p>
-<a id="sthref175" name="sthref175"></a>
-<p class="subhead2">Multiple persistence.xml files in project.</p>
-<p>You created a JPA project with more than one <code>persistence.xml</code> file. Each JPA project must contain a <span class="italic">single</span> <code>persistence.xml</code> file.</p>
-<p>See <a href="task_manage_persistence.htm#CIHDAJID">"Managing the persistence.xml file"</a> for more information.</p>
-<a id="sthref176" name="sthref176"></a>
-<p class="subhead2">No generator named "<span class="italic">&lt;GENERATOR_NAME&gt;</span>" is defined in persistence unit.</p>
-<p>You created a persistence entity that uses sequencing, but did not define include the sequence generator in the <code>psersistence.xml</code> file. Synchronize the <code>persistence.xml</code> file with your current project.</p>
-<p>See <a href="tasks002.htm#CIHFEBAI">"Synchronizing classes"</a> for more information.</p>
-<a id="sthref177" name="sthref177"></a>
-<p class="subhead2">No persistence unit defined.</p>
-<p>There is no <code>&lt;persistence-unit-metadata&gt;</code> information in the <code>orm.xml</code> file. Add the default persistence unit information.</p>
-<p>See <a href="task_manage_orm.htm#CIHDGDCD">"Managing the orm.xml file"</a> for more information.</p>
-<a id="sthref178" name="sthref178"></a>
-<p class="subhead2">No persistence.xml file in project.</p>
-<p>You created a JPA project without a <code>persistence.xml</code> file. Each JPA project must contain a <span class="italic">single</span> <code>persistence.xml</code> file.</p>
-<p>See <a href="task_manage_persistence.htm#CIHDAJID">"Managing the persistence.xml file"</a> for more information.</p>
-<a id="sthref179" name="sthref179"></a>
-<p class="subhead2">Referenced column "<span class="italic">&lt;COLUMN_NAME&gt;</span>" in join column "<span class="italic">&lt;COLUMN_NAME&gt;</span>" cannot be resolved.</p>
-<p>The column that you selected to join a relationship mapping does not exist on the database table. Either select a different column on the <a href="reference006.htm#CACBAEBC">Join Table Information</a> or create the necessary column on the database table.</p>
-<p>See <a href="ref_persistence_map_view.htm#BABIFBAF">"JPA Details view (for attributes)"</a> for more information.</p>
-<a id="sthref180" name="sthref180"></a>
-<p class="subhead2">Schema "&lt;<span class="italic">SCHEMA_NAME</span>&gt;" cannot be resolved for table/join table "&lt;<span class="italic">TABLE_NAME</span>&gt;".</p>
-<p>Define the default database schema information in the persistence unit.</p>
-<p>See <a href="task_manage_orm.htm#CIHDGDCD">"Managing the orm.xml file"</a> for more information.</p>
-<a id="sthref181" name="sthref181"></a>
-<p class="subhead2">Table "<span class="italic">&lt;TABLE_NAME&gt;</span>" cannot be resolved.</p>
-<p>You associated a persistent entity to an incorrect or invalid database table. By default, Dali will attempt to associate each persistent entity with an identically named database table. If the entity's name differs from the table's name, you must explicitly create the association.</p>
-<p>Associate the entity with a valid database table as shown in <a href="task_add_persistence.htm#BABHICAI">"Adding persistence to a class"</a>.</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<p><a href="../org.eclipse.platform.doc.user/concepts/cprbview.htm">Problems view</a></p>
-</div>
-<!-- class="sect2" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks020.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks020.htm
deleted file mode 100644
index 01861df..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks020.htm
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:56 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Warning messages</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Warning messages" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CIHGEAIJ" name="CIHGEAIJ"></a></p>
-<div class="sect2"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Warning messages</h1>
-</td>
-</tr>
-</table>
-<p>This section contains information on warning messages (including how to resolve the issue) you may encounter while working with Dali.</p>
-<a id="sthref182" name="sthref182"></a>
-<p class="subhead2">Connection "<span class="italic">&lt;CONNECTION_NAME&gt;</span>" is not active. No validation will be done against the data source.</p>
-<p>The database connection you specified to use with the JPA project is not active. The JPA project requires an active connection.</p>
-<a id="sthref183" name="sthref183"></a>
-<p class="subhead2">No connection specified for the project. No data-specific validation will be performed.</p>
-<p>You created a JPA project without specifying a database connection. The JPA project requires an active connection.</p>
-<p>See <a href="task_create_new_project.htm#CIHHEJCJ">"Creating a new JPA project"</a> or <a href="tasks021.htm#BABDBCBI">"Modifying persistent project properties"</a> for information on specifying a database connection.</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<p><a href="../org.eclipse.platform.doc.user/concepts/cprbview.htm">Problems view</a></p>
-</div>
-<!-- class="sect2" -->
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tasks021.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tasks021.htm
deleted file mode 100644
index f0956b7..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tasks021.htm
+++ /dev/null
@@ -1,89 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:56 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Modifying persistent project properties</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Modifying persistent project properties" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BABDBCBI" name="BABDBCBI"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Modifying persistent project properties</h1>
-</td>
-</tr>
-</table>
-<p>Each persistent project must be associated with a database connection. To create a new database connection, click <span class="gui-object-action">Database Connection</span> use the New Connection wizard.</p>
-<p>Use this procedure to modify the vender-specific platform and database connection associated with your JPA project.</p>
-<ol type="1" start="1">
-<li>
-<p>Right-click the project in the <span class="gui-object-title">Explorer</span> view and select <span class="gui-object-action">Properties</span>. The Properties page appears.</p>
-<div class="figure"><a id="sthref184" name="sthref184"></a>
-<p class="titleinfigure">Properties - Persistence Page</p>
-<img src="img/properties_persistence.png" alt="This figure shows the JPA options on the Properties dialog." title="This figure shows the JPA options on the Properties dialog." /><br /></div>
-<!-- class="figure" --></li>
-<li>
-<p>Use this table to complete the remaining fields on the Properties - JPA page and click <span class="bold">OK</span>.</p>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the fields in the Properties - Java Persistence dialog." summary="This table lists the fields in the Properties - Java Persistence dialog." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t18">Property</th>
-<th align="left" valign="bottom" id="r1c2-t18">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t18" headers="r1c1-t18">Platform</td>
-<td align="left" headers="r2c1-t18 r1c2-t18">Select the vendor-specific platform for the JPA implementation.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t18" headers="r1c1-t18">Database Connection</td>
-<td align="left" headers="r3c1-t18 r1c2-t18">Database connection to use to store the persistent entities. To create a new connection, click <span class="bold">Add Connection</span>.</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" --></li>
-</ol>
-<p>To create a new connection, click <span class="bold">Add connections</span>.</p>
-<p>&nbsp;</p>
-<img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="task_create_new_project.htm#CIHHEJCJ">Creating a new JPA project</a>
-<p>&nbsp;</p>
-<img src="img/ngrelr.png" alt="Related reference" title="Related reference" /><br />
-<br />
-<a href="ref_project_properties.htm#BABJHBCI">Project Properties page - JPA Options</a>
-<p>&nbsp;</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="concept_persistence.htm#BABCAHIC">Understanding Java persistence</a></div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/tips_and_tricks.htm b/jpa/plugins/org.eclipse.jpt.doc.user/tips_and_tricks.htm
deleted file mode 100644
index 739ecbb..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/tips_and_tricks.htm
+++ /dev/null
@@ -1,71 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:58 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Tips and tricks</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content=" Tips and tricks" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CHDHGHBF" name="CHDHGHBF"></a></p>
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Tips and tricks</h1>
-</td>
-</tr>
-</table>
-<p>The following tips and tricks give some helpful ideas for increasing your productivity.</p>
-<ul>
-<li type="disc">
-<p><a href="#BABFIIHA"><span class="bold">Database Connections</span></a></p>
-</li>
-<li type="disc">
-<p><a href="#BABCHAHF"><span class="bold">Schema-based persistence.xml</span></a></p>
-</li>
-</ul>
-<div class="inftblruleinformal">
-<table class="RuleInformal" title="This table lists the tips and tricks in this category." summary="This table lists the tips and tricks in this category." dir="ltr" border="1" width="100%" frame="border" rules="all" cellpadding="3" cellspacing="0">
-<thead>
-<tr align="left" valign="top">
-<th align="left" valign="bottom" id="r1c1-t2">Tip</th>
-<th align="left" valign="bottom" id="r1c2-t2">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr align="left" valign="top">
-<td align="left" id="r2c1-t2" headers="r1c1-t2"><a id="BABFIIHA" name="BABFIIHA"></a><span class="bold">Database Connections</span></td>
-<td align="left" headers="r2c1-t2 r1c2-t2">When starting a new workbench session, be sure to <a href="../org.eclipse.wst.datatools.connection.ui.doc.user/topics/tdbconn_recon.html">reconnect to your database</a> (if you are working online). This allows Dali to provide database-related mapping assistance and validation.</td>
-</tr>
-<tr align="left" valign="top">
-<td align="left" id="r3c1-t2" headers="r1c1-t2"><a id="BABCHAHF" name="BABCHAHF"></a><span class="bold">Schema-based persistence.xml</span></td>
-<td align="left" headers="r3c1-t2 r1c2-t2">If you are behind a firewall, you may need to configure your Eclipse workspace proxy in the <a href="../org.eclipse.platform.doc.user/reference/ref-72.htm">Preferences dialog</a> (<span class="gui-object-action">Preferences &gt; Internet &gt; Proxy Settings</span>) to properly validate a schema-based <code>persistence.xml</code> file.</td>
-</tr>
-</tbody>
-</table>
-<br /></div>
-<!-- class="inftblruleinformal" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/toc.xml b/jpa/plugins/org.eclipse.jpt.doc.user/toc.xml
deleted file mode 100644
index 5532321..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/toc.xml
+++ /dev/null
@@ -1,116 +0,0 @@
-<?xml version='1.0' encoding='iso-8859-1'?>
-<!-- User Guide -->
-  <toc label="Dali Java Persistence Tools User Guide">
-    <topic href="getting_started.htm" label="Getting started">
-      <topic href="getting_started001.htm#BABEFHCD" label="Requirements and installation" />
-      <topic href="getting_started002.htm#BABIGCJA" label="Dali quick start">
-        <topic href="getting_started003.htm#BABDFHDA" label="Creating a new project" />
-        <topic href="getting_started004.htm#BABFGDDG" label="Creating a Java persistent entity" />
-        <topic href="getting_started005.htm#BABHACAF" label="Mapping an entity" />
-      </topic>
-      <topic href="getting_started006.htm#BABCDECJ" label="Dali basic tutorial">
-        <topic href="getting_started007.htm#BABBBBID" label="Generate the tutorial database schema">
-          <topic href="getting_started008.htm#BABDHFCD" label="Create a database connection" />
-        </topic>
-        <topic href="getting_started009.htm#BABBBAIG" label="Create a JPA project" />
-        <topic href="getting_started010.htm#BABIJIGF" label="Create persistent Java entities">
-          <topic href="getting_started011.htm#BABDCBDD" label="Add fields to the entities" />
-          <topic href="getting_started012.htm#BABIHGGD" label="Associate the entity with a database table" />
-        </topic>
-        <topic href="getting_started013.htm#BABEBGBC" label="Create OR mappings">
-          <topic href="getting_started014.htm#BABGEFDI" label="Create ID mappings" />
-          <topic href="getting_started015.htm#BABEEFJA" label="Create basic mappings" />
-          <topic href="getting_started016.htm#BABGBGHF" label="Create one-to-one mappings" />
-          <topic href="getting_started017.htm#BABBEHEG" label="Create one-to-many mappings" />
-          <topic href="getting_started018.htm#BABCHIHI" label="Create many-to-one mappings" />
-          <topic href="getting_started019.htm#BABIDFFG" label="Create version mappings" />
-        </topic>
-      </topic>
-    </topic>
-    <topic href="concepts.htm" label=" Concepts">
-      <topic href="concept_persistence.htm#BABCAHIC" label="Understanding Java persistence" />
-      <topic href="concept_mapping.htm#BABBDJFI" label="Understanding OR mappings" />
-      <topic href="concepts001.htm#BABBGFJG" label="Understanding EJB 3.0 Java Persistence API">
-        <topic href="concepts002.htm#CHDHAGIH" label="The persistence.xml file" />
-        <topic href="concepts003.htm#CHDBIJAC" label="The orm.xml file" />
-      </topic>
-    </topic>
-    <topic href="tasks.htm" label=" Tasks">
-      <topic href="task_create_new_project.htm#CIHHEJCJ" label="Creating a new JPA project" />
-      <topic href="task_manage_persistence.htm#CIHDAJID" label="Managing the persistence.xml file">
-        <topic href="tasks001.htm#CIHEJAIE" label="Working with persistence.xml file" />
-        <topic href="tasks002.htm#CIHFEBAI" label="Synchronizing classes" />
-      </topic>
-      <topic href="task_manage_orm.htm#CIHDGDCD" label="Managing the orm.xml file">
-        <topic href="tasks003.htm#CIHBCDCE" label="Working with orm.xml file" />
-      </topic>
-      <topic href="task_add_persistence.htm#BABHICAI" label="Adding persistence to a class">
-        <topic href="tasks004.htm#BABGBIEE" label="Entity" />
-        <topic href="tasks005.htm#BABFEICE" label="Embeddable" />
-        <topic href="tasks006.htm#BABDAGCI" label="Mapped superclass" />
-      </topic>
-      <topic href="task_additonal_tables.htm#CIHGBIEI" label="Specifying additional tables" />
-      <topic href="task_inheritance.htm#CIHCCCJD" label="Specifying entity inheritance" />
-      <topic href="task_mapping.htm#BABDGBIJ" label="Mapping an entity">
-        <topic href="tasks007.htm#BABBABCE" label="Basic mapping" />
-        <topic href="tasks008.htm#BABCBHDF" label="Embedded mapping" />
-        <topic href="tasks009.htm#CIHDIAEE" label="Embedded ID mapping" />
-        <topic href="tasks010.htm#BABGCBHG" label="ID mapping" />
-        <topic href="tasks011.htm#BABEIEGD" label="Many-to-many mapping" />
-        <topic href="tasks012.htm#BABHFAFJ" label="Many-to-one mapping" />
-        <topic href="tasks013.htm#BABHGEBD" label="One-to-many mapping" />
-        <topic href="tasks014.htm#BABFHBCJ" label="One-to-one mapping" />
-        <topic href="tasks015.htm#BABHFHEI" label="Transient mapping" />
-        <topic href="tasks016.htm#BABHIBII" label="Version mapping" />
-      </topic>
-      <topic href="tasks017.htm#BABBAGFI" label="Generating entities from tables" />
-      <topic href="tasks018.htm#BABFAIBA" label="Validating mappings and reporting problems">
-        <topic href="tasks019.htm#CIHFEDEI" label="Error messages" />
-        <topic href="tasks020.htm#CIHGEAIJ" label="Warning messages" />
-      </topic>
-      <topic href="tasks021.htm#BABDBCBI" label="Modifying persistent project properties" />
-    </topic>
-    <topic label=" Reference">
-      <topic label="Wizards">
-        <topic href="ref_new_jpa_project_wizard.htm#CACBJGBG" label="Create New JPA Project wizard">
-          <topic href="ref_new_jpa_project.htm#CACBJAGC" label="New JPA Project page" />
-          <topic href="ref_jpa_facet.htm#CACIFDIF" label="JPA Facet page" />
-        </topic>
-      </topic>
-      <topic label="Property pages">
-        <topic href="ref_persistence_prop_view.htm#BABFAEBB" label="JPA Details view (for entities)">
-          <topic href="reference003.htm#CACCAGGC" label="General information" />
-          <topic href="reference004.htm#CACBHIDA" label="Secondary table information" />
-          <topic href="reference005.htm#CACFHGHE" label="Inheritance information" />
-        </topic>
-        <topic href="ref_persistence_map_view.htm#BABIFBAF" label="JPA Details view (for attributes)">
-          <topic href="ref_mapping_general.htm#CACBHFIJ" label="General information" />
-          <topic href="reference006.htm#CACBAEBC" label="Join Table Information" />
-          <topic href="reference007.htm#CACFCEJC" label="Join Columns Information" />
-          <topic href="ref_primary_key.htm#CACFCCAB" label="Primary Key Generation information" />
-        </topic>
-        <topic href="ref_details_orm.htm#CACGDGHC" label="JPA Details view (for orm.xml)">
-          <topic href="reference008.htm#CACCACGH" label="General information" />
-          <topic href="reference009.htm#CACEAGBG" label="Persistence Unit information" />
-        </topic>
-        <topic href="ref_persistence_outline.htm#BABEGGFE" label="JPA Structure view" />
-      </topic>
-      <topic label="Preferences">
-        <topic href="ref_project_properties.htm#BABJHBCI" label="Project Properties page - JPA Options" />
-      </topic>
-      <topic label="Dialogs">
-        <topic href="task_generate_entities.htm#CACDAFJD" label="Generate Entities from Tables dialog" />
-        <topic href="reference012.htm#CACCGEHC" label="Edit Join Columns Dialog" />
-      </topic>
-      <topic href="ref_persistence_perspective.htm#BABIFBDB" label="JPA Development perspective" />
-      <topic label="Icons and buttons">
-        <topic href="reference014.htm#CACGEACG" label="Icons" />
-        <topic href="reference015.htm#CACDJCEI" label="Buttons" />
-      </topic>
-      <topic href="reference016.htm#sthref239" label="Javadoc" />
-      <topic href="reference017.htm#CACBBDIB" label="Dali Developer Documentation" />
-    </topic>
-    <topic href="tips_and_tricks.htm" label="Tips and tricks" />
-    <topic href="whats_new.htm" label=" What's new" />
-    <topic href="legal.htm" label=" Legal" />
-</toc>
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/whats_new.htm b/jpa/plugins/org.eclipse.jpt.doc.user/whats_new.htm
deleted file mode 100644
index 8c777d1..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/whats_new.htm
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:58 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>What's new</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content=" What's new" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BGGEDBGF" name="BGGEDBGF"></a></p>
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>What's new</h1>
-</td>
-</tr>
-</table>
-<p>This section contains descriptions of the following new feature and significant changes made to the Dali OR Mapping Tool for Release 1.0.0:</p>
-<ul>
-<li type="disc">
-<p><a href="whats_new001.htm#BGGCJJBD">Generate Persistent Entities from Tables wizard</a></p>
-</li>
-<li type="disc">
-<p><a href="whats_new002.htm#CEGBCIBB">Create and Manage the persistence.xml file</a></p>
-</li>
-<li type="disc">
-<p><a href="whats_new003.htm#CEGJJBEE">Create and Manage the orm.xml file</a></p>
-</li>
-</ul>
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/whats_new001.htm b/jpa/plugins/org.eclipse.jpt.doc.user/whats_new001.htm
deleted file mode 100644
index 26654ca..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/whats_new001.htm
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:58 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Generate Persistent Entities from Tables wizard</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Generate Persistent Entities from Tables wizard" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="BGGCJJBD" name="BGGCJJBD"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Generate Persistent Entities from Tables wizard</h1>
-</td>
-</tr>
-</table>
-<p>Use the <span class="gui-object-title">Generate Entities from Tables</span> wizard to quickly create JPA entities from your database tables.</p>
-<div class="figure"><a id="sthref243" name="sthref243"></a>
-<p class="titleinfigure">Generating Entities</p>
-<img src="img/generate_entities.png" alt="Selecting the JPA Tools &gt; Generate Entities option." title="Selecting the JPA Tools &gt; Generate Entities option." /><br /></div>
-<!-- class="figure" -->
-<p>Dali automatically creates the necessary OR mappings, based on your database table constraints.</p>
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="whats_new.htm#BGGEDBGF">What's new</a> <img src="img/ngrelt.png" alt="Related task" title="Related task" /><br />
-<br />
-<a href="tasks017.htm#BABBAGFI">Generating entities from tables</a></div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/whats_new002.htm b/jpa/plugins/org.eclipse.jpt.doc.user/whats_new002.htm
deleted file mode 100644
index 455826b..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/whats_new002.htm
+++ /dev/null
@@ -1,57 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:58 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Create and Manage the persistence.xml file</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Create and Manage the persistence.xml file" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CEGBCIBB" name="CEGBCIBB"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Create and Manage the persistence.xml file</h1>
-</td>
-</tr>
-</table>
-<p>When creating a JPA project, Dali automatically creates the <code>perssistence.xml</code> file.</p>
-<div class="figure"><a id="sthref244" name="sthref244"></a>
-<p class="titleinfigure">JPA Project with persistence.xml File</p>
-<img src="img/new_project_2.png" alt="JPA project with persistence.xml file." title="JPA project with persistence.xml file." /><br /></div>
-<!-- class="figure" -->
-<p>Use the XML editor to edit the <code>persistence.xml</code> file.</p>
-<p>After adding your JPA entities, use the <span class="gui-object-action">Java Persistence &gt; Synchronize Classes</span> option to add the classes to the <code>persistence.xml</code> file.</p>
-<div class="figure"><a id="sthref245" name="sthref245"></a>
-<p class="titleinfigure">Synchronizing the persistence.xml File.</p>
-<img src="img/synchornize_classes.png" alt="The JPA Tools &gt; Synchronize Classes option." title="The JPA Tools &gt; Synchronize Classes option." /><br /></div>
-<!-- class="figure" -->
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="whats_new.htm#BGGEDBGF">What's new</a></div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.doc.user/whats_new003.htm b/jpa/plugins/org.eclipse.jpt.doc.user/whats_new003.htm
deleted file mode 100644
index b75c0a9..0000000
--- a/jpa/plugins/org.eclipse.jpt.doc.user/whats_new003.htm
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<!-- Run date = May 21, 2007 6:35:58 -->
-<meta name="OAC_IGNORE_SKIP_NAV" content="true" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-<title>Create and Manage the orm.xml file</title>
-<meta http-equiv="Content-Style-Type" content="text/css" />
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta name="generator" content="Oracle DARB XHTML Converter - Version 4.5.3 Build 02" />
-<meta name="date" content="2005-07-10T12:57:20+08:00" />
-<meta name="robots" content="all" scheme="http://www.robotstxt.org/" />
-<meta name="doctitle" content="Create and Manage the orm.xml file" />
-<meta name="relnum" content="Release 1.0.0" />
-<meta name="partnum" content="" />
-<link rel="copyright" href="dcommon/html/cpyr.htm" title="Copyright" type="text/html" />
-<link rel="stylesheet" href="dcommon/css/blafdoc.css" title="Oracle BLAFDoc" type="text/css" />
-<link rel="start" href="../../index.htm" title="Home" type="text/html" />
-<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
-</head>
-<body>
-<p><a id="CEGJJBEE" name="CEGJJBEE"></a></p>
-<div class="sect1"><!-- infolevel="all" infotype="General" -->
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr valign="bottom">
-<td align="left" width="86%">
-<h1>Create and Manage the orm.xml file</h1>
-</td>
-</tr>
-</table>
-<p>When creating a JPA project, you can also create the <code>orm.xml</code> file. Select the <span class="bold">Create orm.xml</span> option on the <a href="ref_jpa_facet.htm#CACIFDIF">JPA Facet page</a> page of the <a href="ref_new_jpa_project_wizard.htm#CACBJGBG">Create New JPA Project wizard</a>.</p>
-<div class="figure"><a id="sthref246" name="sthref246"></a>
-<p class="titleinfigure">JPA Facet Dialog</p>
-<img src="img/jpa_facet_dialog.png" alt="JPA Facet dialog." title="JPA Facet dialog." /><br /></div>
-<!-- class="figure" -->
-<p>Use the <code>orm.xml</code> file to define the project and persistence unit defaults.</p>
-<div class="figure"><a id="sthref247" name="sthref247"></a>
-<p class="titleinfigure">JPA Details view for orm.xml file.</p>
-<img src="img/details_entitymappings.png" alt="JPA Details view for orm.xml file." title="JPA Details view for orm.xml file." /><br /></div>
-<!-- class="figure" -->
-<img src="img/ngrelc.png" alt="Related concept" title="Related concept" /><br />
-<br />
-<a href="whats_new.htm#BGGEDBGF">What's new</a></div>
-<!-- class="sect1" -->
-<!-- Start Footer -->
-<div class="footer">
-<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
-<tr>
-<td align="left" width="86%"><a href="dcommon/html/cpyr.htm"><span class="copyrightlogo">Copyright&nbsp;&copy;&nbsp;2006, 2007,&nbsp;Oracle.&nbsp;All&nbsp;rights&nbsp;reserved.</span></a></td>
-</tr>
-</table>
-</div>
-<!-- class="footer" -->
-</body>
-</html>
diff --git a/jpa/plugins/org.eclipse.jpt.gen/.cvsignore b/jpa/plugins/org.eclipse.jpt.gen/.cvsignore
index a196dd7..2d14989 100644
--- a/jpa/plugins/org.eclipse.jpt.gen/.cvsignore
+++ b/jpa/plugins/org.eclipse.jpt.gen/.cvsignore
@@ -1,6 +1,3 @@
 bin
 @dot
-temp.folder
 build.xml
-javaCompiler...args
-javaCompiler...args.*
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.gen/META-INF/MANIFEST.MF b/jpa/plugins/org.eclipse.jpt.gen/META-INF/MANIFEST.MF
index 3ca31f2..0162a7c 100644
--- a/jpa/plugins/org.eclipse.jpt.gen/META-INF/MANIFEST.MF
+++ b/jpa/plugins/org.eclipse.jpt.gen/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-SymbolicName: org.eclipse.jpt.gen
-Bundle-Version: 1.0.100.qualifier
+Bundle-Version: 1.0.0.qualifier
 Bundle-ClassPath: .
 Bundle-Localization: plugin
 Export-Package: org.eclipse.jpt.gen.internal; x-friends:="org.eclipse.jpt.ui"
diff --git a/jpa/plugins/org.eclipse.jpt.ui/.cvsignore b/jpa/plugins/org.eclipse.jpt.ui/.cvsignore
index a196dd7..ba077a4 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/.cvsignore
+++ b/jpa/plugins/org.eclipse.jpt.ui/.cvsignore
@@ -1,6 +1 @@
 bin
-@dot
-temp.folder
-build.xml
-javaCompiler...args
-javaCompiler...args.*
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.ui/META-INF/MANIFEST.MF b/jpa/plugins/org.eclipse.jpt.ui/META-INF/MANIFEST.MF
index b0b82b8..4ed5329 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/META-INF/MANIFEST.MF
+++ b/jpa/plugins/org.eclipse.jpt.ui/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-SymbolicName: org.eclipse.jpt.ui;singleton:=true
-Bundle-Version: 1.0.100.qualifier
+Bundle-Version: 1.0.0.qualifier
 Bundle-Activator: org.eclipse.jpt.ui.internal.JptUiPlugin
 Bundle-ClassPath: .
 Bundle-Localization: plugin
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/GenericJpaUiFactory.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/GenericJpaUiFactory.java
index 9d3edce..cd47ffe 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/GenericJpaUiFactory.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/GenericJpaUiFactory.java
@@ -9,6 +9,10 @@
  ******************************************************************************/
 package org.eclipse.jpt.ui.internal;
 
+import org.eclipse.emf.common.command.CommandStack;
+import org.eclipse.jpt.ui.internal.details.IJpaComposite;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
 
 public class GenericJpaUiFactory extends BaseJpaUiFactory
 {
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/IJpaUiFactory.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/IJpaUiFactory.java
index 2939cdf..a66e18f 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/IJpaUiFactory.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/IJpaUiFactory.java
@@ -10,6 +10,21 @@
 package org.eclipse.jpt.ui.internal;
 
 import org.eclipse.emf.common.command.CommandStack;
+import org.eclipse.jpt.core.internal.content.java.mappings.IJavaBasic;
+import org.eclipse.jpt.core.internal.content.java.mappings.IJavaEmbeddable;
+import org.eclipse.jpt.core.internal.content.java.mappings.IJavaEmbedded;
+import org.eclipse.jpt.core.internal.content.java.mappings.IJavaEmbeddedId;
+import org.eclipse.jpt.core.internal.content.java.mappings.IJavaEntity;
+import org.eclipse.jpt.core.internal.content.java.mappings.IJavaId;
+import org.eclipse.jpt.core.internal.content.java.mappings.IJavaManyToMany;
+import org.eclipse.jpt.core.internal.content.java.mappings.IJavaManyToOne;
+import org.eclipse.jpt.core.internal.content.java.mappings.IJavaMappedSuperclass;
+import org.eclipse.jpt.core.internal.content.java.mappings.IJavaOneToMany;
+import org.eclipse.jpt.core.internal.content.java.mappings.IJavaOneToOne;
+import org.eclipse.jpt.core.internal.content.java.mappings.IJavaTransient;
+import org.eclipse.jpt.core.internal.content.java.mappings.IJavaVersion;
+import org.eclipse.jpt.core.internal.jdtutility.Attribute;
+import org.eclipse.jpt.core.internal.jdtutility.Type;
 import org.eclipse.jpt.ui.internal.details.IJpaComposite;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/actions/PersistentAttributeActionFilter.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/actions/PersistentAttributeActionFilter.java
index 2430550..f807a80 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/actions/PersistentAttributeActionFilter.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/actions/PersistentAttributeActionFilter.java
@@ -49,8 +49,9 @@
 		public Object getAdapter(final Object adaptable, final Class adapterType ) {
 			if( adapterType == IActionFilter.class ) {
 				return new PersistentAttributeActionFilter();
+			} else {
+				return null;
 			}
-			return null;
 		}
 	    
 		public Class[] getAdapterList() {
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/actions/RemovePersistentAttributeFromXmlAction.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/actions/RemovePersistentAttributeFromXmlAction.java
index 849f0ea..326949e 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/actions/RemovePersistentAttributeFromXmlAction.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/actions/RemovePersistentAttributeFromXmlAction.java
@@ -15,6 +15,7 @@
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jpt.core.internal.content.orm.XmlPersistentAttribute;
 import org.eclipse.jpt.core.internal.content.orm.XmlPersistentType;
+import org.eclipse.jpt.core.internal.content.orm.XmlTypeMapping;
 import org.eclipse.ui.actions.ActionDelegate;
 
 public class RemovePersistentAttributeFromXmlAction extends ActionDelegate
@@ -32,7 +33,7 @@
 		if (this.selection instanceof StructuredSelection) {
 			for (Iterator<XmlPersistentAttribute> i = ((StructuredSelection) selection).iterator(); i.hasNext(); ) {
 				XmlPersistentAttribute xmlPersistentAttribute = i.next();
-				XmlPersistentType xmlPersistentType = xmlPersistentAttribute.typeMapping().getPersistentType();
+				XmlPersistentType xmlPersistentType = ((XmlTypeMapping) xmlPersistentAttribute.typeMapping()).getPersistentType();
 				xmlPersistentType.getSpecifiedAttributeMappings().remove(xmlPersistentAttribute.getMapping());
 			}
 		}
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/dialogs/AddPersistentAttributeToXmlAndMapDialog.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/dialogs/AddPersistentAttributeToXmlAndMapDialog.java
index f440c88..6c6ab4e 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/dialogs/AddPersistentAttributeToXmlAndMapDialog.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/dialogs/AddPersistentAttributeToXmlAndMapDialog.java
@@ -10,6 +10,7 @@
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jpt.core.internal.IJpaProject;
 import org.eclipse.jpt.core.internal.content.orm.XmlPersistentAttribute;
 import org.eclipse.jpt.ui.internal.JptUiMessages;
 import org.eclipse.jpt.ui.internal.JptUiPlugin;
@@ -37,9 +38,13 @@
 public class AddPersistentAttributeToXmlAndMapDialog extends StatusDialog
 {
 	private XmlPersistentAttribute unmappedPersistentAttribute;
-			
+	
+	private Label attributeLabel;
+		
 	private Text attributeText;
 	
+	private Label mappingLabel;
+	
 	private ComboViewer mappingCombo;
 		
 	
@@ -56,7 +61,7 @@
 		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
 		composite.setLayout(new GridLayout());
 		
-		createLabel(composite, 1, JptUiMessages.AddPersistentAttributeDialog_attributeLabel);
+		attributeLabel = createLabel(composite, 1, JptUiMessages.AddPersistentAttributeDialog_attributeLabel);
 			
 		attributeText = createText(composite, 1);
 //		attributeText.addModifyListener(
@@ -69,7 +74,7 @@
 		attributeText.setText(unmappedPersistentAttribute.getName());
 		attributeText.setEditable(false);
 		
-		createLabel(composite, 1, JptUiMessages.AddPersistentClassDialog_mappingLabel);
+		mappingLabel = createLabel(composite, 1, JptUiMessages.AddPersistentClassDialog_mappingLabel);
 		
 		mappingCombo = new ComboViewer(createCombo(composite, 1));
 		mappingCombo.setContentProvider(
@@ -145,6 +150,10 @@
 		return combo;
 	}
 	
+	private IJpaProject getJpaProject() {
+		return unmappedPersistentAttribute.getJpaProject();
+	}
+	
 	public String getAttributeName() {
 		return attributeText.getText();
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/dialogs/AddPersistentClassDialog.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/dialogs/AddPersistentClassDialog.java
index 4336319..836f0d3 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/dialogs/AddPersistentClassDialog.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/dialogs/AddPersistentClassDialog.java
@@ -59,10 +59,14 @@
 {
 	private EntityMappingsInternal entityMappings;
 	
+	private Label classLabel;
+		
 	private Text classText;
 	
 	private Button classBrowseButton;
 	
+	private Label mappingLabel;
+	
 	private ComboViewer mappingCombo;
 		
 	
@@ -79,7 +83,7 @@
 		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
 		composite.setLayout(new GridLayout(2, false));
 		
-		createLabel(composite, 2, JptUiMessages.AddPersistentClassDialog_classLabel);
+		classLabel = createLabel(composite, 2, JptUiMessages.AddPersistentClassDialog_classLabel);
 			
 		classText = createText(composite, 1);
 		classText.addModifyListener(
@@ -103,7 +107,7 @@
 			}
 		});
 		
-		createLabel(composite, 2, JptUiMessages.AddPersistentClassDialog_mappingLabel);
+		mappingLabel = createLabel(composite, 2, JptUiMessages.AddPersistentClassDialog_mappingLabel);
 		
 		mappingCombo = new ComboViewer(createCombo(composite, 2));
 		mappingCombo.setContentProvider(
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/generic/EntitiesGenerator.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/generic/EntitiesGenerator.java
index fcc016d..05fe71c 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/generic/EntitiesGenerator.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/generic/EntitiesGenerator.java
@@ -10,13 +10,13 @@
 package org.eclipse.jpt.ui.internal.generic;
 
 import java.util.Collection;
+
+import org.eclipse.core.resources.IWorkspaceRunnable;
 import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.WorkspaceJob;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.viewers.IStructuredSelection;
@@ -75,7 +75,7 @@
 		dialog.create();
 		int returnCode = dialog.open();
 		if (returnCode == Window.OK) {
-			WorkspaceJob runnable = new GenerateEntitiesRunnable(
+			IWorkspaceRunnable runnable = new GenerateEntitiesRunnable(
 					wizard.getPackageGeneratorConfig(),
 					wizard.getEntityGeneratorConfig(),
 					wizard.getSelectedTables(),
@@ -83,8 +83,12 @@
 					project,
 					new OverwriteConfirmer(this.getCurrentShell())
 			);
-			
-			runnable.schedule();
+			try {
+				// TODO pass in real ProgressMonitor
+				ResourcesPlugin.getWorkspace().run(runnable, new NullProgressMonitor());
+			} catch (CoreException ex) {
+				throw new RuntimeException(ex);
+			}
 		}
 	}
 	
@@ -94,7 +98,7 @@
 	  
 	// ********** runnable **********
 
-	static class GenerateEntitiesRunnable extends WorkspaceJob {
+	static class GenerateEntitiesRunnable implements IWorkspaceRunnable {
 		private final PackageGenerator.Config packageConfig;
 		private final EntityGenerator.Config entityConfig;
 		private final Collection selectedTables;
@@ -110,31 +114,31 @@
 				IJpaProject project,
 				EntityGenerator.OverwriteConfirmer overwriteConfirmer
 		) {
-			super("Generating Entities");
+			super();
 			this.packageConfig = packageConfig;
 			this.entityConfig = entityConfig;
 			this.selectedTables = selectedTables;
 			this.synchronizePersistenceXml = synchronizePersistenceXml;
 			this.overwriteConfirmer = overwriteConfirmer;
 			this.project = project;
-			setRule(project.getProject());
 		}
 
-		@Override
-		public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
-			PackageGenerator.generateEntities(this.packageConfig, this.entityConfig, this.selectedTables, this.overwriteConfirmer, monitor);
-			//force resourceChangeEvents to be posted before synchronizing persistence.xml
-			ResourcesPlugin.getWorkspace().checkpoint(false);
-			if (synchronizePersistenceXml) {
-				// we currently only support *one* persistence.xml file per project
-				IJpaFile resource = project.getPlatform().validPersistenceXmlFiles().next();
-				if (resource != null) {
-					SynchronizeClassesJob job = new SynchronizeClassesJob(resource.getFile());
-					job.schedule();
+		public void run(IProgressMonitor monitor) throws CoreException {
+			monitor.beginTask("", 1000);
+			try {
+				PackageGenerator.generateEntities(this.packageConfig, this.entityConfig, this.selectedTables, this.overwriteConfirmer, monitor);
+				if (synchronizePersistenceXml) {
+					// we currently only support *one* persistence.xml file per project
+					IJpaFile resource = project.getPlatform().validPersistenceXmlFiles().next();
+					if (resource != null) {
+						SynchronizeClassesJob job = new SynchronizeClassesJob(resource.getFile());
+						job.schedule();
+					}
 				}
+			} catch (OperationCanceledException ex) {
+				// fall through and tell monitor we are done
 			}
-			
-			return Status.OK_STATUS;
+			monitor.done();
 		}
 
 	}
@@ -151,7 +155,7 @@
 			this.shell = shell;
 		}
 
-		public boolean overwrite(final String className) {
+		public boolean overwrite(String className) {
 			if (this.overwriteAll) {
 				return true;
 			}
@@ -162,15 +166,8 @@
 		}
 
 		private boolean promptUser(String className) {
-			
-			final OverwriteConfirmerDialog dialog = new OverwriteConfirmerDialog(this.shell, className);
-			//get on the UI thread synchronously, need feedback before continuing
-			shell.getDisplay().syncExec(new Runnable() {
-				public void run() {
-					dialog.open();
-				}
-			});
-			if (dialog.getReturnCode() == Window.CANCEL) {
+			OverwriteConfirmerDialog dialog = new OverwriteConfirmerDialog(this.shell, className);
+			if (dialog.open() == Window.CANCEL) {
 				throw new OperationCanceledException();
 			}
 			if (dialog.yes()) {
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/BasicMappingUiProvider.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/BasicMappingUiProvider.java
index f9882fb..b1a3ce7 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/BasicMappingUiProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/BasicMappingUiProvider.java
@@ -15,6 +15,7 @@
 import org.eclipse.jpt.ui.internal.details.IJpaComposite;
 import org.eclipse.jpt.ui.internal.java.details.IAttributeMappingUiProvider;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.mappings.details.BasicComposite;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
 
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/DefaultBasicMappingUiProvider.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/DefaultBasicMappingUiProvider.java
index 5eee3a0..090752d 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/DefaultBasicMappingUiProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/DefaultBasicMappingUiProvider.java
@@ -15,6 +15,7 @@
 import org.eclipse.jpt.ui.internal.details.IJpaComposite;
 import org.eclipse.jpt.ui.internal.java.details.IAttributeMappingUiProvider;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.mappings.details.BasicComposite;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
 
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/DefaultEmbeddedMappingUiProvider.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/DefaultEmbeddedMappingUiProvider.java
index f8c882d..385150b 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/DefaultEmbeddedMappingUiProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/DefaultEmbeddedMappingUiProvider.java
@@ -15,6 +15,7 @@
 import org.eclipse.jpt.ui.internal.details.IJpaComposite;
 import org.eclipse.jpt.ui.internal.java.details.IAttributeMappingUiProvider;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.mappings.details.EmbeddedComposite;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
 
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/EmbeddedIdMappingUiProvider.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/EmbeddedIdMappingUiProvider.java
index 65b4665..e80ad57 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/EmbeddedIdMappingUiProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/EmbeddedIdMappingUiProvider.java
@@ -15,6 +15,7 @@
 import org.eclipse.jpt.ui.internal.details.IJpaComposite;
 import org.eclipse.jpt.ui.internal.java.details.IAttributeMappingUiProvider;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.mappings.details.EmbeddedIdComposite;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
 
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/EmbeddedMappingUiProvider.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/EmbeddedMappingUiProvider.java
index e5387c4..0938a6b 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/EmbeddedMappingUiProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/EmbeddedMappingUiProvider.java
@@ -15,6 +15,7 @@
 import org.eclipse.jpt.ui.internal.details.IJpaComposite;
 import org.eclipse.jpt.ui.internal.java.details.IAttributeMappingUiProvider;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.mappings.details.EmbeddedComposite;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
 
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/IdMappingUiProvider.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/IdMappingUiProvider.java
index 2d1dafd..8dad497 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/IdMappingUiProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/IdMappingUiProvider.java
@@ -15,6 +15,7 @@
 import org.eclipse.jpt.ui.internal.details.IJpaComposite;
 import org.eclipse.jpt.ui.internal.java.details.IAttributeMappingUiProvider;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.mappings.details.IdComposite;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
 
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/ManyToManyMappingUiProvider.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/ManyToManyMappingUiProvider.java
index 286c454..2cbfe6e 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/ManyToManyMappingUiProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/ManyToManyMappingUiProvider.java
@@ -15,6 +15,7 @@
 import org.eclipse.jpt.ui.internal.details.IJpaComposite;
 import org.eclipse.jpt.ui.internal.java.details.IAttributeMappingUiProvider;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.mappings.details.ManyToManyComposite;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
 
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/ManyToOneMappingUiProvider.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/ManyToOneMappingUiProvider.java
index ea619de..44e7050 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/ManyToOneMappingUiProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/ManyToOneMappingUiProvider.java
@@ -15,6 +15,7 @@
 import org.eclipse.jpt.ui.internal.details.IJpaComposite;
 import org.eclipse.jpt.ui.internal.java.details.IAttributeMappingUiProvider;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.mappings.details.ManyToOneComposite;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
 
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/OneToManyMappingUiProvider.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/OneToManyMappingUiProvider.java
index cc9fd85..26c96c6 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/OneToManyMappingUiProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/OneToManyMappingUiProvider.java
@@ -15,6 +15,7 @@
 import org.eclipse.jpt.ui.internal.details.IJpaComposite;
 import org.eclipse.jpt.ui.internal.java.details.IAttributeMappingUiProvider;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.mappings.details.OneToManyComposite;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
 
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/OneToOneMappingUiProvider.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/OneToOneMappingUiProvider.java
index d59e50c..9bd426d 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/OneToOneMappingUiProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/OneToOneMappingUiProvider.java
@@ -15,6 +15,7 @@
 import org.eclipse.jpt.ui.internal.details.IJpaComposite;
 import org.eclipse.jpt.ui.internal.java.details.IAttributeMappingUiProvider;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.mappings.details.OneToOneComposite;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
 
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/TransientMappingUiProvider.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/TransientMappingUiProvider.java
index 10d679d..e77742a 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/TransientMappingUiProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/TransientMappingUiProvider.java
@@ -15,6 +15,7 @@
 import org.eclipse.jpt.ui.internal.details.IJpaComposite;
 import org.eclipse.jpt.ui.internal.java.details.IAttributeMappingUiProvider;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.mappings.details.TransientComposite;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
 
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/VersionMappingUiProvider.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/VersionMappingUiProvider.java
index 67f4d52..de3dc66 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/VersionMappingUiProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/mappings/properties/VersionMappingUiProvider.java
@@ -15,6 +15,7 @@
 import org.eclipse.jpt.ui.internal.details.IJpaComposite;
 import org.eclipse.jpt.ui.internal.java.details.IAttributeMappingUiProvider;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.mappings.details.VersionComposite;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
 
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/structure/JavaCompilationUnitItemProvider.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/structure/JavaCompilationUnitItemProvider.java
index ba60ac4..e643328 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/structure/JavaCompilationUnitItemProvider.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/structure/JavaCompilationUnitItemProvider.java
@@ -12,15 +12,11 @@
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
 import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
 import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jpt.core.internal.content.java.JpaCompilationUnit;
 import org.eclipse.jpt.core.internal.content.java.JpaJavaPackage;
 
 public class JavaCompilationUnitItemProvider extends ItemProviderAdapter
@@ -34,26 +30,11 @@
 	}
 	
 	@Override
-	protected Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
-		if (this.childrenFeatures == null) {
+	public Collection getChildrenFeatures(Object object) {
+		if (childrenFeatures == null) {
 			super.getChildrenFeatures(object);
-			this.childrenFeatures.add(JpaJavaPackage.Literals.JPA_COMPILATION_UNIT__TYPES);
+			childrenFeatures.add(JpaJavaPackage.Literals.JPA_COMPILATION_UNIT__TYPES);
 		}
-		return this.childrenFeatures;
-	}
-	
-	@Override
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(JpaCompilationUnit.class)) {
-			case JpaJavaPackage.JPA_COMPILATION_UNIT__TYPES:
-				fireNotifyChanged(
-					new ViewerNotification(
-						notification, notification.getNotifier(), true, false));
-			return;
-		}
-		
-		super.notifyChanged(notification);
+		return childrenFeatures;
 	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/CatalogCombo.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/CatalogCombo.java
index 7d842e9..c51d015 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/CatalogCombo.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/CatalogCombo.java
@@ -10,7 +10,6 @@
 package org.eclipse.jpt.ui.internal.mappings.details;
 
 import java.util.Iterator;
-
 import org.eclipse.emf.common.command.CommandStack;
 import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.Notification;
@@ -18,6 +17,7 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jpt.core.internal.mappings.ITable;
 import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
+import org.eclipse.jpt.db.internal.Connection;
 import org.eclipse.jpt.db.internal.ConnectionListener;
 import org.eclipse.jpt.db.internal.ConnectionProfile;
 import org.eclipse.jpt.db.internal.Database;
@@ -70,11 +70,11 @@
 
 	private ConnectionListener buildConnectionListener() {
 		return new ConnectionListener() {
-			public void aboutToClose(ConnectionProfile profile) {
+			public void aboutToClose(Connection connection) {
 			// not interested to this event.
 			}
 
-			public void closed(ConnectionProfile profile) {
+			public void closed(Connection connection) {
 				getCombo().getDisplay().asyncExec(new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -85,7 +85,7 @@
 				});
 			}
 
-			public void modified(ConnectionProfile profile) {
+			public void modified(Connection connection) {
 				getCombo().getDisplay().asyncExec(new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -96,12 +96,12 @@
 				});
 			}
 
-			public boolean okToClose(ConnectionProfile profile) {
+			public boolean okToClose(Connection connection) {
 				// not interested to this event.
 				return true;
 			}
 
-			public void opened(ConnectionProfile profile) {
+			public void opened(Connection connection) {
 				getCombo().getDisplay().asyncExec(new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -112,7 +112,7 @@
 				});
 			}
 
-			public void databaseChanged(ConnectionProfile profile, final Database database) {
+			public void databaseChanged(Connection connection, final Database database) {
 				getControl().getDisplay().asyncExec(new Runnable() {
 					public void run() {
 						if (database == CatalogCombo.this.getDatabase()) {
@@ -124,11 +124,11 @@
 				});
 			}
 
-			public void schemaChanged(ConnectionProfile profile, final Schema schema) {
+			public void schemaChanged(Connection connection, final Schema schema) {
 			// not interested to this event.
 			}
 
-			public void tableChanged(ConnectionProfile profile, final Table table) {
+			public void tableChanged(Connection connection, final Table table) {
 			// not interested to this event.
 			}
 		};
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/ColumnComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/ColumnComposite.java
index 3c55a65..7502f79 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/ColumnComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/ColumnComposite.java
@@ -9,18 +9,19 @@
 package org.eclipse.jpt.ui.internal.mappings.details;
 
 import java.util.Iterator;
-
 import org.eclipse.emf.common.command.CommandStack;
 import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.impl.AdapterImpl;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.jpt.core.internal.IJpaProject;
 import org.eclipse.jpt.core.internal.mappings.DefaultTrueBoolean;
 import org.eclipse.jpt.core.internal.mappings.IAbstractColumn;
 import org.eclipse.jpt.core.internal.mappings.IColumn;
 import org.eclipse.jpt.core.internal.mappings.INamedColumn;
 import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
+import org.eclipse.jpt.db.internal.Connection;
 import org.eclipse.jpt.db.internal.ConnectionListener;
 import org.eclipse.jpt.db.internal.ConnectionProfile;
 import org.eclipse.jpt.db.internal.Database;
@@ -78,11 +79,11 @@
     private ConnectionListener buildConnectionListener() {
 		return new ConnectionListener() {
 
-			public void aboutToClose(ConnectionProfile profile) {
+			public void aboutToClose(Connection connection) {
 				// not interested to this event.
 			}
 
-			public void closed(ConnectionProfile profile) {
+			public void closed(Connection connection) {
 				getControl().getDisplay().asyncExec( new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -93,7 +94,7 @@
 				});
 			}
 
-			public void modified(ConnectionProfile profile) {
+			public void modified(Connection connection) {
 				getControl().getDisplay().asyncExec( new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -104,12 +105,12 @@
 				});
 			}
 
-			public boolean okToClose(ConnectionProfile profile) {
+			public boolean okToClose(Connection connection) {
 				// not interested to this event.
 				return true;
 			}
 
-			public void opened(ConnectionProfile profile) {
+			public void opened(Connection connection) {
 				getControl().getDisplay().asyncExec( new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -120,15 +121,15 @@
 				});
 			}
 
-			public void databaseChanged(ConnectionProfile profile, final Database database) {
+			public void databaseChanged(Connection connection, final Database database) {
 				return;
 			}
 
-			public void schemaChanged(ConnectionProfile profile, final Schema schema) {
+			public void schemaChanged(Connection connection, final Schema schema) {
 				return;
 			}
 
-			public void tableChanged(ConnectionProfile profile, final Table table) {
+			public void tableChanged(Connection connection, final Table table) {
 				getControl().getDisplay().asyncExec( new Runnable() {
 					public void run() {
 						if(table == getDbTable()) {
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/CommonWidgets.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/CommonWidgets.java
index 72ff711..de7966c 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/CommonWidgets.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/CommonWidgets.java
@@ -16,6 +16,7 @@
 import org.eclipse.jpt.core.internal.mappings.DefaultEagerFetchType;
 import org.eclipse.jpt.core.internal.mappings.DefaultLazyFetchType;
 import org.eclipse.jpt.core.internal.mappings.DefaultTrueBoolean;
+import org.eclipse.jpt.core.internal.mappings.EnumType;
 import org.eclipse.jpt.core.internal.mappings.IAbstractColumn;
 import org.eclipse.jpt.core.internal.mappings.IColumn;
 import org.eclipse.jpt.core.internal.mappings.IMultiRelationshipMapping;
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddableComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddableComposite.java
index b7c98a5..2c98eb0 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddableComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddableComposite.java
@@ -9,7 +9,11 @@
 package org.eclipse.jpt.ui.internal.mappings.details;
 
 import org.eclipse.emf.common.command.CommandStack;
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jpt.core.internal.mappings.IEmbeddable;
 import org.eclipse.jpt.ui.internal.details.BaseJpaComposite;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FillLayout;
@@ -18,22 +22,25 @@
 
 public class EmbeddableComposite extends BaseJpaComposite 
 {
-//	private IEmbeddable embeddable;
-//	private Adapter mappedSuperclassListener;
+	private IEmbeddable embeddable;
+	private Adapter mappedSuperclassListener;
+	
+	private CommandStack commandStack;
+	
 	
 	public EmbeddableComposite(Composite parent, CommandStack commandStack, TabbedPropertySheetWidgetFactory widgetFactory) {
 		super(parent, SWT.NULL, commandStack, widgetFactory);
-		//this.mappedSuperclassListener = buildMappedSuperclassListener();
+		this.mappedSuperclassListener = buildMappedSuperclassListener();
 	}
 	
-//	private Adapter buildMappedSuperclassListener() {
-//		return new AdapterImpl() {
-//			@Override
-//			public void notifyChanged(Notification notification) {
-//				mappedSuperclassChanged(notification);
-//			}
-//		};
-//	}
+	private Adapter buildMappedSuperclassListener() {
+		return new AdapterImpl() {
+			@Override
+			public void notifyChanged(Notification notification) {
+				mappedSuperclassChanged(notification);
+			}
+		};
+	}
 	
 	@Override
 	protected void initializeLayout(Composite composite) {
@@ -71,7 +78,7 @@
 	
 	@Override
 	protected void doPopulate(EObject model) {
-		//this.embeddable = (IEmbeddable) model;
+		this.embeddable = (IEmbeddable) model;
 	}
 	
 	@Override
@@ -92,6 +99,10 @@
 //		}
 	}
 	
+	private void mappedSuperclassChanged(Notification notification) {
+		
+	}
+	
 //	private INotifyChangedListener getPersistentTypeListener() {
 //		if (this.persistentTypeListener == null) {
 //			this.persistentTypeListener = new INotifyChangedListener() {
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedComposite.java
index 3ad33eb..734a9c8 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedComposite.java
@@ -11,6 +11,7 @@
 
 import org.eclipse.emf.common.command.CommandStack;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jpt.core.internal.mappings.IEmbedded;
 import org.eclipse.jpt.ui.internal.details.BaseJpaComposite;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
@@ -19,7 +20,9 @@
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
 
 public class EmbeddedComposite extends BaseJpaComposite 
-{	
+{
+	private IEmbedded embedded;
+	
 	private EmbeddedAttributeOverridesComposite attributeOverridesComposite;
 
 	public EmbeddedComposite(Composite parent, CommandStack commandStack, TabbedPropertySheetWidgetFactory widgetFactory) {
@@ -46,6 +49,7 @@
 	
 	
 	public void doPopulate(EObject obj) {
+		this.embedded = (IEmbedded) obj;
 		this.attributeOverridesComposite.populate(obj);
 	}
 	
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EntityComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EntityComposite.java
index e81b6f2..7ddf3c9 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EntityComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EntityComposite.java
@@ -10,10 +10,17 @@
 
 import org.eclipse.emf.common.command.CommandStack;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
 import org.eclipse.jpt.core.internal.mappings.IEntity;
+import org.eclipse.jpt.core.internal.mappings.INamedQuery;
+import org.eclipse.jpt.core.internal.mappings.IQueryHint;
+import org.eclipse.jpt.core.internal.mappings.ITable;
+import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
 import org.eclipse.jpt.ui.internal.IJpaHelpContextIds;
 import org.eclipse.jpt.ui.internal.details.BaseJpaComposite;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.mappings.details.StringWithDefaultChooser.StringHolder;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -87,7 +94,7 @@
 		gridData.horizontalAlignment = GridData.FILL;
 		gridData.grabExcessHorizontalSpace = true;
 		this.entityNameCombo.getCombo().setLayoutData(gridData);
-		helpSystem.setHelp(this.entityNameCombo.getCombo(), IJpaHelpContextIds.ENTITY_NAME);
+		helpSystem.setHelp(entityNameCombo.getCombo(), IJpaHelpContextIds.ENTITY_NAME);
 		
 		
 		this.tableComposite = new TableComposite(generalComposite, this.commandStack, getWidgetFactory());
@@ -209,5 +216,124 @@
 	protected IEntity getEntity() {
 		return this.entity;
 	}
+	
+	
+	private abstract class TableHolder extends EObjectImpl implements StringHolder {
+		private ITable table;
+		
+		TableHolder(ITable table) {
+			super();
+			this.table = table;
+		}
+		
+		public Class featureClass() {
+			return ITable.class;
+		}
+		
+		public boolean supportsDefault() {
+			return true;
+		}
+		
+		public EObject wrappedObject() {
+			return this.table;
+		}
+		
+		public ITable getTable() {
+			return this.table;
+		}
+	}
+	
+	private class TableNameHolder extends TableHolder implements StringHolder {
+		
+		TableNameHolder(ITable table) {
+			super(table);
+		}
+			
+		public int featureId() {
+			return JpaCoreMappingsPackage.ITABLE__SPECIFIED_NAME;
+		}
+		
+		public int defaultFeatureId() {
+			return JpaCoreMappingsPackage.ITABLE__DEFAULT_NAME;
+		}
+		
+		public String defaultItem() {
+			String defaultName = getTable().getDefaultName();
+			if (defaultName != null) {
+				return NLS.bind(JptUiMappingsMessages.EntityComposite_tableDefault, defaultName);
+			}
+			return JptUiMappingsMessages.EntityComposite_tableNoDefaultSpecified;
+		}
+		
+		public String getString() {
+			return getTable().getSpecifiedName();
+		}
+		
+		public void setString(String newName) {
+			getTable().setSpecifiedName(newName);
+		}
+	}
+	
+	private class TableCatalogHolder extends TableHolder implements StringHolder {
+		
+		TableCatalogHolder(ITable table) {
+			super(table);
+		}
+			
+		public int featureId() {
+			return JpaCoreMappingsPackage.ITABLE__SPECIFIED_CATALOG;
+		}
+		
+		public int defaultFeatureId() {
+			return JpaCoreMappingsPackage.ITABLE__DEFAULT_CATALOG;
+		}
+		
+		public String defaultItem() {
+			String defaultCatalog = getTable().getDefaultCatalog();
+			if (defaultCatalog != null) {
+				return NLS.bind(JptUiMappingsMessages.EntityComposite_tableDefault, defaultCatalog);
+			}
+			return JptUiMappingsMessages.EntityComposite_tableNoDefaultSpecified;
+		}
+		
+		public String getString() {
+			return getTable().getSpecifiedCatalog();
+		}
+		
+		public void setString(String newName) {
+			getTable().setSpecifiedCatalog(newName);
+		}
+	}
+	
+	private class TableSchemaHolder extends TableHolder implements StringHolder {
+		
+		TableSchemaHolder(ITable table) {
+			super(table);
+		}
+			
+		public int featureId() {
+			return JpaCoreMappingsPackage.ITABLE__SPECIFIED_SCHEMA;
+		}
+		
+		public int defaultFeatureId() {
+			return JpaCoreMappingsPackage.ITABLE__DEFAULT_SCHEMA;
+		}
+		
+		public String defaultItem() {
+			String defaultSchema = getTable().getDefaultSchema();
+			if (defaultSchema != null) {
+				return NLS.bind(JptUiMappingsMessages.EntityComposite_tableDefault, defaultSchema);
+			}
+			return JptUiMappingsMessages.EntityComposite_tableNoDefaultSpecified;
+		}
+		
+		public String getString() {
+			return getTable().getSpecifiedSchema();
+		}
+		
+		public void setString(String newName) {
+			getTable().setSpecifiedSchema(newName);
+		}
+	}
 
 }
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EnumComboViewer.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EnumComboViewer.java
index 70f368b..2cf6b61 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EnumComboViewer.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EnumComboViewer.java
@@ -20,6 +20,7 @@
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jpt.core.internal.mappings.InheritanceType;
 import org.eclipse.jpt.ui.internal.details.BaseJpaController;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
 import org.eclipse.jpt.ui.internal.widgets.CComboViewer;
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/GeneratedValueComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/GeneratedValueComposite.java
index b010a89..c13c5f7 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/GeneratedValueComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/GeneratedValueComposite.java
@@ -23,6 +23,7 @@
 import org.eclipse.jpt.core.internal.mappings.GenerationType;
 import org.eclipse.jpt.core.internal.mappings.IGeneratedValue;
 import org.eclipse.jpt.core.internal.mappings.IId;
+import org.eclipse.jpt.core.internal.mappings.InheritanceType;
 import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
 import org.eclipse.jpt.core.internal.platform.IGeneratorRepository;
 import org.eclipse.jpt.core.internal.platform.NullGeneratorRepository;
@@ -162,8 +163,8 @@
 	}
 
 	private void createGeneratedValue() {
-		this.generatedValue = this.id.createGeneratedValue();
-		this.id.setGeneratedValue(this.generatedValue);
+		IGeneratedValue generatedValue = this.id.createGeneratedValue();
+		this.id.setGeneratedValue(generatedValue);
 	}
 	
 
@@ -202,7 +203,7 @@
 			this.generatedValue = this.id.getGeneratedValue();
 		}
 		if (this.generatedValue == null) {
-			this.strategyComboViewer.getCombo().setText("");
+			this.strategyComboViewer.getCombo().deselectAll();
 			this.generatorNameCombo.setText("");
 			this.populating = false;
 			return;
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/InheritanceComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/InheritanceComposite.java
index d0dc292..deb6154 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/InheritanceComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/InheritanceComposite.java
@@ -10,7 +10,6 @@
 package org.eclipse.jpt.ui.internal.mappings.details;
 
 import java.util.Iterator;
-
 import org.eclipse.emf.common.command.CommandStack;
 import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.Notification;
@@ -29,6 +28,7 @@
 import org.eclipse.jpt.core.internal.mappings.INamedColumn;
 import org.eclipse.jpt.core.internal.mappings.InheritanceType;
 import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
+import org.eclipse.jpt.db.internal.Connection;
 import org.eclipse.jpt.db.internal.ConnectionListener;
 import org.eclipse.jpt.db.internal.ConnectionProfile;
 import org.eclipse.jpt.db.internal.Database;
@@ -96,11 +96,11 @@
     private ConnectionListener buildConnectionListener() {
 		return new ConnectionListener() {
 
-			public void aboutToClose(ConnectionProfile profile) {
+			public void aboutToClose(Connection connection) {
 				// not interested to this event.
 			}
 
-			public void closed(ConnectionProfile profile) {
+			public void closed(Connection connection) {
 				getControl().getDisplay().asyncExec( new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -111,7 +111,7 @@
 				});
 			}
 
-			public void modified(ConnectionProfile profile) {
+			public void modified(Connection connection) {
 				getControl().getDisplay().asyncExec( new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -122,12 +122,12 @@
 				});
 			}
 
-			public boolean okToClose(ConnectionProfile profile) {
+			public boolean okToClose(Connection connection) {
 				// not interested to this event.
 				return true;
 			}
 
-			public void opened(ConnectionProfile profile) {
+			public void opened(Connection connection) {
 				getControl().getDisplay().asyncExec( new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -138,15 +138,15 @@
 				});
 			}
 
-			public void databaseChanged(ConnectionProfile profile, final Database database) {
+			public void databaseChanged(Connection connection, final Database database) {
 				return;
 			}
 
-			public void schemaChanged(ConnectionProfile profile, final Schema schema) {
+			public void schemaChanged(Connection connection, final Schema schema) {
 				return;
 			}
 
-			public void tableChanged(ConnectionProfile profile, final Table table) {
+			public void tableChanged(Connection connection, final Table table) {
 				getControl().getDisplay().asyncExec( new Runnable() {
 					public void run() {
 						if(table == getDbTable()) {
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinColumnDialog.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinColumnDialog.java
index ff716ce..e36b19e 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinColumnDialog.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinColumnDialog.java
@@ -18,6 +18,7 @@
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jpt.core.internal.mappings.DefaultTrueBoolean;
 import org.eclipse.jpt.core.internal.mappings.IJoinColumn;
+import org.eclipse.jpt.core.internal.mappings.InheritanceType;
 import org.eclipse.jpt.db.internal.Schema;
 import org.eclipse.jpt.ui.internal.IJpaHelpContextIds;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinTableComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinTableComposite.java
index 1f2f436..f5fd60c 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinTableComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinTableComposite.java
@@ -10,7 +10,6 @@
 package org.eclipse.jpt.ui.internal.mappings.details;
 
 import java.util.List;
-
 import org.eclipse.emf.common.command.CommandStack;
 import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.Notification;
@@ -22,6 +21,7 @@
 import org.eclipse.jpt.core.internal.mappings.IJoinColumn;
 import org.eclipse.jpt.core.internal.mappings.IJoinTable;
 import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
+import org.eclipse.jpt.db.internal.Connection;
 import org.eclipse.jpt.db.internal.ConnectionListener;
 import org.eclipse.jpt.db.internal.ConnectionProfile;
 import org.eclipse.jpt.db.internal.Database;
@@ -31,6 +31,7 @@
 import org.eclipse.jpt.ui.internal.details.BaseJpaComposite;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
 import org.eclipse.jpt.ui.internal.mappings.details.JoinColumnsComposite.Owner;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
@@ -76,11 +77,11 @@
 	private ConnectionListener buildConnectionListener() {
 		return new ConnectionListener() {
 
-			public void aboutToClose(ConnectionProfile profile) {
+			public void aboutToClose(Connection connection) {
 				// not interested to this event.
 			}
 
-			public void closed(ConnectionProfile profile) {
+			public void closed(Connection connection) {
 				getControl().getDisplay().asyncExec( new Runnable() {
 					public void run() {
 						JoinTableComposite.this.tableCombo.populate();
@@ -88,7 +89,7 @@
 				});
 			}
 
-			public void modified(ConnectionProfile profile) {
+			public void modified(Connection connection) {
 				getControl().getDisplay().asyncExec( new Runnable() {
 					public void run() {
 						JoinTableComposite.this.tableCombo.populate();
@@ -96,12 +97,12 @@
 				});
 			}
 
-			public boolean okToClose(ConnectionProfile profile) {
+			public boolean okToClose(Connection connection) {
 				// not interested to this event.
 				return true;
 			}
 
-			public void opened(ConnectionProfile profile) {
+			public void opened(Connection connection) {
 				getControl().getDisplay().asyncExec( new Runnable() {
 					public void run() {
 						JoinTableComposite.this.tableCombo.populate();
@@ -109,7 +110,7 @@
 				});
 			}
 
-			public void databaseChanged(ConnectionProfile profile, final Database database) {
+			public void databaseChanged(Connection connection, final Database database) {
 				getControl().getDisplay().asyncExec( new Runnable() {
 					public void run() {
 						if(database == JoinTableComposite.this.tableCombo.getDatabase()) {
@@ -121,7 +122,7 @@
 				});
 			}
 			
-			public void schemaChanged(ConnectionProfile profile, final Schema schema) {
+			public void schemaChanged(Connection connection, final Schema schema) {
 				getControl().getDisplay().asyncExec( new Runnable() {
 					public void run() {
 						if(schema == JoinTableComposite.this.tableCombo.getTableSchema()) {
@@ -133,7 +134,7 @@
 				});
 			}
 
-			public void tableChanged(ConnectionProfile profile, final Table table) {
+			public void tableChanged(Connection connection, final Table table) {
 				// not interested to this event.
 			}
 		};
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/ManyToOneComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/ManyToOneComposite.java
index 7454d7e..c36cd7b 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/ManyToOneComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/ManyToOneComposite.java
@@ -11,9 +11,13 @@
 
 import org.eclipse.emf.common.command.CommandStack;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.jpt.core.internal.mappings.DefaultTrueBoolean;
 import org.eclipse.jpt.core.internal.mappings.IManyToOne;
+import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
 import org.eclipse.jpt.ui.internal.IJpaHelpContextIds;
 import org.eclipse.jpt.ui.internal.details.BaseJpaComposite;
+import org.eclipse.jpt.ui.internal.mappings.details.EnumComboViewer.EnumHolder;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -33,6 +37,8 @@
 	
 	private EnumComboViewer optionalComboViewer;
 
+	private OrderingComposite orderByComposite;
+
 	private CascadeComposite cascadeComposite;
 
 	private JoinColumnComposite joinColumnComposite;
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/MappedSuperclassComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/MappedSuperclassComposite.java
index 4f9f718..7d21ec7 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/MappedSuperclassComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/MappedSuperclassComposite.java
@@ -9,7 +9,11 @@
 package org.eclipse.jpt.ui.internal.mappings.details;
 
 import org.eclipse.emf.common.command.CommandStack;
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jpt.core.internal.mappings.IMappedSuperclass;
 import org.eclipse.jpt.ui.internal.details.BaseJpaComposite;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FillLayout;
@@ -18,22 +22,25 @@
 
 public class MappedSuperclassComposite extends BaseJpaComposite 
 {
-//	private IMappedSuperclass mappedSuperclass;
-//	private Adapter mappedSuperclassListener;	
+	private IMappedSuperclass mappedSuperclass;
+	private Adapter mappedSuperclassListener;
+	
+	private CommandStack commandStack;
+	
 	
 	public MappedSuperclassComposite(Composite parent, CommandStack commandStack, TabbedPropertySheetWidgetFactory widgetFactory) {
 		super(parent, SWT.NULL, commandStack, widgetFactory);
-//		this.mappedSuperclassListener = buildMappedSuperclassListener();
+		this.mappedSuperclassListener = buildMappedSuperclassListener();
 	}
-//	
-//	private Adapter buildMappedSuperclassListener() {
-//		return new AdapterImpl() {
-//			@Override
-//			public void notifyChanged(Notification notification) {
-//				mappedSuperclassChanged(notification);
-//			}
-//		};
-//	}
+	
+	private Adapter buildMappedSuperclassListener() {
+		return new AdapterImpl() {
+			@Override
+			public void notifyChanged(Notification notification) {
+				mappedSuperclassChanged(notification);
+			}
+		};
+	}
 	
 	@Override
 	protected void initializeLayout(Composite composite) {
@@ -71,7 +78,7 @@
 	
 	@Override
 	protected void doPopulate(EObject model) {
-//		this.mappedSuperclass = (IMappedSuperclass) model;
+		this.mappedSuperclass = (IMappedSuperclass) model;
 	}
 	
 	@Override
@@ -92,6 +99,10 @@
 //		}
 	}
 	
+	private void mappedSuperclassChanged(Notification notification) {
+		
+	}
+	
 //	private INotifyChangedListener getPersistentTypeListener() {
 //		if (this.persistentTypeListener == null) {
 //			this.persistentTypeListener = new INotifyChangedListener() {
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/OneToOneComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/OneToOneComposite.java
index c80a9ff..f16a350 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/OneToOneComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/OneToOneComposite.java
@@ -11,8 +11,13 @@
 
 import org.eclipse.emf.common.command.CommandStack;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.jpt.core.internal.mappings.DefaultTrueBoolean;
 import org.eclipse.jpt.core.internal.mappings.IOneToOne;
+import org.eclipse.jpt.core.internal.mappings.ISingleRelationshipMapping;
+import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
 import org.eclipse.jpt.ui.internal.details.BaseJpaComposite;
+import org.eclipse.jpt.ui.internal.mappings.details.EnumComboViewer.EnumHolder;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -40,6 +45,10 @@
 		super(parent, SWT.NULL, commandStack, widgetFactory);
 	}
 	
+	private IOneToOne getOneToOne() {
+		return this.oneToOne;
+	}
+	
 	@Override
 	protected void initializeLayout(Composite composite) {
 		GridLayout layout = new GridLayout();
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/SchemaCombo.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/SchemaCombo.java
index f5b11b3..9655c22 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/SchemaCombo.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/SchemaCombo.java
@@ -10,7 +10,6 @@
 package org.eclipse.jpt.ui.internal.mappings.details;
 
 import java.util.Iterator;
-
 import org.eclipse.emf.common.command.CommandStack;
 import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.Notification;
@@ -18,6 +17,7 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jpt.core.internal.mappings.ITable;
 import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
+import org.eclipse.jpt.db.internal.Connection;
 import org.eclipse.jpt.db.internal.ConnectionListener;
 import org.eclipse.jpt.db.internal.ConnectionProfile;
 import org.eclipse.jpt.db.internal.Database;
@@ -70,11 +70,11 @@
 
 	private ConnectionListener buildConnectionListener() {
 		return new ConnectionListener() {
-			public void aboutToClose(ConnectionProfile profile) {
+			public void aboutToClose(Connection connection) {
 			// not interested to this event.
 			}
 
-			public void closed(ConnectionProfile profile) {
+			public void closed(Connection connection) {
 				getCombo().getDisplay().asyncExec(new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -85,7 +85,7 @@
 				});
 			}
 
-			public void modified(ConnectionProfile profile) {
+			public void modified(Connection connection) {
 				getCombo().getDisplay().asyncExec(new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -96,12 +96,12 @@
 				});
 			}
 
-			public boolean okToClose(ConnectionProfile profile) {
+			public boolean okToClose(Connection connection) {
 				// not interested to this event.
 				return true;
 			}
 
-			public void opened(ConnectionProfile profile) {
+			public void opened(Connection connection) {
 				getCombo().getDisplay().asyncExec(new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -112,7 +112,7 @@
 				});
 			}
 
-			public void databaseChanged(ConnectionProfile profile, final Database database) {
+			public void databaseChanged(Connection connection, final Database database) {
 				getControl().getDisplay().asyncExec(new Runnable() {
 					public void run() {
 						if (database == SchemaCombo.this.getDatabase()) {
@@ -124,7 +124,7 @@
 				});
 			}
 
-			public void schemaChanged(ConnectionProfile profile, final Schema schema) {
+			public void schemaChanged(Connection connection, final Schema schema) {
 				getControl().getDisplay().asyncExec(new Runnable() {
 					public void run() {
 						if (schema == SchemaCombo.this.getTableSchema()) {
@@ -136,7 +136,7 @@
 				});
 			}
 
-			public void tableChanged(ConnectionProfile profile, final Table table) {
+			public void tableChanged(Connection connection, final Table table) {
 			// not interested to this event.
 			}
 		};
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/TableCombo.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/TableCombo.java
index 68e148b..3304743 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/TableCombo.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/TableCombo.java
@@ -9,7 +9,6 @@
 package org.eclipse.jpt.ui.internal.mappings.details;
 
 import java.util.Iterator;
-
 import org.eclipse.emf.common.command.CommandStack;
 import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.Notification;
@@ -17,6 +16,7 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jpt.core.internal.mappings.ITable;
 import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
+import org.eclipse.jpt.db.internal.Connection;
 import org.eclipse.jpt.db.internal.ConnectionListener;
 import org.eclipse.jpt.db.internal.ConnectionProfile;
 import org.eclipse.jpt.db.internal.Database;
@@ -68,11 +68,11 @@
 
 	private ConnectionListener buildConnectionListener() {
 		return new ConnectionListener() {
-			public void aboutToClose(ConnectionProfile profile) {
+			public void aboutToClose(Connection connection) {
 			// not interested to this event.
 			}
 
-			public void closed(ConnectionProfile profile) {
+			public void closed(Connection connection) {
 				getCombo().getDisplay().asyncExec(new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -83,7 +83,7 @@
 				});
 			}
 
-			public void modified(ConnectionProfile profile) {
+			public void modified(Connection connection) {
 				getCombo().getDisplay().asyncExec(new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -94,12 +94,12 @@
 				});
 			}
 
-			public boolean okToClose(ConnectionProfile profile) {
+			public boolean okToClose(Connection connection) {
 				// not interested to this event.
 				return true;
 			}
 
-			public void opened(ConnectionProfile profile) {
+			public void opened(Connection connection) {
 				getCombo().getDisplay().asyncExec(new Runnable() {
 					public void run() {
 						if (getControl().isDisposed()) {
@@ -110,7 +110,7 @@
 				});
 			}
 
-			public void databaseChanged(ConnectionProfile profile, final Database database) {
+			public void databaseChanged(Connection connection, final Database database) {
 				getControl().getDisplay().asyncExec(new Runnable() {
 					public void run() {
 						if (database == TableCombo.this.getDatabase()) {
@@ -122,7 +122,7 @@
 				});
 			}
 
-			public void schemaChanged(ConnectionProfile profile, final Schema schema) {
+			public void schemaChanged(Connection connection, final Schema schema) {
 				getControl().getDisplay().asyncExec(new Runnable() {
 					public void run() {
 						if (schema == TableCombo.this.getTableSchema()) {
@@ -134,7 +134,7 @@
 				});
 			}
 
-			public void tableChanged(ConnectionProfile profile, final Table table) {
+			public void tableChanged(Connection connection, final Table table) {
 			// not interested to this event.
 			}
 		};
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/TableGeneratorComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/TableGeneratorComposite.java
index 7426882..4c2f937 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/TableGeneratorComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/TableGeneratorComposite.java
@@ -10,7 +10,6 @@
 package org.eclipse.jpt.ui.internal.mappings.details;
 
 import java.util.Iterator;
-
 import org.eclipse.emf.common.command.CommandStack;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.EObject;
@@ -18,6 +17,7 @@
 import org.eclipse.jpt.core.internal.mappings.IId;
 import org.eclipse.jpt.core.internal.mappings.ITableGenerator;
 import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
+import org.eclipse.jpt.db.internal.Connection;
 import org.eclipse.jpt.db.internal.ConnectionListener;
 import org.eclipse.jpt.db.internal.ConnectionProfile;
 import org.eclipse.jpt.db.internal.Database;
@@ -485,23 +485,23 @@
 	
 	private ConnectionListener buildConnectionListener() {
 		return new ConnectionListener() {
-			public void closed(ConnectionProfile profile) {
+			public void closed(Connection connection) {
 				populate();
 			}
 			
-			public void modified(ConnectionProfile profile) {
+			public void modified(Connection connection) {
 				populate();
 			}
 
-			public void opened(ConnectionProfile profile) {
+			public void opened(Connection connection) {
 				populate();
 			}
 
-			public void databaseChanged(ConnectionProfile profile, final Database database) {
+			public void databaseChanged(Connection connection, final Database database) {
 				populate();
 			}
 			
-			public void schemaChanged(ConnectionProfile profile, final Schema schema) {
+			public void schemaChanged(Connection connection, final Schema schema) {
 				populate();
 			}
 
@@ -518,16 +518,16 @@
 				});
 			}
 			
-			public void aboutToClose(ConnectionProfile profile) {
+			public void aboutToClose(Connection connection) {
 				// not interested to this event.
 			}
 			
-			public boolean okToClose(ConnectionProfile profile) {
+			public boolean okToClose(Connection connection) {
 				// not interested to this event.
 				return true;
 			}
 			
-			public void tableChanged(ConnectionProfile profile, final Table table) {
+			public void tableChanged(Connection connection, final Table table) {
 				// not interested to this event.
 			}
 		};
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/views/AbstractJpaView.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/views/AbstractJpaView.java
index 7e84647..e5d7cfc 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/views/AbstractJpaView.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/views/AbstractJpaView.java
@@ -14,6 +14,7 @@
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
 import org.eclipse.ui.part.PageBook;
 import org.eclipse.ui.part.ViewPart;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
@@ -60,7 +61,7 @@
 	private Composite buildDefaultComposite() {
 		Composite composite = getWidgetFactory().createComposite(pageBook, SWT.NONE);
 		composite.setLayout(new FillLayout(SWT.VERTICAL));
-		getWidgetFactory().createLabel(composite, defaultLabel);
+		Label label = getWidgetFactory().createLabel(composite, defaultLabel);
 		return composite;
 	}
 	
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/DatabaseReconnectWizardPage.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/DatabaseReconnectWizardPage.java
index c877155..fbf7292 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/DatabaseReconnectWizardPage.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/DatabaseReconnectWizardPage.java
@@ -12,10 +12,12 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
+
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.jpt.core.internal.IJpaProject;
+import org.eclipse.jpt.db.internal.Connection;
 import org.eclipse.jpt.db.internal.ConnectionListener;
 import org.eclipse.jpt.db.internal.ConnectionProfile;
 import org.eclipse.jpt.db.internal.ConnectionProfileRepository;
@@ -45,6 +47,7 @@
 
 	private ConnectionProfile profile;
 	private ConnectionListener connectionListener;
+	private DatabaseGroup databaseGroup;
 
 	public DatabaseReconnectWizardPage( IJpaProject jpaProject) {
 		super( "Database Settings"); //$NON-NLS-1$
@@ -63,7 +66,7 @@
 		Composite composite = new Composite( parent, SWT.NULL);
 		GridLayout layout = new GridLayout();
 		composite.setLayout( layout);
-		new DatabaseGroup( composite);
+		this.databaseGroup = new DatabaseGroup( composite);
 		Dialog.applyDialogFont( parent);
 		// TODO Add Help - testing
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IJpaHelpContextIds.PROPERTIES_JAVA_PERSISTENCE_CONNECTION);
@@ -109,7 +112,7 @@
 	}
 
 	public Collection<Table> getTables() {
-		Schema schema = this.getDefaultSchema();
+		Schema schema = this.getProjectUserSchema();
 		if ( schema != null && schema.getName() != null) {
 			return CollectionTools.collection( schema.tables());
 		}
@@ -140,18 +143,21 @@
 		String profileName = this.jpaProject.getDataSource().getConnectionProfileName();
 		return JptDbPlugin.getDefault().getConnectionProfileRepository().profileNamed( profileName);
 	}
-
-	Schema getDefaultSchema() {
-		ConnectionProfile profile = getProjectConnectionProfile();
-		return profile.getDatabase().schemaNamed( profile.getDefaultSchema());
+	
+	Schema getProjectUserSchema() {
+		ConnectionProfile profile = this.getProjectConnectionProfile();
+		return profile.getDatabase().schemaNamed( profile.getUserName());
 	}
 
 	// ********** member classes **********
 
 	private final class DatabaseGroup {
 		private final Group group;
+		private final Label connectionLabel;
 		private final Combo connectionCombo;
+		private final Label schemaLabel;
 		private final Combo schemaCombo;
+		private final Label schemaInfoLabel;
 		
 		private Link addConnectionLink;
 		private Link reconnectLink;
@@ -165,7 +171,7 @@
 			this.group.setText( JptUiMessages.DatabaseReconnectWizardPage_database);
 			//TODO Add Help
 //			PlatformUI.getWorkbench().getHelpSystem().setHelp( this.group, IDaliHelpContextIds.XXX);
-			createLabel( this.group, 1, JptUiMessages.DatabaseReconnectWizardPage_connection);
+			this.connectionLabel = createLabel( this.group, 1, JptUiMessages.DatabaseReconnectWizardPage_connection);
 			this.connectionCombo = createCombo( this.group, true);
 			this.connectionCombo.addSelectionListener( new SelectionAdapter() {
 				public void widgetDefaultSelected( SelectionEvent e) {
@@ -176,7 +182,7 @@
 					handleConnectionChange();
 				}
 			});
-			createLabel( this.group, 1, JptUiMessages.DatabaseReconnectWizardPage_schema);
+			this.schemaLabel = createLabel( this.group, 1, JptUiMessages.DatabaseReconnectWizardPage_schema);
 			this.schemaCombo = createCombo( this.group, true);
 			this.schemaCombo.addSelectionListener( new SelectionAdapter() {
 				public void widgetDefaultSelected( SelectionEvent e) {
@@ -187,7 +193,7 @@
 					handleSchemaChange();
 				}
 			});
-			createLabel( this.group, 2, JptUiMessages.DatabaseReconnectWizardPage_schemaInfo);
+			schemaInfoLabel = createLabel( this.group, 2, JptUiMessages.DatabaseReconnectWizardPage_schemaInfo);
 			this.addConnectionLink = new Link( this.group, SWT.NONE);
 			GridData data = new GridData( GridData.END, GridData.CENTER, false, false);
 			data.horizontalSpan = 2;
@@ -225,9 +231,9 @@
 			return jpaProject.getDataSource().getConnectionProfileName();
 		}
 		
-		Schema getDefaultSchema() {
+		Schema getProjectUserSchema() {
 			ConnectionProfile profile = getProjectConnectionProfile();
-			return profile.getDatabase().schemaNamed( profile.getDefaultSchema());
+			return profile.getDatabase().schemaNamed( profile.getUserName());
 		}
 
 		private void openConnectionProfileNamed( String connectionProfileName) {
@@ -247,7 +253,7 @@
 			// clear out connection entries from previous login.
 			this.connectionCombo.removeAll();
 			for ( Iterator<String> i = CollectionTools.sort( this.dtpConnectionProfileNames()); i.hasNext();) {
-				this.connectionCombo.add(i.next());
+				this.connectionCombo.add( ( String) i.next());
 			}
 
 			String connectionName = getProjectConnectionProfileName();
@@ -274,10 +280,10 @@
 			this.schemaCombo.removeAll();
 			ConnectionProfile connectionProfile = this.getConnectionProfileNamed( getConnectionProfileName());
 			for ( Iterator<String> stream = CollectionTools.sort( connectionProfile.getDatabase().schemaNames()); stream.hasNext();) {
-				this.schemaCombo.add(stream.next());
+				this.schemaCombo.add( ( String) stream.next());
 			}
 			// set login user name as default schema
-			Schema schema = this.getDefaultSchema();
+			Schema schema = this.getProjectUserSchema();
 			if ( schema != null && schema.getName() != null) {
 				schema =  connectionProfile.getDatabase().schemaNamed( schema.getName()); // verify schema exist
 				if ( schema != null) {
@@ -302,7 +308,6 @@
 			ConnectionProfile addedProfile = ConnectionProfileRepository.instance().profileNamed( addedProfileName);
 		
 			if( !addedProfile.isNull()) {
-				addedProfile.connect();
 				this.populateConnectionCombo();
 				this.connectionCombo.select( connectionCombo.indexOf( addedProfile.getName()));
 				this.handleConnectionChange();
@@ -312,40 +317,40 @@
 		private ConnectionListener buildConnectionListener() {
 			return new ConnectionListener() {
 
-				public void modified( ConnectionProfile profile) {
+				public void modified( Connection connection) {
 				// not interested to this event.
 				}
 
-				public boolean okToClose( ConnectionProfile profile) {
+				public boolean okToClose( Connection connection) {
 				// not interested to this event.
 					return true;
 				}
 
-				public void opened( ConnectionProfile profile) {
-					if( DatabaseReconnectWizardPage.this.profile.equals( profile)) {
+				public void opened( Connection connection) {
+					if( DatabaseReconnectWizardPage.this.profile.contains( connection)) {
 						DatabaseGroup.this.populateSchemaCombo();
 					}
 				}
 
-				public void aboutToClose( ConnectionProfile profile) {
-					if( DatabaseReconnectWizardPage.this.profile.equals( profile)) {
+				public void aboutToClose( Connection connection) {
+					if( DatabaseReconnectWizardPage.this.profile.contains( connection)) {
 						DatabaseReconnectWizardPage.this.removeConnectionListener();
 					}
 				}
 
-				public void closed( ConnectionProfile profile) {
+				public void closed( Connection connection) {
 				// not interested to this event.
 				}
 
-				public void databaseChanged(ConnectionProfile profile, final Database database) {
+				public void databaseChanged(Connection connection, final Database database) {
 				// not interested to this event.
 				}
 
-				public void schemaChanged(ConnectionProfile profile, final Schema schema) {
+				public void schemaChanged(Connection connection, final Schema schema) {
 				// not interested to this event.
 				}
 
-				public void tableChanged(ConnectionProfile profile, final Table table) {
+				public void tableChanged(Connection connection, final Table table) {
 				// not interested to this event.
 				}
 			};
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/GenerateEntitiesWizard.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/GenerateEntitiesWizard.java
index ed13920..65c7177 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/GenerateEntitiesWizard.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/GenerateEntitiesWizard.java
@@ -55,8 +55,10 @@
 	
 	public void addPages() {
 		super.addPages();
-		this.dbSettingsPage = new DatabaseReconnectWizardPage( this.jpaProject);
-		this.addPage(this.dbSettingsPage);
+		if ( ! this.jpaProjectIsConnected() ||  ! this.projectUserSchemaExists()) {
+			this.dbSettingsPage = new DatabaseReconnectWizardPage( this.jpaProject);
+			this.addPage(this.dbSettingsPage);
+		}
 		this.generateEntitiesPage = new GenerateEntitiesWizardPage();
 		this.addPage( this.generateEntitiesPage);
 		this.generateEntitiesPage.init( this.selection);
@@ -107,7 +109,7 @@
 		if ( this.dbSettingsPage != null) {
 			return this.dbSettingsPage.getTables();
 		}
-		return ( this.projectDefaultSchemaExists()) ? CollectionTools.collection( this.getDefaultSchema().tables()) : Collections.<Table>emptyList();
+		return ( this.projectUserSchemaExists()) ? CollectionTools.collection( this.getProjectUserSchema().tables()) : Collections.<Table>emptyList();
 	}
 	
 	ConnectionProfile getProjectConnectionProfile() {
@@ -117,10 +119,10 @@
 	IJpaProject getJpaProject(){
 		return this.jpaProject;
 	}
-
-	Schema getDefaultSchema() {
-		ConnectionProfile profile = getProjectConnectionProfile();
-		return profile.getDatabase().schemaNamed( profile.getDefaultSchema());
+	
+	Schema getProjectUserSchema() {
+		ConnectionProfile profile = this.getProjectConnectionProfile();
+		return profile.getDatabase().schemaNamed( profile.getUserName());
 	}
 	
 	public PackageGenerator.Config getPackageGeneratorConfig() {
@@ -146,9 +148,13 @@
         }
         return canFinish;
     }
+    
+	private boolean jpaProjectIsConnected() {
+		return this.getProjectConnectionProfile().isConnected();
+	}
 
-	private boolean projectDefaultSchemaExists() {
-		return ( this.getDefaultSchema() != null);
+	private boolean projectUserSchemaExists() {
+		return ( this.getProjectUserSchema() != null);
 	}
 	
 	/**
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/GenerateEntitiesWizardPage.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/GenerateEntitiesWizardPage.java
index 484c2e9..2a00d5c 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/GenerateEntitiesWizardPage.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/GenerateEntitiesWizardPage.java
@@ -336,7 +336,7 @@
 	}
 
 	String entityName(Table table) {
-		String overrideEntityName = this.overrideEntityNames.get(table);
+		String overrideEntityName = (String) this.overrideEntityNames.get(table);
 		return (overrideEntityName != null) ? overrideEntityName : this.defaultEntityName(table);
 	}
 
@@ -359,42 +359,73 @@
 	boolean convertToCamelCase() {
 		return this.convertToCamelCase;
 	}
+	private void setConvertToCamelCase(boolean convertToCamelCase) {
+		// TODO re-calculate the default entity names if this changes
+		this.convertToCamelCase = convertToCamelCase;
+	}
 
 	boolean fieldAccessType() {
 		return this.fieldAccessType;
 	}
+	private void setFieldAccessType(boolean fieldAccessType) {
+		this.fieldAccessType = fieldAccessType;
+	}
 
 	String getCollectionTypeName() {
 		return this.collectionTypeName;
 	}
+	private void setCollectionTypeName(String collectionTypeName) {
+		this.collectionTypeName = collectionTypeName;
+	}
 
 	int getFieldVisibility() {
 		return this.fieldVisibility;
 	}
+	private void setFieldVisibility(int fieldVisibility) {
+		this.fieldVisibility = fieldVisibility;
+	}
 
 	int getMethodVisibility() {
 		return this.methodVisibility;
 	}
+	private void setMethodVisibility(int methodVisibility) {
+		this.methodVisibility = methodVisibility;
+	}
 
 	boolean generateGettersAndSetters() {
 		return this.generateGettersAndSetters;
 	}
+	private void setGenerateGettersAndSetters(boolean generateGettersAndSetters) {
+		this.generateGettersAndSetters = generateGettersAndSetters;
+	}
 
 	boolean generateDefaultConstructor() {
 		return this.generateDefaultConstructor;
 	}
+	private void setGenerateDefaultConstructor(boolean generateDefaultConstructor) {
+		this.generateDefaultConstructor = generateDefaultConstructor;
+	}
 
 	boolean serializable() {
 		return this.serializable;
 	}
+	private void setSerializable(boolean serializable) {
+		this.serializable = serializable;
+	}
 
 	boolean generateSerialVersionUID() {
 		return this.generateSerialVersionUID;
 	}
+	private void setGenerateSerialVersionUID(boolean generateSerialVersionUID) {
+		this.generateSerialVersionUID = generateSerialVersionUID;
+	}
 
 	boolean generateEmbeddedIdForCompoundPK() {
 		return this.generateEmbeddedIdForCompoundPK;
 	}
+	private void setGenerateEmbeddedIdForCompoundPK(boolean generateEmbeddedIdForCompoundPK) {
+		this.generateEmbeddedIdForCompoundPK = generateEmbeddedIdForCompoundPK;
+	}
 
 	boolean synchronizePersistenceXml() {
 		return this.synchronizePersistenceXml;
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/JpaFacetWizardPage.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/JpaFacetWizardPage.java
index 2df2900..706593c 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/JpaFacetWizardPage.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/JpaFacetWizardPage.java
@@ -45,6 +45,7 @@
 import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Link;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.dialogs.PreferencesUtil;
@@ -59,7 +60,17 @@
 public class JpaFacetWizardPage 
 	extends DataModelFacetInstallPage
 	implements IJpaFacetDataModelProperties
-{	
+{
+	private PlatformGroup platformGroup;
+	
+	private ConnectionGroup connectionGroup;
+	
+	private ClasspathConfigGroup classpathConfigGroup;
+	
+	private PersistentClassManagementGroup persistentClassManagementGroup;
+	
+	private OrmXmlGroup ormXmlGroup;
+	
 	
 	public JpaFacetWizardPage() {
 		super("jpt.jpa.facet.install.page"); //$NON-NLS-1$
@@ -75,11 +86,11 @@
 		GridLayout layout = new GridLayout();
 		composite.setLayout(layout);
 		
-		new PlatformGroup(composite);
-		new ConnectionGroup(composite);
-		new ClasspathConfigGroup(composite);
-		new PersistentClassManagementGroup(composite);
-		new OrmXmlGroup(composite);
+		platformGroup = new PlatformGroup(composite);
+		connectionGroup = new ConnectionGroup(composite);
+		classpathConfigGroup = new ClasspathConfigGroup(composite);
+		persistentClassManagementGroup = new PersistentClassManagementGroup(composite);
+		ormXmlGroup = new OrmXmlGroup(composite);
 		
 		setUpRuntimeListener();
 		
@@ -117,7 +128,18 @@
 			null :
 			facetPage.panel.getDataModel().getTargetedRuntimesDataModel();
 	}
-		
+	
+	
+	
+	private Label createLabel(Composite container, int span, String text) {
+		Label label = new Label(container, SWT.NONE);
+		label.setText(text);
+		GridData gd = new GridData();
+		gd.horizontalSpan = span;
+		label.setLayoutData(gd);
+		return label;
+	}
+	
 	private Button createButton(Composite container, int span, String text, int style) {
 		Button button = new Button(container, SWT.NONE | style);
 		button.setText(text);
@@ -291,6 +313,10 @@
 			}
 		}
 		
+		private String getConnectionName() {
+			return connectionCombo.getText();
+		}
+		
 		private void openNewConnectionWizard() {
 			String connectionName = DTPUiTools.createNewProfile();
 			if (connectionName != null) {
@@ -323,10 +349,7 @@
 			group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 			PlatformUI.getWorkbench().getHelpSystem().setHelp(group, IJpaHelpContextIds.NEW_JPA_PROJECT_CONTENT_PAGE_CLASSPATH);
 			
-			boolean useServerLib = model.getBooleanProperty(USE_SERVER_JPA_IMPLEMENTATION);
-			
 			useServerLibButton = createButton(group, 2, JptUiMessages.JpaFacetWizardPage_userServerLibLabel, SWT.RADIO);
-			useServerLibButton.setSelection(useServerLib);
 			useServerLibButton.addSelectionListener(
 					new SelectionListener() {
 						public void widgetDefaultSelected(SelectionEvent e) {
@@ -340,7 +363,6 @@
 				);
 			
 			specifyLibButton = createButton(group, 1, JptUiMessages.JpaFacetWizardPage_specifyLibLabel, SWT.RADIO);
-			specifyLibButton.setSelection(! useServerLib);
 			specifyLibButton.addSelectionListener(
 					new SelectionListener() {
 						public void widgetDefaultSelected(SelectionEvent e) {
@@ -435,10 +457,7 @@
 			group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 			PlatformUI.getWorkbench().getHelpSystem().setHelp(group, IJpaHelpContextIds.NEW_JPA_PROJECT_CONTENT_PAGE_CLASSPATH);
 			
-			boolean discoverClasses = model.getBooleanProperty(DISCOVER_ANNOTATED_CLASSES);
-			
 			discoverClassesButton = createButton(group, 1, JptUiMessages.JpaFacetWizardPage_discoverClassesButton, SWT.RADIO);
-			discoverClassesButton.setSelection(discoverClasses);
 			discoverClassesButton.addSelectionListener(
 				new SelectionListener() {
 						public void widgetDefaultSelected(SelectionEvent e) {
@@ -452,7 +471,6 @@
 				);
 			
 			listClassesButton = createButton(group, 1, JptUiMessages.JpaFacetWizardPage_listClassesButton, SWT.RADIO);
-			listClassesButton.setSelection(! discoverClasses);
 			listClassesButton.addSelectionListener(
 				new SelectionListener() {
 						public void widgetDefaultSelected(SelectionEvent e) {
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/xml/details/AccessTypeComboViewer.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/xml/details/AccessTypeComboViewer.java
index 2bdf0b0..55afba9 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/xml/details/AccessTypeComboViewer.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/xml/details/AccessTypeComboViewer.java
@@ -21,9 +21,11 @@
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jpt.core.internal.AccessType;
+import org.eclipse.jpt.core.internal.mappings.InheritanceType;
 import org.eclipse.jpt.ui.internal.details.BaseJpaController;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
 import org.eclipse.jpt.ui.internal.widgets.CComboViewer;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.custom.CCombo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
@@ -88,7 +90,7 @@
 	}
 
 	private void accessHolderChanged(Notification notification) {
-		if (notification.getFeatureID(this.accessHolder.featureClass()) == 
+		if (notification.getFeatureID(accessHolder.featureClass()) == 
 				this.accessHolder.featureId()) {
 			Display.getDefault().asyncExec(
 				new Runnable() {
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/xml/details/MetaDataCompleteComboViewer.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/xml/details/MetaDataCompleteComboViewer.java
index d2243b6..4d98719 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/xml/details/MetaDataCompleteComboViewer.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/xml/details/MetaDataCompleteComboViewer.java
@@ -23,6 +23,7 @@
 import org.eclipse.jpt.core.internal.content.orm.OrmPackage;
 import org.eclipse.jpt.core.internal.content.orm.XmlTypeMapping;
 import org.eclipse.jpt.core.internal.mappings.DefaultFalseBoolean;
+import org.eclipse.jpt.core.internal.mappings.InheritanceType;
 import org.eclipse.jpt.ui.internal.details.BaseJpaController;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
 import org.eclipse.jpt.ui.internal.widgets.CComboViewer;
@@ -139,7 +140,7 @@
 			return;
 		}
 		
-		DefaultFalseBoolean metadataComplete = this.mapping.getMetadataComplete();
+		DefaultFalseBoolean metadataComplete = mapping.getMetadataComplete();
 		
 		if (((IStructuredSelection) this.comboViewer.getSelection()).getFirstElement() != metadataComplete) {
 			this.comboViewer.setSelection(new StructuredSelection(metadataComplete));
diff --git a/jpa/plugins/org.eclipse.jpt.utility/.cvsignore b/jpa/plugins/org.eclipse.jpt.utility/.cvsignore
index a128605..42191b4 100644
--- a/jpa/plugins/org.eclipse.jpt.utility/.cvsignore
+++ b/jpa/plugins/org.eclipse.jpt.utility/.cvsignore
@@ -1,4 +1,3 @@
 bin
 @dot
-temp.folder
 build.xml
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.utility/META-INF/MANIFEST.MF b/jpa/plugins/org.eclipse.jpt.utility/META-INF/MANIFEST.MF
index 9ad22bf..20aef05 100644
--- a/jpa/plugins/org.eclipse.jpt.utility/META-INF/MANIFEST.MF
+++ b/jpa/plugins/org.eclipse.jpt.utility/META-INF/MANIFEST.MF
@@ -3,12 +3,8 @@
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-SymbolicName: org.eclipse.jpt.utility
-Bundle-Version: 1.1.0.qualifier
+Bundle-Version: 1.0.0.qualifier
 Bundle-Localization: plugin
 Export-Package: org.eclipse.jpt.utility.internal,
- org.eclipse.jpt.utility.internal.iterators,
- org.eclipse.jpt.utility.internal.model,
- org.eclipse.jpt.utility.internal.model.event,
- org.eclipse.jpt.utility.internal.model.listener,
- org.eclipse.jpt.utility.internal.node
+ org.eclipse.jpt.utility.internal.iterators
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/Bag.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/Bag.java
index 0dc6f53..2c68536 100644
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/Bag.java
+++ b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/Bag.java
@@ -22,7 +22,7 @@
  */
 
 public interface Bag<E> extends java.util.Collection<E> {
-
+	
 	/**
 	 * Compares the specified object with this bag for equality. Returns
 	 * <code>true</code> if the specified object is also a bag, the two bags
@@ -34,7 +34,7 @@
 	 * bag interface.
 	 */
 	boolean equals(Object o);
-
+	
 	/**
 	 * Returns the hash code value for this bag. The hash code of a bag is
 	 * defined to be the sum of the hash codes of the elements in the bag,
@@ -45,28 +45,5 @@
 	 * contract of the <code>Object.hashCode</code> method.
 	 */
 	int hashCode();
-
-	/**
-	 * Return the number of times the specified object occurs in the bag.
-	 */
-	int count(Object o);
-
-	/**
-	 * Add the specified object the specified number of times to the bag.
-	 */
-	boolean add(E o, int count);
-
-	/**
-	 * Remove the specified number of occurrences of the specified object
-	 * from the bag. Return whether the bag changed.
-	 */
-	boolean remove(Object o, int count);
-
-	/**
-	 * Return an iterator that returns each item in the bag
-	 * once and only once, irrespective of how many times
-	 * the item was added to the bag.
-	 */
-	java.util.Iterator<E> uniqueIterator();
-
+	
 }
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/CollectionTools.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/CollectionTools.java
index 8259ad8..f25fb72 100644
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/CollectionTools.java
+++ b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/CollectionTools.java
@@ -1338,148 +1338,6 @@
 	}
 
 	/**
-	 * Move an element from the specified source index to the specified target
-	 * index. Return the altered array.
-	 * java.util.Arrays#move(Object[] array, int targetIndex, int sourceIndex)
-	 */
-	public static <E> E[] move(E[] array, int targetIndex, int sourceIndex) {
-		if (targetIndex == sourceIndex) {
-			return array;
-		}
-		E temp = array[sourceIndex];
-		if (targetIndex < sourceIndex) {
-			System.arraycopy(array, targetIndex, array, targetIndex + 1, sourceIndex - targetIndex);
-		} else {
-			System.arraycopy(array, sourceIndex + 1, array, sourceIndex, targetIndex - sourceIndex);
-		}
-		array[targetIndex] = temp;
-		return array;
-	}
-
-	/**
-	 * Move elements from the specified source index to the specified target
-	 * index. Return the altered array.
-	 * java.util.Arrays#move(Object[] array, int targetIndex, int sourceIndex, int length)
-	 */
-	public static <E> E[] move(E[] array, int targetIndex, int sourceIndex, int length) {
-		if (targetIndex == sourceIndex) {
-			return array;
-		}
-		@SuppressWarnings("unchecked")
-		E[] temp = (E[]) Array.newInstance(array.getClass().getComponentType(), length);
-		System.arraycopy(array, sourceIndex, temp, 0, length);
-		if (targetIndex < sourceIndex) {
-			System.arraycopy(array, targetIndex, array, targetIndex + length, sourceIndex - targetIndex);
-		} else {
-			System.arraycopy(array, sourceIndex + length, array, sourceIndex, targetIndex - sourceIndex);
-		}
-		System.arraycopy(temp, 0, array, targetIndex, length);
-		return array;
-	}
-
-	/**
-	 * Move an element from the specified source index to the specified target
-	 * index. Return the altered array.
-	 * java.util.Arrays#move(int[] array, int targetIndex, int sourceIndex)
-	 */
-	public static int[] move(int[] array, int targetIndex, int sourceIndex) {
-		if (targetIndex == sourceIndex) {
-			return array;
-		}
-		int temp = array[sourceIndex];
-		if (targetIndex < sourceIndex) {
-			System.arraycopy(array, targetIndex, array, targetIndex + 1, sourceIndex - targetIndex);
-		} else {
-			System.arraycopy(array, sourceIndex + 1, array, sourceIndex, targetIndex - sourceIndex);
-		}
-		array[targetIndex] = temp;
-		return array;
-	}
-
-	/**
-	 * Move elements from the specified source index to the specified target
-	 * index. Return the altered array.
-	 * java.util.Arrays#move(int[] array, int targetIndex, int sourceIndex, int length)
-	 */
-	public static int[] move(int[] array, int targetIndex, int sourceIndex, int length) {
-		if (targetIndex == sourceIndex) {
-			return array;
-		}
-		int[] temp = new int[length];
-		System.arraycopy(array, sourceIndex, temp, 0, length);
-		if (targetIndex < sourceIndex) {
-			System.arraycopy(array, targetIndex, array, targetIndex + length, sourceIndex - targetIndex);
-		} else {
-			System.arraycopy(array, sourceIndex + length, array, sourceIndex, targetIndex - sourceIndex);
-		}
-		System.arraycopy(temp, 0, array, targetIndex, length);
-		return array;
-	}
-
-	/**
-	 * Move an element from the specified source index to the specified target
-	 * index. Return the altered array.
-	 * java.util.Arrays#move(char[] array, int targetIndex, int sourceIndex)
-	 */
-	public static char[] move(char[] array, int targetIndex, int sourceIndex) {
-		if (targetIndex == sourceIndex) {
-			return array;
-		}
-		char temp = array[sourceIndex];
-		if (targetIndex < sourceIndex) {
-			System.arraycopy(array, targetIndex, array, targetIndex + 1, sourceIndex - targetIndex);
-		} else {
-			System.arraycopy(array, sourceIndex + 1, array, sourceIndex, targetIndex - sourceIndex);
-		}
-		array[targetIndex] = temp;
-		return array;
-	}
-
-	/**
-	 * Move elements from the specified source index to the specified target
-	 * index. Return the altered array.
-	 * java.util.Arrays#move(char[] array, int targetIndex, int sourceIndex, int length)
-	 */
-	public static char[] move(char[] array, int targetIndex, int sourceIndex, int length) {
-		if (targetIndex == sourceIndex) {
-			return array;
-		}
-		char[] temp = new char[length];
-		System.arraycopy(array, sourceIndex, temp, 0, length);
-		if (targetIndex < sourceIndex) {
-			System.arraycopy(array, targetIndex, array, targetIndex + length, sourceIndex - targetIndex);
-		} else {
-			System.arraycopy(array, sourceIndex + length, array, sourceIndex, targetIndex - sourceIndex);
-		}
-		System.arraycopy(temp, 0, array, targetIndex, length);
-		return array;
-	}
-
-	/**
-	 * Move an element from the specified source index to the specified target
-	 * index. Return the altered list.
-	 * java.util.List#move(int targetIndex, int sourceIndex)
-	 */
-	public static <E> List<E> move(List<E> list, int targetIndex, int sourceIndex) {
-		if (targetIndex != sourceIndex) {
-			list.add(targetIndex, list.remove(sourceIndex));
-		}
-		return list;
-	}
-
-	/**
-	 * Move elements from the specified source index to the specified target
-	 * index. Return the altered list.
-	 * java.util.List#move(int targetIndex, int sourceIndex, int length)
-	 */
-	public static <E> List<E> move(List<E> list, int targetIndex, int sourceIndex, int length) {
-		if (targetIndex != sourceIndex) {
-			list.addAll(targetIndex, removeElementsAtIndex(list, sourceIndex, length));
-		}
-		return list;
-	}
-
-	/**
 	 * Replace all occurrences of the specified old value with
 	 * the specified new value.
 	 * java.util.Arrays#replaceAll(Object[] array, Object oldValue, Object newValue)
@@ -1752,7 +1610,12 @@
 	 * java.util.Arrays#removeElementAtIndex(Object[] array, int index)
 	 */
 	public static <E> E[] removeElementAtIndex(E[] array, int index) {
-		return removeElementsAtIndex(array, index, 1);
+		int len = array.length;
+		@SuppressWarnings("unchecked")
+		E[] result = (E[]) Array.newInstance(array.getClass().getComponentType(), len - 1);
+		System.arraycopy(array, 0, result, 0, index);
+		System.arraycopy(array, index + 1, result, index, len - index - 1);
+		return result;
 	}
 
 	/**
@@ -1761,7 +1624,11 @@
 	 * java.util.Arrays#removeElementAtIndex(char[] array, int index)
 	 */
 	public static char[] removeElementAtIndex(char[] array, int index) {
-		return removeElementsAtIndex(array, index, 1);
+		int len = array.length;
+		char[] result = new char[len - 1];
+		System.arraycopy(array, 0, result, 0, index);
+		System.arraycopy(array, index + 1, result, index, len - index - 1);
+		return result;
 	}
 
 	/**
@@ -1770,59 +1637,10 @@
 	 * java.util.Arrays#removeElementAtIndex(int[] array, int index)
 	 */
 	public static int[] removeElementAtIndex(int[] array, int index) {
-		return removeElementsAtIndex(array, index, 1);
-	}
-
-	/**
-	 * Remove the elements at the specified index.
-	 * Return the removed elements.
-	 * java.util.List#remove(int index, int length)
-	 */
-	public static <E> List<E> removeElementsAtIndex(List<E> list, int index, int length) {
-		ArrayList<E> result = new ArrayList<E>(list.subList(index, index + length));
-		for (int i = length; i-- > 0; ) {
-			list.remove(index);
-		}
-		return result;
-	}
-
-	/**
-	 * Return a new array that contains the elements in the
-	 * specified array with the specified elements removed.
-	 * java.util.Arrays#removeElementsAtIndex(Object[] array, int index, int length)
-	 */
-	public static <E> E[] removeElementsAtIndex(E[] array, int index, int length) {
 		int len = array.length;
-		@SuppressWarnings("unchecked")
-		E[] result = (E[]) Array.newInstance(array.getClass().getComponentType(), len - length);
+		int[] result = new int[len - 1];
 		System.arraycopy(array, 0, result, 0, index);
-		System.arraycopy(array, index + length, result, index, len - index - length);
-		return result;
-	}
-
-	/**
-	 * Return a new array that contains the elements in the
-	 * specified array with the specified elements removed.
-	 * java.util.Arrays#removeElementAtIndex(char[] array, int index, int length)
-	 */
-	public static char[] removeElementsAtIndex(char[] array, int index, int length) {
-		int len = array.length;
-		char[] result = new char[len - length];
-		System.arraycopy(array, 0, result, 0, index);
-		System.arraycopy(array, index + length, result, index, len - index - length);
-		return result;
-	}
-
-	/**
-	 * Return a new array that contains the elements in the
-	 * specified array with the specified elements removed.
-	 * java.util.Arrays#removeElementAtIndex(int[] array, int index, int length)
-	 */
-	public static int[] removeElementsAtIndex(int[] array, int index, int length) {
-		int len = array.length;
-		int[] result = new int[len - length];
-		System.arraycopy(array, 0, result, 0, index);
-		System.arraycopy(array, index + length, result, index, len - index - length);
+		System.arraycopy(array, index + 1, result, index, len - index - 1);
 		return result;
 	}
 
@@ -2790,7 +2608,7 @@
 	 * Return the array after it has been "sorted".
 	 * @see java.util.Arrays#sort(Object[], java.util.Comparator)
 	 */
-	public static <E> E[] sort(E[] array, Comparator<? super E> comparator) {
+    public static <E> E[] sort(E[] array, Comparator<? super E> comparator) {
 		Arrays.sort(array, comparator);
 		return array;
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/HashBag.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/HashBag.java
index ac4e578..04fd212 100644
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/HashBag.java
+++ b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/HashBag.java
@@ -12,7 +12,6 @@
 import java.io.Serializable;
 import java.util.AbstractCollection;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
@@ -61,7 +60,7 @@
 
 	/** The hash table. */
 	transient Entry<E>[] table;
-
+	
 	/** The total number of entries in the bag. */
 	transient int count = 0;
 
@@ -75,14 +74,14 @@
 	 * @serial
 	 */
 	private int threshold;
-
+	
 	/**
 	 * The load factor for the hash table.
 	 *
 	 * @serial
 	 */
 	private float loadFactor;
-
+	
 	/**
 	 * The number of times this bag has been structurally modified.
 	 * Structural modifications are those that change the number of entries in
@@ -100,7 +99,7 @@
 	public HashBag() {
 		this(11, 0.75f);
 	}
-
+	
 	/**
 	 * Constructs a new, empty bag with the specified initial capacity
 	 * and default load factor, which is 0.75.
@@ -112,7 +111,7 @@
 	public HashBag(int initialCapacity) {
 		this(initialCapacity, 0.75f);
 	}
-
+	
 	/**
 	 * Constructs a new, empty bag with
 	 * the specified initial capacity and the specified load factor.
@@ -122,6 +121,7 @@
 	 * @throws IllegalArgumentException if the initial capacity is less
 	 *     than zero, or if the load factor is nonpositive.
 	 */
+	@SuppressWarnings("unchecked")
 	public HashBag(int initialCapacity, float loadFactor) {
 		if (initialCapacity < 0) {
 			throw new IllegalArgumentException("Illegal Initial Capacity: " + initialCapacity);
@@ -133,10 +133,10 @@
 			initialCapacity = 1;
 		}
 		this.loadFactor = loadFactor;
-		this.table = this.buildTable(initialCapacity);
+		this.table = new Entry[initialCapacity];
 		this.threshold = (int) (initialCapacity * loadFactor);
 	}
-
+	
 	/**
 	 * Constructs a new bag containing the elements in the specified
 	 * collection. The capacity of the bag is
@@ -149,7 +149,7 @@
 		this(Math.max(2*c.size(), 11));
 		this.addAll(c);
 	}
-
+	
 	/**
 	 * This implementation simply returns the maintained count.
 	 */
@@ -157,7 +157,7 @@
 	public int size() {
 		return this.count;
 	}
-
+	
 	/**
 	 * This implementation simply compares the maintained count to zero.
 	 */
@@ -165,7 +165,7 @@
 	public boolean isEmpty() {
 		return this.count == 0;
 	}
-
+	
 	/**
 	 * This implementation searches for the object in the hash table by calculating
 	 * the object's hash code and examining the entries in the corresponding hash
@@ -191,7 +191,10 @@
 		}
 		return false;
 	}
-
+	
+	/**
+	 * Return the number of times the specified object occurs in the bag.
+	 */	
 	public int count(Object o) {
 		Entry<E>[] tab = this.table;
 		if (o == null) {
@@ -211,63 +214,50 @@
 		}
 		return 0;
 	}
-
+	
 	/**
 	 * Rehashes the contents of this bag into a new hash table
 	 * with a larger capacity. This method is called when the
 	 * number of different elements in this map exceeds its
 	 * capacity and load factor.
 	 */
+	@SuppressWarnings("unchecked")
 	private void rehash() {
 		Entry<E>[] oldMap = this.table;
 		int oldCapacity = oldMap.length;
-
+	
 		int newCapacity = oldCapacity * 2 + 1;
-		Entry<E>[] newTable = this.buildTable(newCapacity);
-
+		Entry<E>[] newMap = new Entry[newCapacity];
+	
 		this.modCount++;
 		this.threshold = (int) (newCapacity * this.loadFactor);
-		this.table = newTable;
-
+		this.table = newMap;
+	
 		for (int i = oldCapacity; i-- > 0; ) {
 			for (Entry<E> old = oldMap[i]; old != null; ) {
 				Entry<E> e = old;
 				old = old.next;
-
+	
 				int index = (e.hash & 0x7FFFFFFF) % newCapacity;
-				e.next = newTable[index];
-				newTable[index] = e;
+				e.next = newMap[index];
+				newMap[index] = e;
 			}
 		}
 	}
-
-	@SuppressWarnings("unchecked")
-	private Entry<E>[] buildTable(int capacity) {
-		return new Entry[capacity];
-	}
-
-	@SuppressWarnings("unchecked")
-	private <T> Entry<E> buildEntry(int hash, Object o, Entry<T> next) {
-		return new Entry(hash, o, next);
-	}
-
-	@SuppressWarnings("unchecked")
-	private <T> Entry<E> buildEntry(int hash, Object o, int cnt, Entry<T> next) {
-		return new Entry(hash, o, cnt, next);
-	}
-
+	
 	/**
 	 * This implementation searches for the object in the hash table by calculating
 	 * the object's hash code and examining the entries in the corresponding hash
 	 * table bucket.
 	 */
 	@Override
+	@SuppressWarnings("unchecked")
 	public boolean add(E o) {
 		this.modCount++;
 		Entry<E>[] tab = this.table;
 		int hash = 0;
 		int index = 0;
-
+	
 		// if the object is already in the bag, simply bump its count
 		if (o == null) {
 			for (Entry<E> e = tab[0]; e != null; e = e.next) {
@@ -288,72 +278,22 @@
 				}
 			}
 		}
-
+	
 		// rehash the table if the threshold is exceeded
 		if (this.uniqueCount >= this.threshold) {
 			this.rehash();
 			tab = this.table;
 			index = (hash & 0x7FFFFFFF) % tab.length;
 		}
-
+	
 		// create the new entry and put it in the table
-		Entry<E> e = this.buildEntry(hash, o, tab[index]);
+		Entry<E> e = new Entry(hash, o, tab[index]);
 		tab[index] = e;
 		this.count++;
 		this.uniqueCount++;
 		return true;
 	}
-
-	/**
-	 * This implementation searches for the object in the hash table by calculating
-	 * the object's hash code and examining the entries in the corresponding hash
-	 * table bucket.
-	 */
-	public boolean add(E o, int cnt) {
-		if (cnt <= 0) {
-			return false;
-		}
-		this.modCount++;
-		Entry<E>[] tab = this.table;
-		int hash = 0;
-		int index = 0;
-
-		// if the object is already in the bag, simply bump its count
-		if (o == null) {
-			for (Entry<E> e = tab[0]; e != null; e = e.next) {
-				if (e.object == null) {
-					e.count += cnt;
-					this.count += cnt;
-					return true;
-				}
-			}
-		} else {
-			hash = o.hashCode();
-			index = (hash & 0x7FFFFFFF) % tab.length;
-			for (Entry<E> e = tab[index]; e != null; e = e.next) {
-				if ((e.hash == hash) && o.equals(e.object)) {
-					e.count += cnt;
-					this.count += cnt;
-					return true;
-				}
-			}
-		}
-
-		// rehash the table if the threshold is exceeded
-		if (this.uniqueCount >= this.threshold) {
-			this.rehash();
-			tab = this.table;
-			index = (hash & 0x7FFFFFFF) % tab.length;
-		}
-
-		// create the new entry and put it in the table
-		Entry<E> e = this.buildEntry(hash, o, cnt, tab[index]);
-		tab[index] = e;
-		this.count += cnt;
-		this.uniqueCount++;
-		return true;
-	}
-
+	
 	/**
 	 * This implementation searches for the object in the hash table by calculating
 	 * the object's hash code and examining the entries in the corresponding hash
@@ -401,65 +341,10 @@
 				}
 			}
 		}
-
+	
 		return false;
 	}
-
-	/**
-	 * This implementation searches for the object in the hash table by calculating
-	 * the object's hash code and examining the entries in the corresponding hash
-	 * table bucket.
-	 */
-	public boolean remove(Object o, int cnt) {
-		if (cnt <= 0) {
-			return false;
-		}
-		Entry<E>[] tab = this.table;
-		if (o == null) {
-			for (Entry<E> e = tab[0], prev = null; e != null; prev = e, e = e.next) {
-				if (e.object == null) {
-					this.modCount++;
-					int cnt2 = (cnt < e.count) ? cnt : e.count;
-					e.count -= cnt2;
-					// if we are removing the last element(s), remove the entry from the table
-					if (e.count == 0) {
-						if (prev == null) {
-							tab[0] = e.next;
-						} else {
-							prev.next = e.next;
-						}
-						this.uniqueCount--;
-					}
-					this.count -= cnt2;
-					return true;
-				}
-			}
-		} else {
-			int hash = o.hashCode();
-			int index = (hash & 0x7FFFFFFF) % tab.length;
-			for (Entry<E> e = tab[index], prev = null; e != null; prev = e, e = e.next) {
-				if ((e.hash == hash) && o.equals(e.object)) {
-					this.modCount++;
-					int cnt2 = (cnt < e.count) ? cnt : e.count;
-					e.count -= cnt2;
-					// if we are removing the last element(s), remove the entry from the table
-					if (e.count == 0) {
-						if (prev == null) {
-							tab[index] = e.next;
-						} else {
-							prev.next = e.next;
-						}
-						this.uniqueCount--;
-					}
-					this.count -= cnt2;
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
+	
 	/**
 	 * This implementation simply clears out all of the hash table buckets.
 	 */
@@ -473,7 +358,7 @@
 		this.count = 0;
 		this.uniqueCount = 0;
 	}
-
+	
 	/**
 	 * Returns a shallow copy of this bag: the elements
 	 * themselves are not cloned.
@@ -481,14 +366,14 @@
 	 * @return a shallow copy of this bag.
 	 */
 	@Override
+	@SuppressWarnings("unchecked")
 	public HashBag<E> clone() {
 		try {
-			@SuppressWarnings("unchecked")
 			HashBag<E> clone = (HashBag<E>) super.clone();
-			clone.table = this.buildTable(this.table.length);
+			clone.table = new Entry[this.table.length];
 			for (int i = this.table.length; i-- > 0; ) {
 				clone.table[i] = (this.table[i] == null) 
-						? null : (Entry<E>) this.table[i].clone();
+						? null : (Entry) this.table[i].clone();
 			}
 			clone.modCount = 0;
 			return clone;
@@ -496,7 +381,7 @@
 			throw new InternalError();
 		}
 	}
-
+	
 	/**
 	 * Hash table collision list entry.
 	 */
@@ -505,34 +390,31 @@
 		E object;
 		int count;
 		Entry<E> next;
-
+	
 		Entry(int hash, E object, Entry<E> next) {
 			this(hash, object, 1, next);
 		}
-
-		Entry(int hash, E object, int count, Entry<E> next) {
+	
+		private Entry(int hash, E object, int count, Entry<E> next) {
 			this.hash = hash;
 			this.object = object;
 			this.count = count;
 			this.next = next;
 		}
-
-		/**
-		 * Cascade the clone to all the entries in the same bucket.
-		 */
+	
 		@Override
 		@SuppressWarnings("unchecked")
 		protected Entry<E> clone() {
 			return new Entry(this.hash, this.object, this.count,
 					(this.next == null ? null : this.next.clone()));
 		}
-
+	
 		@Override
 		public String toString() {
 			return this.object + "=>" + this.count;
 		}
 	}
-
+	
 	@Override
 	@SuppressWarnings("unchecked")
 	public Iterator<E> iterator() {
@@ -542,6 +424,11 @@
 		return new HashIterator();
 	}
 
+	/**
+	 * Return an iterator that returns each item in the bag
+	 * once and only once, irrespective of how many times
+	 * the item was added to the bag.
+	 */
 	@SuppressWarnings("unchecked")
 	public Iterator<E> uniqueIterator() {
 		if (this.count == 0) {
@@ -549,13 +436,13 @@
 		}
 		return new UniqueIterator();
 	}
-
+	
 	/**
 	 * Empty iterator that does just about nothing.
 	 */
 	@SuppressWarnings("unchecked")
 	private static final Iterator EMPTY_ITERATOR = new EmptyIterator();
-
+	
 	@SuppressWarnings("unchecked")
 	private static class EmptyIterator implements Iterator {
 
@@ -566,16 +453,16 @@
 		public boolean hasNext() {
 			return false;
 		}
-
+	
 		public Object next() {
 			throw new NoSuchElementException();
 		}
-
+	
 		public void remove() {
 			throw new IllegalStateException();
 		}
 	}
-
+	
 	private class HashIterator implements Iterator<E> {
 		Entry<E>[] localTable = HashBag.this.table;
 		int index = this.localTable.length;	// start at the end of the table
@@ -585,7 +472,7 @@
 
 		/**
 		 * The modCount value that the iterator believes that the backing
-		 * bag should have. If this expectation is violated, the iterator
+		 * Bag should have. If this expectation is violated, the iterator
 		 * has detected a concurrent modification.
 		 */
 		private int expectedModCount = HashBag.this.modCount;
@@ -667,8 +554,8 @@
 		}
 
 	}
-
-
+	
+	
 	private class UniqueIterator implements Iterator<E> {
 		Entry<E>[] localTable = HashBag.this.table;
 		int index = this.localTable.length;	// start at the end of the table
@@ -677,7 +564,7 @@
 
 		/**
 		 * The modCount value that the iterator believes that the backing
-		 * bag should have. If this expectation is violated, the iterator
+		 * Bag should have. If this expectation is violated, the iterator
 		 * has detected a concurrent modification.
 		 */
 		private int expectedModCount = HashBag.this.modCount;
@@ -749,9 +636,10 @@
 		}
 
 	}
-
-
+	
+	
 	@Override
+	@SuppressWarnings("unchecked")
 	public boolean equals(Object o) {
 		if (o == this) {
 			return true;
@@ -759,7 +647,6 @@
 		if ( ! (o instanceof Bag)) {
 			return false;
 		}
-		@SuppressWarnings("unchecked")
 		Bag<E> b = (Bag<E>) o;
 		if (b.size() != this.size()) {
 			return false;
@@ -772,7 +659,7 @@
 		}
 		return clone.isEmpty();
 	}
-
+	
 	@Override
 	public int hashCode() {
 		int h = 0;
@@ -784,7 +671,7 @@
 		}
 		return h;
 	}
-
+	
 	/**
 	 * Save the state of this bag to a stream (i.e. serialize it).
 	 *
@@ -797,10 +684,10 @@
 				throws java.io.IOException {
 		// write out the threshold, load factor, and any hidden stuff
 		s.defaultWriteObject();
-
+	
 		// write out number of buckets
 		s.writeInt(this.table.length);
-
+	
 		// write out number of unique elements
 		s.writeInt(this.uniqueCount);
 
@@ -814,29 +701,31 @@
 			}
 		}
 	}
-
+	
 	private static final long serialVersionUID = 1L;
-
+	
 	/**
 	 * Reconstitute the bag from a stream (i.e. deserialize it).
 	 */
+	@SuppressWarnings("unchecked")
 	private synchronized void readObject(java.io.ObjectInputStream s)
 				throws java.io.IOException, ClassNotFoundException {
 		// read in the threshold, loadfactor, and any hidden stuff
 		s.defaultReadObject();
-
+	
 		// read in number of buckets and allocate the bucket array
-		this.table = this.buildTable(s.readInt());
-
+		this.table = new Entry[s.readInt()];
+	
 		// read in number of unique elements
 		int unique = s.readInt();
-
+	
 		// read the elements and counts, and put the elements in the bag
 		for (int i = 0; i < unique; i++) {
-			@SuppressWarnings("unchecked")
 			E element = (E) s.readObject();
 			int elementCount = s.readInt();
-			this.add(element, elementCount);
+			for (int j = 0; j < elementCount; j++) {
+				this.add(element);
+			}
 		}
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/IdentityHashBag.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/IdentityHashBag.java
deleted file mode 100644
index 25023fd..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/IdentityHashBag.java
+++ /dev/null
@@ -1,814 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal;
-
-import java.io.Serializable;
-import java.util.AbstractCollection;
-import java.util.Collection;
-import java.util.ConcurrentModificationException;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * This class implements the <code>Bag</code> interface with a
- * hash table, using object-identity in place of object-equality when
- * comparing elements. In other words, in an <code>IdentityHashBag</code>,
- * two objects <code>k1</code> and <code>k2</code> are considered
- * equal if and only if <code>(k1 == k2)</code>. (In normal <code>Bag</code>
- * implementations (like <code>HashBag</code>) two objects <code>k1</code>
- * and <code>k2</code> are considered equal if and only if
- * <code>(k1 == null ? k2 == null : k1.equals(k2))</code>.)
- * <p>
- * <b>
- * This class is <i>not</i> a general-purpose <code>Bag</code>
- * implementation! While this class implements the <code>Bag</code> interface, it
- * intentionally violates <code>Bag's</code> general contract, which mandates the
- * use of the <code>equals</code> method when comparing objects. This class is
- * designed for use only in the rare cases wherein object-identity
- * semantics are required.
- * </b>
- * <p>
- * This class makes no guarantees as to the iteration order of
- * the bag's elements; in particular, it does not guarantee that the order
- * will remain constant over time. This class permits the <code>null</code>
- * element.
- * <p>
- * This class offers constant time performance for the basic operations
- * (<code>add</code>, <code>remove</code>, <code>contains</code> and
- * <code>size</code>), assuming the system identity hash function
- * ({@link System#identityHashCode(Object)}) disperses elements properly
- * among the buckets. Iterating over this bag requires time
- * proportional to the sum of the bag's size (the number of elements) plus the
- * "capacity" of the backing hash table (the number of buckets). Thus, it is
- * important not to set the initial capacity too high (or the load factor too
- * low) if iteration performance is important.
- * <p>
- * <b>Note that this implementation is not synchronized.</b> If multiple
- * threads access a bag concurrently, and at least one of the threads modifies
- * the bag, it <i>must</i> be synchronized externally. This is typically
- * accomplished by synchronizing on some object that naturally encapsulates
- * the bag. If no such object exists, the bag should be "wrapped" using the
- * <code>Collections.synchronizedCollection</code> method. This is
- * best done at creation time, to prevent accidental unsynchronized access
- * to the bag:
- * <pre>
- * Collection c = Collections.synchronizedCollection(new IdentityHashBag(...));
- * </pre>
- * <p>
- * The iterators returned by this class's <code>iterator</code> method are
- * <i>fail-fast</i>: if the bag is modified at any time after the iterator is
- * created, in any way except through the iterator's own <code>remove</code>
- * method, the iterator throws a <code>ConcurrentModificationException</code>.
- * Thus, in the face of concurrent modification, the iterator fails quickly
- * and cleanly, rather than risking arbitrary, non-deterministic behavior at
- * an undetermined time in the future.
- * 
- * @see	Collections#synchronizedCollection(Collection)
- */
-
-public class IdentityHashBag<E> extends AbstractCollection<E>
-			implements Bag<E>, Cloneable, Serializable {
-
-	/** The hash table. */
-	transient Entry<E>[] table;
-
-	/** The total number of entries in the bag. */
-	transient int count = 0;
-
-	/** The number of unique entries in the bag. */
-	transient int uniqueCount = 0;
-
-	/**
-	 * The hash table is rehashed when its size exceeds this threshold. (The
-	 * value of this field is (int)(capacity * loadFactor).)
-	 *
-	 * @serial
-	 */
-	private int threshold;
-
-	/**
-	 * The load factor for the hash table.
-	 *
-	 * @serial
-	 */
-	private float loadFactor;
-
-	/**
-	 * The number of times this bag has been structurally modified.
-	 * Structural modifications are those that change the number of entries in
-	 * the bag or otherwise modify its internal structure (e.g. rehash).
-	 * This field is used to make iterators on this bag fail-fast.
-	 *
-	 * @see java.util.ConcurrentModificationException
-	 */
-	transient int modCount = 0;
-
-	/**
-	 * Constructs a new, empty bag with the
-	 * default capacity, which is 11, and load factor, which is 0.75.
-	 */
-	public IdentityHashBag() {
-		this(11, 0.75f);
-	}
-
-	/**
-	 * Constructs a new, empty bag with the specified initial capacity
-	 * and default load factor, which is 0.75.
-	 *
-	 * @param initialCapacity the initial capacity of the backing map.
-	 * @throws IllegalArgumentException if the initial capacity is less
-	 *     than zero.
-	 */
-	public IdentityHashBag(int initialCapacity) {
-		this(initialCapacity, 0.75f);
-	}
-
-	/**
-	 * Constructs a new, empty bag with
-	 * the specified initial capacity and the specified load factor.
-	 *
-	 * @param initialCapacity the initial capacity of the backing map.
-	 * @param loadFactor the load factor of the backing map.
-	 * @throws IllegalArgumentException if the initial capacity is less
-	 *     than zero, or if the load factor is nonpositive.
-	 */
-	public IdentityHashBag(int initialCapacity, float loadFactor) {
-		if (initialCapacity < 0) {
-			throw new IllegalArgumentException("Illegal Initial Capacity: " + initialCapacity);
-		}
-		if (loadFactor <= 0 || Float.isNaN(loadFactor)) {
-			throw new IllegalArgumentException("Illegal Load factor: " + loadFactor);
-		}
-		if (initialCapacity == 0) {
-			initialCapacity = 1;
-		}
-		this.loadFactor = loadFactor;
-		this.table = this.buildTable(initialCapacity);
-		this.threshold = (int) (initialCapacity * loadFactor);
-	}
-
-	/**
-	 * Constructs a new bag containing the elements in the specified
-	 * collection. The capacity of the bag is
-	 * twice the size of the specified collection or 11 (whichever is
-	 * greater), and the default load factor, which is 0.75, is used.
-	 *
-	 * @param c the collection whose elements are to be placed into this bag.
-	 */
-	public IdentityHashBag(Collection<? extends E> c) {
-		this(Math.max(2*c.size(), 11));
-		this.addAll(c);
-	}
-
-	/**
-	 * This implementation simply returns the maintained count.
-	 */
-	@Override
-	public int size() {
-		return this.count;
-	}
-
-	/**
-	 * This implementation simply compares the maintained count to zero.
-	 */
-	@Override
-	public boolean isEmpty() {
-		return this.count == 0;
-	}
-
-	/**
-	 * This implementation searches for the object in the hash table by
-	 * calculating the object's identity hash code and examining the
-	 * entries in the corresponding hash table bucket.
-	 */
-	@Override
-	public boolean contains(Object o) {
-		Entry<E>[] tab = this.table;
-		int hash = System.identityHashCode(o);
-		int index = (hash & 0x7FFFFFFF) % tab.length;
-		for (Entry<E> e = tab[index]; e != null; e = e.next) {
-			if ((e.hash == hash) && (e.object == o)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public int count(Object o) {
-		Entry<E>[] tab = this.table;
-		int hash = System.identityHashCode(o);
-		int index = (hash & 0x7FFFFFFF) % tab.length;
-		for (Entry<E> e = tab[index]; e != null; e = e.next) {
-			if ((e.hash == hash) && (e.object == o)) {
-				return e.count;
-			}
-		}
-		return 0;
-	}
-
-	/**
-	 * Rehashes the contents of this bag into a new hash table
-	 * with a larger capacity. This method is called when the
-	 * number of different elements in this map exceeds its
-	 * capacity and load factor.
-	 */
-	private void rehash() {
-		Entry<E>[] oldMap = this.table;
-		int oldCapacity = oldMap.length;
-
-		int newCapacity = oldCapacity * 2 + 1;
-		Entry<E>[] newTable = this.buildTable(newCapacity);
-
-		this.modCount++;
-		this.threshold = (int) (newCapacity * this.loadFactor);
-		this.table = newTable;
-
-		for (int i = oldCapacity; i-- > 0; ) {
-			for (Entry<E> old = oldMap[i]; old != null; ) {
-				Entry<E> e = old;
-				old = old.next;
-
-				int index = (e.hash & 0x7FFFFFFF) % newCapacity;
-				e.next = newTable[index];
-				newTable[index] = e;
-			}
-		}
-	}
-
-	@SuppressWarnings("unchecked")
-	private Entry<E>[] buildTable(int capacity) {
-		return new Entry[capacity];
-	}
-
-	@SuppressWarnings("unchecked")
-	private <T> Entry<E> buildEntry(int hash, Object o, Entry<T> next) {
-		return new Entry(hash, o, next);
-	}
-
-	@SuppressWarnings("unchecked")
-	private <T> Entry<E> buildEntry(int hash, Object o, int cnt, Entry<T> next) {
-		return new Entry(hash, o, cnt, next);
-	}
-
-	/**
-	 * This implementation searches for the object in the hash table by
-	 * calculating the object's identity hash code and examining the
-	 * entries in the corresponding hash table bucket.
-	 */
-	@Override
-	public boolean add(E o) {
-		this.modCount++;
-		Entry<E>[] tab = this.table;
-		int hash = 0;
-		int index = 0;
-
-		// if the object is already in the bag, simply bump its count
-		hash = System.identityHashCode(o);
-		index = (hash & 0x7FFFFFFF) % tab.length;
-		for (Entry<E> e = tab[index]; e != null; e = e.next) {
-			if ((e.hash == hash) && (e.object == o)) {
-				e.count++;
-				this.count++;
-				return true;
-			}
-		}
-
-		// rehash the table if the threshold is exceeded
-		if (this.uniqueCount >= this.threshold) {
-			this.rehash();
-			tab = this.table;
-			index = (hash & 0x7FFFFFFF) % tab.length;
-		}
-
-		// create the new entry and put it in the table
-		Entry<E> e = this.buildEntry(hash, o, tab[index]);
-		tab[index] = e;
-		this.count++;
-		this.uniqueCount++;
-		return true;
-	}
-
-	/**
-	 * This implementation searches for the object in the hash table by
-	 * calculating the object's identity hash code and examining the
-	 * entries in the corresponding hash table bucket.
-	 */
-	public boolean add(E o, int cnt) {
-		if (cnt <= 0) {
-			return false;
-		}
-		this.modCount++;
-		Entry<E>[] tab = this.table;
-		int hash = 0;
-		int index = 0;
-
-		// if the object is already in the bag, simply bump its count
-		hash = System.identityHashCode(o);
-		index = (hash & 0x7FFFFFFF) % tab.length;
-		for (Entry<E> e = tab[index]; e != null; e = e.next) {
-			if ((e.hash == hash) && (e.object == o)) {
-				e.count += cnt;
-				this.count += cnt;
-				return true;
-			}
-		}
-
-		// rehash the table if the threshold is exceeded
-		if (this.uniqueCount >= this.threshold) {
-			this.rehash();
-			tab = this.table;
-			index = (hash & 0x7FFFFFFF) % tab.length;
-		}
-
-		// create the new entry and put it in the table
-		Entry<E> e = this.buildEntry(hash, o, cnt, tab[index]);
-		tab[index] = e;
-		this.count += cnt;
-		this.uniqueCount++;
-		return true;
-	}
-
-	/**
-	 * This implementation searches for the object in the hash table by
-	 * calculating the object's identity hash code and examining the
-	 * entries in the corresponding hash table bucket.
-	 */
-	@Override
-	public boolean remove(Object o) {
-		Entry<E>[] tab = this.table;
-		int hash = System.identityHashCode(o);
-		int index = (hash & 0x7FFFFFFF) % tab.length;
-		for (Entry<E> e = tab[index], prev = null; e != null; prev = e, e = e.next) {
-			if ((e.hash == hash) && (e.object == o)) {
-				this.modCount++;
-				e.count--;
-				// if we are removing the last one, remove the entry from the table
-				if (e.count == 0) {
-					if (prev == null) {
-						tab[index] = e.next;
-					} else {
-						prev.next = e.next;
-					}
-					this.uniqueCount--;
-				}
-				this.count--;
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * This implementation searches for the object in the hash table by
-	 * calculating the object's identity hash code and examining the
-	 * entries in the corresponding hash table bucket.
-	 */
-	public boolean remove(Object o, int cnt) {
-		if (cnt <= 0) {
-			return false;
-		}
-		Entry<E>[] tab = this.table;
-		int hash = System.identityHashCode(o);
-		int index = (hash & 0x7FFFFFFF) % tab.length;
-		for (Entry<E> e = tab[index], prev = null; e != null; prev = e, e = e.next) {
-			if ((e.hash == hash) && (e.object == o)) {
-				this.modCount++;
-				int cnt2 = (cnt < e.count) ? cnt : e.count;
-				e.count -= cnt2;
-				// if we are removing the last element(s), remove the entry from the table
-				if (e.count == 0) {
-					if (prev == null) {
-						tab[index] = e.next;
-					} else {
-						prev.next = e.next;
-					}
-					this.uniqueCount--;
-				}
-				this.count -= cnt2;
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * This implementation uses object-identity to determine whether
-	 * specified collection contains a particular element.
-	 */
-	@Override
-	public boolean removeAll(Collection<?> c) {
-		return super.removeAll(this.buildIdentityHashBag(c));
-	}
-
-	/**
-	 * This implementation uses object-identity to determine whether
-	 * specified collection contains a particular element.
-	 */
-	@Override
-	public boolean retainAll(Collection<?> c) {
-		return super.retainAll(this.buildIdentityHashBag(c));
-	}
-
-	@SuppressWarnings("unchecked")
-	private Collection<?> buildIdentityHashBag(Collection<?> c) {
-		return new IdentityHashBag(c);
-	}
-
-	/**
-	 * This implementation simply clears out all of the hash table buckets.
-	 */
-	@Override
-	public void clear() {
-		Entry<E>[] tab = this.table;
-		this.modCount++;
-		for (int i = tab.length; --i >= 0; ) {
-			tab[i] = null;
-		}
-		this.count = 0;
-		this.uniqueCount = 0;
-	}
-
-	/**
-	 * Returns a shallow copy of this bag: the elements
-	 * themselves are not cloned.
-	 *
-	 * @return a shallow copy of this bag.
-	 */
-	@Override
-	public IdentityHashBag<E> clone() {
-		try {
-			@SuppressWarnings("unchecked")
-			IdentityHashBag<E> clone = (IdentityHashBag<E>) super.clone();
-			clone.table = this.buildTable(this.table.length);
-			for (int i = this.table.length; i-- > 0; ) {
-				clone.table[i] = (this.table[i] == null) 
-						? null : (Entry<E>) this.table[i].clone();
-			}
-			clone.modCount = 0;
-			return clone;
-		} catch (CloneNotSupportedException e) {
-			throw new InternalError();
-		}
-	}
-
-	/**
-	 * Hash table collision list entry.
-	 */
-	private static class Entry<E> {
-		int hash;
-		E object;
-		int count;
-		Entry<E> next;
-
-		Entry(int hash, E object, Entry<E> next) {
-			this(hash, object, 1, next);
-		}
-
-		Entry(int hash, E object, int count, Entry<E> next) {
-			this.hash = hash;
-			this.object = object;
-			this.count = count;
-			this.next = next;
-		}
-
-		/**
-		 * Cascade the clone to all the entries in the same bucket.
-		 */
-		@Override
-		@SuppressWarnings("unchecked")
-		protected Entry<E> clone() {
-			return new Entry(this.hash, this.object, this.count,
-					(this.next == null ? null : this.next.clone()));
-		}
-
-		@Override
-		public String toString() {
-			return this.object + "=>" + this.count;
-		}
-	}
-
-	@Override
-	@SuppressWarnings("unchecked")
-	public Iterator<E> iterator() {
-		if (this.count == 0) {
-			return EMPTY_ITERATOR;
-		}
-		return new HashIterator();
-	}
-
-	/**
-	 * Return an iterator that returns each item in the bag
-	 * once and only once, irrespective of how many times
-	 * the item was added to the bag.
-	 */
-	@SuppressWarnings("unchecked")
-	public Iterator<E> uniqueIterator() {
-		if (this.count == 0) {
-			return EMPTY_ITERATOR;
-		}
-		return new UniqueIterator();
-	}
-
-	/**
-	 * Empty iterator that does just about nothing.
-	 */
-	@SuppressWarnings("unchecked")
-	private static final Iterator EMPTY_ITERATOR = new EmptyIterator();
-
-	@SuppressWarnings("unchecked")
-	private static class EmptyIterator implements Iterator {
-
-		EmptyIterator() {
-			super();
-		}
-
-		public boolean hasNext() {
-			return false;
-		}
-
-		public Object next() {
-			throw new NoSuchElementException();
-		}
-
-		public void remove() {
-			throw new IllegalStateException();
-		}
-	}
-
-	private class HashIterator implements Iterator<E> {
-		Entry<E>[] localTable = IdentityHashBag.this.table;
-		int index = this.localTable.length;	// start at the end of the table
-		Entry<E> nextEntry = null;
-		int nextEntryCount = 0;
-		Entry<E> lastReturnedEntry = null;
-
-		/**
-		 * The modCount value that the iterator believes that the backing
-		 * bag should have. If this expectation is violated, the iterator
-		 * has detected a concurrent modification.
-		 */
-		private int expectedModCount = IdentityHashBag.this.modCount;
-
-		HashIterator() {
-			super();
-		}
-
-		public boolean hasNext() {
-			Entry<E> e = this.nextEntry;
-			int i = this.index;
-			Entry<E>[] tab = this.localTable;
-			// Use locals for faster loop iteration
-			while ((e == null) && (i > 0)) {
-				e = tab[--i];		// move backwards through the table
-			}
-			this.nextEntry = e;
-			this.index = i;
-			return e != null;
-		}
-
-		public E next() {
-			if (IdentityHashBag.this.modCount != this.expectedModCount) {
-				throw new ConcurrentModificationException();
-			}
-			Entry<E> et = this.nextEntry;
-			int i = this.index;
-			Entry<E>[] tab = this.localTable;
-			// Use locals for faster loop iteration
-			while ((et == null) && (i > 0)) {
-				et = tab[--i];		// move backwards through the table
-			}
-			this.nextEntry = et;
-			this.index = i;
-			if (et == null) {
-				throw new NoSuchElementException();
-			}
-			Entry<E> e = this.lastReturnedEntry = this.nextEntry;
-			this.nextEntryCount++;
-			if (this.nextEntryCount == e.count) {
-				this.nextEntry = e.next;
-				this.nextEntryCount = 0;
-			}
-			return e.object;
-		}
-
-		public void remove() {
-			if (this.lastReturnedEntry == null) {
-				throw new IllegalStateException();
-			}
-			if (IdentityHashBag.this.modCount != this.expectedModCount) {
-				throw new ConcurrentModificationException();
-			}
-			Entry<E>[] tab = this.localTable;
-			int slot = (this.lastReturnedEntry.hash & 0x7FFFFFFF) % tab.length;
-			for (Entry<E> e = tab[slot], prev = null; e != null; prev = e, e = e.next) {
-				if (e == this.lastReturnedEntry) {
-					IdentityHashBag.this.modCount++;
-					this.expectedModCount++;
-					e.count--;
-					if (e.count == 0) {
-						// if we are removing the last one, remove the entry from the table
-						if (prev == null) {
-							tab[slot] = e.next;
-						} else {
-							prev.next = e.next;
-						}
-						IdentityHashBag.this.uniqueCount--;
-					} else {
-						// slide back the count to account for the just-removed element
-						this.nextEntryCount--;
-					}
-					IdentityHashBag.this.count--;
-					this.lastReturnedEntry = null;	// it cannot be removed again
-					return;
-				}
-			}
-			throw new ConcurrentModificationException();
-		}
-	}
-
-	private class UniqueIterator implements Iterator<E> {
-		Entry<E>[] localTable = IdentityHashBag.this.table;
-		int index = this.localTable.length;	// start at the end of the table
-		Entry<E> nextEntry = null;
-		Entry<E> lastReturnedEntry = null;
-
-		/**
-		 * The modCount value that the iterator believes that the backing
-		 * bag should have. If this expectation is violated, the iterator
-		 * has detected a concurrent modification.
-		 */
-		private int expectedModCount = IdentityHashBag.this.modCount;
-
-		UniqueIterator() {
-			super();
-		}
-
-		public boolean hasNext() {
-			Entry<E> e = this.nextEntry;
-			int i = this.index;
-			Entry<E>[] tab = this.localTable;
-			// Use locals for faster loop iteration
-			while ((e == null) && (i > 0)) {
-				e = tab[--i];		// move backwards through the table
-			}
-			this.nextEntry = e;
-			this.index = i;
-			return e != null;
-		}
-
-		public E next() {
-			if (IdentityHashBag.this.modCount != this.expectedModCount) {
-				throw new ConcurrentModificationException();
-			}
-			Entry<E> et = this.nextEntry;
-			int i = this.index;
-			Entry<E>[] tab = this.localTable;
-			// Use locals for faster loop iteration
-			while ((et == null) && (i > 0)) {
-				et = tab[--i];		// move backwards through the table
-			}
-			this.nextEntry = et;
-			this.index = i;
-			if (et == null) {
-				throw new NoSuchElementException();
-			}
-			Entry<E> e = this.lastReturnedEntry = this.nextEntry;
-			this.nextEntry = e.next;
-			return e.object;
-		}
-
-		public void remove() {
-			if (this.lastReturnedEntry == null) {
-				throw new IllegalStateException();
-			}
-			if (IdentityHashBag.this.modCount != this.expectedModCount) {
-				throw new ConcurrentModificationException();
-			}
-			Entry<E>[] tab = this.localTable;
-			int slot = (this.lastReturnedEntry.hash & 0x7FFFFFFF) % tab.length;
-			for (Entry<E> e = tab[slot], prev = null; e != null; prev = e, e = e.next) {
-				if (e == this.lastReturnedEntry) {
-					IdentityHashBag.this.modCount++;
-					this.expectedModCount++;
-					// remove the entry from the table
-					if (prev == null) {
-						tab[slot] = e.next;
-					} else {
-						prev.next = e.next;
-					}
-					IdentityHashBag.this.uniqueCount--;
-					IdentityHashBag.this.count -= this.lastReturnedEntry.count;
-					this.lastReturnedEntry = null;	// it cannot be removed again
-					return;
-				}
-			}
-			throw new ConcurrentModificationException();
-		}
-
-	}
-
-
-	@Override
-	public boolean equals(Object o) {
-		if (o == this) {
-			return true;
-		} else if (o instanceof IdentityHashBag) {
-			@SuppressWarnings("unchecked")
-			IdentityHashBag<E> b = (IdentityHashBag<E>) o;
-			if (b.size() != this.size()) {
-				return false;
-			}
-			IdentityHashBag<E> clone = this.clone();
-			for (E e : b) {
-				if ( ! clone.remove(e)) {
-					return false;
-				}
-			}
-			return clone.isEmpty();
-		} else if (o instanceof Bag) {
-			// hmmm...
-			return this.buildBag().equals(o);
-		} else {
-			return false;
-		}
-	}
-
-	@SuppressWarnings("unchecked")
-	private Bag<E> buildBag() {
-		return new HashBag(this);
-	}
-
-	@Override
-	public int hashCode() {
-		int h = 0;
-		for (E e : this) {
-			h += System.identityHashCode(e);
-		}
-		return h;
-	}
-
-	/**
-	 * Save the state of this bag to a stream (i.e. serialize it).
-	 *
-	 * @serialData Emit the capacity of the bag (int),
-	 *     followed by the number of unique elements in the bag (int),
-	 *     followed by all of the bag's elements (each an Object) and
-	 *     their counts (each an int), in no particular order.
-	 */
-	private synchronized void writeObject(java.io.ObjectOutputStream s)
-				throws java.io.IOException {
-		// write out the threshold, load factor, and any hidden stuff
-		s.defaultWriteObject();
-
-		// write out number of buckets
-		s.writeInt(this.table.length);
-
-		// write out number of unique elements
-		s.writeInt(this.uniqueCount);
-
-		Entry<E>[] tab = this.table;
-		// write out elements and counts (alternating)
-		for (Entry<E> entry : tab) {
-			while (entry != null) {
-				s.writeObject(entry.object);
-				s.writeInt(entry.count);
-				entry = entry.next;
-			}
-		}
-	}
-
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Reconstitute the bag from a stream (i.e. deserialize it).
-	 */
-	private synchronized void readObject(java.io.ObjectInputStream s)
-				throws java.io.IOException, ClassNotFoundException {
-		// read in the threshold, loadfactor, and any hidden stuff
-		s.defaultReadObject();
-
-		// read in number of buckets and allocate the bucket array
-		this.table = this.buildTable(s.readInt());
-
-		// read in number of unique elements
-		int unique = s.readInt();
-
-		// read the elements and counts, and put the elements in the bag
-		for (int i = 0; i < unique; i++) {
-			@SuppressWarnings("unchecked")
-			E element = (E) s.readObject();
-			int elementCount = s.readInt();
-			for (int j = 0; j < elementCount; j++) {
-				this.add(element);
-			}
-		}
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/SimpleStack.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/SimpleStack.java
deleted file mode 100644
index e45bea5..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/SimpleStack.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal;
-
-import java.io.Serializable;
-import java.util.EmptyStackException;
-import java.util.LinkedList;
-import java.util.NoSuchElementException;
-
-/**
- * Straightforward implementation of the Stack interface.
- */
-public class SimpleStack<E>
-	implements Stack<E>, Cloneable, Serializable
-{
-	private LinkedList<E> elements;
-
-	private static final long serialVersionUID = 1L;
-
-
-	// ********** constructors **********
-
-	/**
-	 * Construct an empty stack.
-	 */
-	public SimpleStack() {
-		super();
-		this.elements = new LinkedList<E>();
-	}
-
-
-	// ********** Stack implementation **********
-
-	public void push(E o) {
-		this.elements.addLast(o);
-	}
-
-	public E pop() {
-		try {
-			return this.elements.removeLast();
-		} catch (NoSuchElementException ex) {
-			throw new EmptyStackException();
-		}
-	}
-
-	public E peek() {
-		try {
-			return this.elements.getLast();
-		} catch (NoSuchElementException ex) {
-			throw new EmptyStackException();
-		}
-	}
-
-	public boolean isEmpty() {
-		return this.elements.isEmpty();
-	}
-
-
-	// ********** Cloneable implementation **********
-
-	@Override
-	public SimpleStack<E> clone() {
-		try {
-			@SuppressWarnings("unchecked")
-			SimpleStack<E> clone = (SimpleStack<E>) super.clone();
-			@SuppressWarnings("unchecked")
-			LinkedList<E> ll = (LinkedList<E>) this.elements.clone();
-			clone.elements = ll;
-			return clone;
-		} catch (CloneNotSupportedException ex) {
-			throw new InternalError();
-		}
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/Stack.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/Stack.java
deleted file mode 100644
index 397d247..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/Stack.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal;
-
-/**
- * Interface defining the classic stack behavior,
- * without the backdoors allowed by java.util.Stack.
- * E is the type of elements contained by the Stack.
- */
-public interface Stack<E> {
-
-	/**
-	 * "Push" the specified item on to the top of the stack.
-	 */
-	void push(E o);
-
-	/**
-	 * "Pop" an item from the top of the stack.
-	 */
-	E pop();
-
-	/**
-	 * Return the item on the top of the stack
-	 * without removing it from the stack.
-	 */
-	E peek();
-
-	/**
-	 * Return whether the stack is empty.
-	 */
-	boolean isEmpty();
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/SynchronizedBoolean.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/SynchronizedBoolean.java
deleted file mode 100644
index 059e31b..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/SynchronizedBoolean.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal;
-
-import java.io.Serializable;
-
-/**
- * This class provides synchronized access to a boolean value.
- * It also provides protocol for suspending a thread until the
- * boolean value is set to true or false, with optional time-outs.
- */
-public class SynchronizedBoolean
-	implements Cloneable, Serializable
-{
-	/** Backing boolean. */
-	private boolean value;
-
-	/** Object to synchronize on. */
-	private final Object mutex;
-
-	private static final long serialVersionUID = 1L;
-
-
-	// ********** constructors **********
-
-	/**
-	 * Create a synchronized boolean with the specified initial value
-	 * and mutex.
-	 */
-	public SynchronizedBoolean(boolean value, Object mutex) {
-		super();
-		this.value = value;
-		this.mutex = mutex;
-	}
-
-	/**
-	 * Create a synchronized boolean with the specified initial value.
-	 */
-	public SynchronizedBoolean(boolean value) {
-		super();
-		this.value = value;
-		this.mutex = this;
-	}
-
-	/**
-	 * Create a synchronized boolean with an initial value of false
-	 * and specified mutex.
-	 */
-	public SynchronizedBoolean(Object mutex) {
-		this(false, mutex);
-	}
-
-	/**
-	 * Create a synchronized boolean with an initial value of false.
-	 */
-	public SynchronizedBoolean() {
-		this(false);
-	}
-
-
-	// ********** accessors **********
-
-	/**
-	 * Return the current boolean value.
-	 */
-	public boolean value() {
-		synchronized (this.mutex) {
-			return this.value;
-		}
-	}
-
-	/**
-	 * Return whether the current boolean value is true.
-	 */
-	public boolean isTrue() {
-		synchronized (this.mutex) {
-			return this.value;
-		}
-	}
-
-	/**
-	 * Return whether the current boolean value is false.
-	 */
-	public boolean isFalse() {
-		synchronized (this.mutex) {
-			return ! this.value;
-		}
-	}
-
-	/**
-	 * Set the boolean value. If the value changes, all waiting
-	 * threads are notified.
-	 */
-	public void setValue(boolean value) {
-		synchronized (this.mutex) {
-			if (this.value != value) {
-				this.value = value;
-				this.mutex.notifyAll();
-			}
-		}
-	}
-
-	/**
-	 * Set the boolean value to true. If the value changes, all waiting
-	 * threads are notified.
-	 */
-	public void setTrue() {
-		synchronized (this.mutex) {
-			this.setValue(true);
-		}
-	}
-
-	/**
-	 * Set the boolean value to false. If the value changes, all waiting
-	 * threads are notified.
-	 */
-	public void setFalse() {
-		synchronized (this.mutex) {
-			this.setValue(false);
-		}
-	}
-
-	/**
-	 * Return the object this object locks on while performing
-	 * its operations.
-	 */
-	public Object mutex() {
-		return this.mutex;
-	}
-
-
-	// ********** indefinite waits **********
-
-	/**
-	 * Suspend the current thread until the boolean value changes
-	 * to the specified value.
-	 */
-	public void waitUntilValueIs(boolean x) throws InterruptedException {
-		synchronized (this.mutex) {
-			while (this.value != x) {
-				this.mutex.wait();
-			}
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the boolean value changes to true.
-	 */
-	public void waitUntilTrue() throws InterruptedException {
-		synchronized (this.mutex) {
-			this.waitUntilValueIs(true);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the boolean value changes to false.
-	 */
-	public void waitUntilFalse() throws InterruptedException {
-		synchronized (this.mutex) {
-			this.waitUntilValueIs(false);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the boolean value changes to false,
-	 * then change it back to true and continue executing.
-	 */
-	public void waitToSetTrue() throws InterruptedException {
-		synchronized (this.mutex) {
-			this.waitUntilFalse();
-			this.setValue(true);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the boolean value changes to true,
-	 * then change it back to false and continue executing.
-	 */
-	public void waitToSetFalse() throws InterruptedException {
-		synchronized (this.mutex) {
-			this.waitUntilTrue();
-			this.setValue(false);
-		}
-	}
-
-
-	// ********** timed waits **********
-
-	/**
-	 * Suspend the current thread until the boolean value changes
-	 * to the specified value or the specified time-out occurs.
-	 * The time-out is specified in milliseconds. Return true if the specified
-	 * value was achieved; return false if a time-out occurred.
-	 */
-	public boolean waitUntilValueIs(boolean x, long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			if (timeout == 0L) {
-				this.waitUntilValueIs(x);	// wait indefinitely until notified
-				return true;	// if it ever comes back, the condition was met
-			}
-	
-			long stop = System.currentTimeMillis() + timeout;
-			long remaining = timeout;
-			while ((this.value != x) && (remaining > 0L)) {
-				this.mutex.wait(remaining);
-				remaining = stop - System.currentTimeMillis();
-			}
-			return (this.value == x);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the boolean value changes
-	 * to true or the specified time-out occurs.
-	 * The time-out is specified in milliseconds. Return true if the specified
-	 * value was achieved; return false if a time-out occurred.
-	 */
-	public boolean waitUntilTrue(long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			return this.waitUntilValueIs(true, timeout);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the boolean value changes
-	 * to false or the specified time-out occurs.
-	 * The time-out is specified in milliseconds. Return true if the specified
-	 * value was achieved; return false if a time-out occurred.
-	 */
-	public boolean waitUntilFalse(long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			return this.waitUntilValueIs(false, timeout);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the boolean value changes to false,
-	 * then change it back to true and continue executing. If the boolean
-	 * value does not change to false before the time-out, simply continue
-	 * executing without changing the value.
-	 * The time-out is specified in milliseconds. Return true if the value was
-	 * set to true; return false if a time-out occurred.
-	 */
-	public boolean waitToSetTrue(long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			boolean success = this.waitUntilFalse(timeout);
-			if (success) {
-				this.setValue(true);
-			}
-			return success;
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the boolean value changes to true,
-	 * then change it back to false and continue executing. If the boolean
-	 * value does not change to true before the time-out, simply continue
-	 * executing without changing the value.
-	 * The time-out is specified in milliseconds. Return true if the value was
-	 * set to false; return false if a time-out occurred.
-	 */
-	public boolean waitToSetFalse(long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			boolean success = this.waitUntilTrue(timeout);
-			if (success) {
-				this.setValue(false);
-			}
-			return success;
-		}
-	}
-
-
-	// ********** synchronized behavior **********
-
-	/**
-	 * If the current thread is not interrupted, execute the specified command 
-	 * with the mutex locked. This is useful for initializing the value in another
-	 * thread.
-	 */
-	public void execute(Command command) throws InterruptedException {
-		if (Thread.interrupted()) {
-			throw new InterruptedException();
-		}
-		synchronized (this.mutex) {
-			command.execute();
-		}
-	}
-
-
-	// ********** standard methods **********
-
-	@Override
-	public Object clone() {
-		try {
-			synchronized (this.mutex) {
-				return super.clone();
-			}
-		} catch (CloneNotSupportedException ex) {
-			throw new InternalError();
-		}
-	}
-
-	@Override
-	public boolean equals(Object o) {
-		if (o instanceof SynchronizedBoolean) {
-			return this.value() == ((SynchronizedBoolean) o).value();
-		}
-		return false;
-	}
-
-	@Override
-	public int hashCode() {
-		return this.value() ? 1 : 0;
-	}
-
-	@Override
-	public String toString() {
-		return String.valueOf(this.value());
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/SynchronizedObject.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/SynchronizedObject.java
deleted file mode 100644
index e991bce..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/SynchronizedObject.java
+++ /dev/null
@@ -1,355 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal;
-
-import java.io.Serializable;
-
-/**
- * This class provides synchronized access to an object of type E.
- * It also provides protocol for suspending a thread until the
- * value is set to null or a non-null value, with optional time-outs.
- */
-public class SynchronizedObject<E>
-	implements Cloneable, Serializable
-{
-	/** Backing value. */
-	private E value;
-
-	/** Object to synchronize on. */
-	private final Object mutex;
-
-	private static final long serialVersionUID = 1L;
-
-
-	// ********** constructors **********
-
-	/**
-	 * Create a synchronized object with the specified initial value
-	 * and mutex.
-	 */
-	public SynchronizedObject(E value, Object mutex) {
-		super();
-		this.value = value;
-		this.mutex = mutex;
-	}
-
-	/**
-	 * Create a synchronized object with the specified initial value.
-	 */
-	public SynchronizedObject(E value) {
-		super();
-		this.value = value;
-		this.mutex = this;
-	}
-
-	/**
-	 * Create a synchronized object with an initial value of null.
-	 */
-	public SynchronizedObject() {
-		this(null);
-	}
-
-
-	// ********** accessors **********
-
-	/**
-	 * Return the current value.
-	 */
-	public E value() {
-		synchronized (this.mutex) {
-			return this.value;
-		}
-	}
-
-	/**
-	 * Return whether the current value is null.
-	 */
-	public boolean isNull() {
-		synchronized (this.mutex) {
-			return this.value == null;
-		}
-	}
-
-	/**
-	 * Return whether the current value is not null.
-	 */
-	public boolean isNotNull() {
-		synchronized (this.mutex) {
-			return this.value != null;
-		}
-	}
-
-	/**
-	 * Set the value. If the value changes, all waiting
-	 * threads are notified.
-	 */
-	public void setValue(E value) {
-		synchronized (this.mutex) {
-			if (this.value != value) {
-				this.value = value;
-				this.mutex.notifyAll();
-			}
-		}
-	}
-
-	/**
-	 * Set the value to null. If the value changes, all waiting
-	 * threads are notified.
-	 */
-	public void setNull() {
-		synchronized (this.mutex) {
-			this.setValue(null);
-		}
-	}
-
-	/**
-	 * Return the object this object locks on while performing
-	 * its operations.
-	 */
-	public Object mutex() {
-		return this.mutex;
-	}
-
-
-	// ********** indefinite waits **********
-
-	/**
-	 * Suspend the current thread until the value changes
-	 * to the specified value.
-	 */
-	public void waitUntilValueIs(E x) throws InterruptedException {
-		synchronized (this.mutex) {
-			while (this.value != x) {
-				this.mutex.wait();
-			}
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the value changes
-	 * to something other than the specified value.
-	 */
-	public void waitUntilValueIsNot(E x) throws InterruptedException {
-		synchronized (this.mutex) {
-			while (this.value == x) {
-				this.mutex.wait();
-			}
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the value changes to null.
-	 */
-	public void waitUntilNull() throws InterruptedException {
-		synchronized (this.mutex) {
-			this.waitUntilValueIs(null);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the value changes
-	 * to something other than null.
-	 */
-	public void waitUntilNotNull() throws InterruptedException {
-		synchronized (this.mutex) {
-			this.waitUntilValueIsNot(null);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the value changes to
-	 * something other than the specified value, then change
-	 * it back to the specified value and continue executing.
-	 */
-	public void waitToSetValue(E x) throws InterruptedException {
-		synchronized (this.mutex) {
-			this.waitUntilValueIsNot(x);
-			this.setValue(x);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the value changes to
-	 * null, then change it back to null and continue executing.
-	 */
-	public void waitToSetNull() throws InterruptedException {
-		synchronized (this.mutex) {
-			this.waitUntilNotNull();
-			this.setValue(null);
-		}
-	}
-
-
-	// ********** timed waits **********
-
-	/**
-	 * Suspend the current thread until the value changes
-	 * to the specified value or the specified time-out occurs.
-	 * The time-out is specified in milliseconds. Return true if the specified
-	 * value was achieved; return false if a time-out occurred.
-	 */
-	public boolean waitUntilValueIs(E x, long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			if (timeout == 0L) {
-				this.waitUntilValueIs(x);	// wait indefinitely until notified
-				return true;	// if it ever comes back, the condition was met
-			}
-
-			long stop = System.currentTimeMillis() + timeout;
-			long remaining = timeout;
-			while ((this.value != x) && (remaining > 0L)) {
-				this.mutex.wait(remaining);
-				remaining = stop - System.currentTimeMillis();
-			}
-			return (this.value == x);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the value changes to something
-	 * other than the specified value or the specified time-out occurs.
-	 * The time-out is specified in milliseconds. Return true if the specified
-	 * value was removed; return false if a time-out occurred.
-	 */
-	public boolean waitUntilValueIsNot(E x, long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			if (timeout == 0L) {
-				this.waitUntilValueIsNot(x);	// wait indefinitely until notified
-				return true;	// if it ever comes back, the condition was met
-			}
-
-			long stop = System.currentTimeMillis() + timeout;
-			long remaining = timeout;
-			while ((this.value == x) && (remaining > 0L)) {
-				this.mutex.wait(remaining);
-				remaining = stop - System.currentTimeMillis();
-			}
-			return (this.value != x);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the value changes
-	 * to null or the specified time-out occurs.
-	 * The time-out is specified in milliseconds. Return true if the specified
-	 * value was achieved; return false if a time-out occurred.
-	 */
-	public boolean waitUntilNull(long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			return this.waitUntilValueIs(null, timeout);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the value changes
-	 * to something other than null or the specified time-out occurs.
-	 * The time-out is specified in milliseconds. Return true if the specified
-	 * value was achieved; return false if a time-out occurred.
-	 */
-	public boolean waitUntilNotNull(long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			return this.waitUntilValueIsNot(null, timeout);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the value changes to
-	 * something other than the specified value, then change
-	 * it back to the specified value and continue executing.
-	 * If the value does not change to something other than the
-	 * specified before the time-out, simply continue executing
-	 * without changing the value.
-	 * The time-out is specified in milliseconds. Return true if the value was
-	 * set to true; return false if a time-out occurred.
-	 */
-	public boolean waitToSetValue(E x, long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			boolean success = this.waitUntilValueIsNot(x, timeout);
-			if (success) {
-				this.setValue(x);
-			}
-			return success;
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the value changes to something
-	 * other than null, then change it back to null and continue executing.
-	 * If the value does not change to something other than null before
-	 * the time-out, simply continue executing without changing the value.
-	 * The time-out is specified in milliseconds. Return true if the value was
-	 * set to false; return false if a time-out occurred.
-	 */
-	public boolean waitToSetNull(long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			boolean success = this.waitUntilNotNull(timeout);
-			if (success) {
-				this.setValue(null);
-			}
-			return success;
-		}
-	}
-
-
-	// ********** synchronized behavior **********
-
-	/**
-	 * If current thread is not interrupted, execute the specified command 
-	 * with the mutex locked. This is useful for initializing the value in another
-	 * thread.
-	 */
-	public void execute(Command command) throws InterruptedException {
-		if (Thread.interrupted()) {
-			throw new InterruptedException();
-		}
-		synchronized (this.mutex) {
-			command.execute();
-		}
-	}
-
-
-	// ********** standard methods **********
-
-	@Override
-	public SynchronizedObject<E> clone() {
-		try {
-			synchronized (this.mutex) {
-				@SuppressWarnings("unchecked")
-				SynchronizedObject<E> clone = (SynchronizedObject<E>) super.clone();
-				return clone;
-			}
-		} catch (CloneNotSupportedException ex) {
-			throw new InternalError();
-		}
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if ( ! (obj instanceof SynchronizedObject)) {
-			return false;
-		}
-		Object thisValue = this.value();
-		Object otherValue = ((SynchronizedObject<?>) obj).value();
-		return (thisValue == null) ?
-			(otherValue == null) : thisValue.equals(otherValue);
-	}
-
-	@Override
-	public int hashCode() {
-		Object temp = this.value();
-		return (temp == null) ? 0 : temp.hashCode();
-	}
-
-	@Override
-	public String toString() {
-		return String.valueOf(this.value());
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/SynchronizedStack.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/SynchronizedStack.java
deleted file mode 100644
index 6455e84..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/SynchronizedStack.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal;
-
-import java.io.Serializable;
-import java.util.EmptyStackException;
-
-/**
- * Thread-safe implementation of the Stack interface.
- * This also provides protocol for suspending a thread until the
- * stack is empty or not empty, with optional time-outs.
- */
-public class SynchronizedStack<E>
-	implements Stack<E>, Serializable
-{
-	/** Backing stack. */
-	private Stack<E> stack;
-
-	/** Object to synchronize on. */
-	private final Object mutex;
-
-	private static final long serialVersionUID = 1L;
-
-
-	// ********** constructors **********
-
-	/**
-	 * Construct a synchronized stack that wraps the
-	 * specified stack and locks on the specified mutex.
-	 */
-	public SynchronizedStack(Stack<E> stack, Object mutex) {
-		super();
-		this.stack = stack;
-		this.mutex = mutex;
-	}
-
-	/**
-	 * Construct a synchronized stack that wraps the
-	 * specified stack and locks on itself.
-	 */
-	public SynchronizedStack(Stack<E> stack) {
-		super();
-		this.stack = stack;
-		this.mutex = this;
-	}
-
-	/**
-	 * Construct a synchronized stack that locks on the specified mutex.
-	 */
-	public SynchronizedStack(Object mutex) {
-		this(new SimpleStack<E>(), mutex);
-	}
-
-	/**
-	 * Construct a synchronized stack that locks on itself.
-	 */
-	public SynchronizedStack() {
-		this(new SimpleStack<E>());
-	}
-
-
-	// ********** Stack implementation **********
-
-	public void push(E o) {
-		synchronized (this.mutex) {
-			this.stack.push(o);
-			this.mutex.notifyAll();
-		}
-	}
-
-	public E pop() {
-		synchronized (this.mutex) {
-			E o = this.stack.pop();
-			this.mutex.notifyAll();
-			return o;
-		}
-	}
-
-	public E peek() {
-		synchronized (this.mutex) {
-			return this.stack.peek();
-		}
-	}
-
-	public boolean isEmpty() {
-		synchronized (this.mutex) {
-			return this.stack.isEmpty();
-		}
-	}
-
-
-	// ********** indefinite waits **********
-
-	/**
-	 * Suspend the current thread until the stack's empty status changes
-	 * to the specified value.
-	 */
-	public void waitUntilEmptyIs(boolean empty) throws InterruptedException {
-		synchronized (this.mutex) {
-			while (this.isEmpty() != empty) {
-				this.mutex.wait();
-			}
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the stack is empty.
-	 */
-	public void waitUntilEmpty() throws InterruptedException {
-		synchronized (this.mutex) {
-			this.waitUntilEmptyIs(true);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the stack has something on it.
-	 */
-	public void waitUntilNotEmpty() throws InterruptedException {
-		synchronized (this.mutex) {
-			this.waitUntilEmptyIs(false);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the stack is empty,
-	 * then "push" the specified item on to the top of the stack
-	 * and continue executing.
-	 */
-	public void waitToPush(E o) throws InterruptedException {
-		synchronized (this.mutex) {
-			this.waitUntilEmpty();
-			this.push(o);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the stack has something on it,
-	 * then "pop" an item from the top of the stack and return it.
-	 */
-	public Object waitToPop() throws InterruptedException {
-		synchronized (this.mutex) {
-			this.waitUntilNotEmpty();
-			return this.pop();
-		}
-	}
-
-
-	// ********** timed waits **********
-
-	/**
-	 * Suspend the current thread until the stack's empty status changes
-	 * to the specified value or the specified time-out occurs.
-	 * The time-out is specified in milliseconds. Return true if the specified
-	 * value was achieved; return false if a time-out occurred.
-	 */
-	public boolean waitUntilEmptyIs(boolean empty, long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			if (timeout == 0L) {
-				this.waitUntilEmptyIs(empty);	// wait indefinitely until notified
-				return true;	// if it ever comes back, the condition was met
-			}
-
-			long stop = System.currentTimeMillis() + timeout;
-			long remaining = timeout;
-			while ((this.isEmpty() != empty) && (remaining > 0L)) {
-				this.mutex.wait(remaining);
-				remaining = stop - System.currentTimeMillis();
-			}
-			return (this.isEmpty() == empty);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the stack is empty
-	 * or the specified time-out occurs.
-	 * The time-out is specified in milliseconds. Return true if
-	 * the stack is empty; return false if a time-out occurred.
-	 */
-	public boolean waitUntilEmpty(long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			return this.waitUntilEmptyIs(true, timeout);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the stack has something on it.
-	 * or the specified time-out occurs.
-	 * The time-out is specified in milliseconds. Return true if
-	 * the stack has something on it; return false if a time-out occurred.
-	 */
-	public boolean waitUntilNotEmpty(long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			return this.waitUntilEmptyIs(false, timeout);
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the stack is empty,
-	 * then "push" the specified item on to the top of the stack
-	 * and continue executing. If the stack is not emptied out
-	 * before the time-out, simply continue executing without
-	 * "pushing" the item.
-	 * The time-out is specified in milliseconds. Return true if the
-	 * item was pushed; return false if a time-out occurred.
-	 */
-	public boolean waitToPush(E o, long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			boolean success = this.waitUntilEmpty(timeout);
-			if (success) {
-				this.push(o);
-			}
-			return success;
-		}
-	}
-
-	/**
-	 * Suspend the current thread until the stack has something on it,
-	 * then "pop" an item from the top of the stack and return it.
-	 * If the stack is empty and nothing is "pushed" on to it before the
-	 * time-out, throw an empty stack exception.
-	 * The time-out is specified in milliseconds.
-	 */
-	public Object waitToPop(long timeout) throws InterruptedException {
-		synchronized (this.mutex) {
-			boolean success = this.waitUntilNotEmpty(timeout);
-			if (success) {
-				return this.pop();
-			}
-			throw new EmptyStackException();
-		}
-	}
-
-
-	// ********** synchronized behavior **********
-
-	/**
-	 * If the current thread is not interrupted, execute the specified command 
-	 * with the mutex locked. This is useful for initializing the stack in another
-	 * thread.
-	 */
-	public void execute(Command command) throws InterruptedException {
-		if (Thread.interrupted()) {
-			throw new InterruptedException();
-		}
-		synchronized (this.mutex) {
-			command.execute();
-		}
-	}
-
-
-	// ********** additional public protocol **********
-
-	/**
-	 * Return the object this object locks on while performing
-	 * its operations.
-	 */
-	public Object getMutex() {
-		return this.mutex;
-	}
-
-
-	// ********** Object overrides **********
-
-	@Override
-	public String toString() {
-		synchronized (this.mutex) {
-			return this.stack.toString();
-		}
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/AWTChangeEventDispatcher.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/AWTChangeEventDispatcher.java
deleted file mode 100644
index b3e0b20..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/AWTChangeEventDispatcher.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model;
-
-import java.awt.EventQueue;
-import java.io.Serializable;
-
-import org.eclipse.jpt.utility.internal.model.event.CollectionChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.ListChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.PropertyChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.StateChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.TreeChangeEvent;
-import org.eclipse.jpt.utility.internal.model.listener.CollectionChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ListChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.PropertyChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.StateChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.TreeChangeListener;
-
-/**
- * AWT-aware implementation of ChangeEventDispatcher interface:
- * If we are executing on the AWT event-dispatch thread,
- * simply forward the change notification directly to the listener.
- * If we are executing on some other thread, queue up the
- * notification on the AWT event queue so it can be executed
- * on the event-dispatch thread (after the pending events have
- * been dispatched).
- */
-public class AWTChangeEventDispatcher
-	implements ChangeEventDispatcher, Serializable
-{
-	// singleton
-	private static ChangeEventDispatcher INSTANCE;
-
-	private static final long serialVersionUID = 1L;
-
-
-	/**
-	 * Return the singleton.
-	 */
-	public synchronized static ChangeEventDispatcher instance() {
-		if (INSTANCE == null) {
-			INSTANCE = new AWTChangeEventDispatcher();
-		}
-		return INSTANCE;
-	}
-
-	/**
-	 * Ensure non-instantiability.
-	 */
-	private AWTChangeEventDispatcher() {
-		super();
-	}
-
-	public void stateChanged(final StateChangeListener listener, final StateChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.stateChanged(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.stateChanged(event);
-					}
-					@Override
-					public String toString() {
-						return "stateChanged";
-					}
-				}
-			);
-		}
-	}
-
-	public void propertyChanged(final PropertyChangeListener listener, final PropertyChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.propertyChanged(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.propertyChanged(event);
-					}
-					@Override
-					public String toString() {
-						return "propertyChanged";
-					}
-				}
-			);
-		}
-	}
-
-	public void itemsAdded(final CollectionChangeListener listener, final CollectionChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.itemsAdded(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.itemsAdded(event);
-					}
-					@Override
-					public String toString() {
-						return "itemsAdded (Collection)";
-					}
-				}
-			);
-		}
-	}
-
-	public void itemsRemoved(final CollectionChangeListener listener, final CollectionChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.itemsRemoved(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.itemsRemoved(event);
-					}
-					@Override
-					public String toString() {
-						return "itemsRemoved (Collection)";
-					}
-				}
-			);
-		}
-	}
-
-	public void collectionCleared(final CollectionChangeListener listener, final CollectionChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.collectionCleared(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.collectionCleared(event);
-					}
-					@Override
-					public String toString() {
-						return "collectionCleared";
-					}
-				}
-			);
-		}
-	}
-
-	public void collectionChanged(final CollectionChangeListener listener, final CollectionChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.collectionChanged(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.collectionChanged(event);
-					}
-					@Override
-					public String toString() {
-						return "collectionChanged";
-					}
-				}
-			);
-		}
-	}
-
-	public void itemsAdded(final ListChangeListener listener, final ListChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.itemsAdded(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.itemsAdded(event);
-					}
-					@Override
-					public String toString() {
-						return "itemsAdded (List)";
-					}
-				}
-			);
-		}
-	}
-
-	public void itemsRemoved(final ListChangeListener listener, final ListChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.itemsRemoved(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.itemsRemoved(event);
-					}
-					@Override
-					public String toString() {
-						return "itemsRemoved (List)";
-					}
-				}
-			);
-		}
-	}
-
-	public void itemsReplaced(final ListChangeListener listener, final ListChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.itemsReplaced(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.itemsReplaced(event);
-					}
-					@Override
-					public String toString() {
-						return "itemsReplaced (List)";
-					}
-				}
-			);
-		}
-	}
-
-	public void itemsMoved(final ListChangeListener listener, final ListChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.itemsMoved(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.itemsMoved(event);
-					}
-					@Override
-					public String toString() {
-						return "itemsMoved (List)";
-					}
-				}
-			);
-		}
-	}
-
-	public void listCleared(final ListChangeListener listener, final ListChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.listCleared(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.listCleared(event);
-					}
-					@Override
-					public String toString() {
-						return "listCleared";
-					}
-				}
-			);
-		}
-	}
-
-	public void listChanged(final ListChangeListener listener, final ListChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.listChanged(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.listChanged(event);
-					}
-					@Override
-					public String toString() {
-						return "listChanged";
-					}
-				}
-			);
-		}
-	}
-
-	public void nodeAdded(final TreeChangeListener listener, final TreeChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.nodeAdded(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.nodeAdded(event);
-					}
-					@Override
-					public String toString() {
-						return "nodeAdded";
-					}
-				}
-			);
-		}
-	}
-
-	public void nodeRemoved(final TreeChangeListener listener, final TreeChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.nodeRemoved(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.nodeRemoved(event);
-					}
-					@Override
-					public String toString() {
-						return "nodeRemoved";
-					}
-				}
-			);
-		}
-	}
-
-	public void treeCleared(final TreeChangeListener listener, final TreeChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.treeCleared(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.treeCleared(event);
-					}
-					@Override
-					public String toString() {
-						return "treeCleared";
-					}
-				}
-			);
-		}
-	}
-
-	public void treeChanged(final TreeChangeListener listener, final TreeChangeEvent event) {
-		if (EventQueue.isDispatchThread()) {
-			listener.treeChanged(event);
-		} else {
-			this.invoke(
-				new Runnable() {
-					public void run() {
-						listener.treeChanged(event);
-					}
-					@Override
-					public String toString() {
-						return "treeChanged";
-					}
-				}
-			);
-		}
-	}
-
-	/**
-	 * EventQueue.invokeLater(Runnable) seems to work OK;
-	 * but using #invokeAndWait() can somtimes make things
-	 * more predictable when debugging.
-	 */
-	private void invoke(Runnable r) {
-		EventQueue.invokeLater(r);
-//		try {
-//			EventQueue.invokeAndWait(r);
-//		} catch (InterruptedException ex) {
-//			throw new RuntimeException(ex);
-//		} catch (java.lang.reflect.InvocationTargetException ex) {
-//			throw new RuntimeException(ex);
-//		}
-	}
-
-	/**
-	 * Serializable singleton support
-	 */
-	private Object readResolve() {
-		return instance();
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/AbstractModel.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/AbstractModel.java
deleted file mode 100644
index 6a3af61..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/AbstractModel.java
+++ /dev/null
@@ -1,776 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jpt.utility.internal.CollectionTools;
-import org.eclipse.jpt.utility.internal.HashBag;
-import org.eclipse.jpt.utility.internal.StringTools;
-import org.eclipse.jpt.utility.internal.model.event.CollectionChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.ListChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.PropertyChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.StateChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.TreeChangeEvent;
-import org.eclipse.jpt.utility.internal.model.listener.CollectionChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ListChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.PropertyChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.StateChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.TreeChangeListener;
-
-/**
- * Convenience implementation of Model protocol.
- */
-public abstract class AbstractModel implements Model, Serializable {
-	/**
-	 * Delegate state/property/collection/list/tree change support to this
-	 * helper object. The change support object is "lazy-initialized".
-	 */
-	private ChangeSupport changeSupport;
-
-
-	// ********** constructors/initialization **********
-
-	/**
-	 * Default constructor.
-	 * This will call #initialize() on the newly-created instance.
-	 */
-	protected AbstractModel() {
-		super();
-		this.initialize();
-	}
-
-	protected void initialize() {
-		// do nothing by default
-	}
-
-	/**
-	 * This accessor will build the change support when required.
-	 */
-	private synchronized ChangeSupport changeSupport() {
-		if (this.changeSupport == null) {
-			this.changeSupport = this.buildChangeSupport();
-		}
-		return this.changeSupport;
-	}
-
-	/**
-	 * Allow subclasses to tweak the change support used.
-	 */
-	protected ChangeSupport buildChangeSupport() {
-		return new ChangeSupport(this);
-	}
-
-
-	// ********** state change support **********
-
-	public synchronized void addStateChangeListener(StateChangeListener listener) {
-		this.changeSupport().addStateChangeListener(listener);
-	}
-
-	public synchronized void removeStateChangeListener(StateChangeListener listener) {
-		this.changeSupport().removeStateChangeListener(listener);
-	}
-
-	protected final void fireStateChanged() {
-		this.changeSupport().fireStateChanged();
-	}
-
-	protected final void fireStateChanged(StateChangeEvent event) {
-		this.changeSupport().fireStateChanged(event);
-	}
-
-
-	// ********** property change support **********
-
-	public synchronized void addPropertyChangeListener(PropertyChangeListener listener) {
-		this.changeSupport().addPropertyChangeListener(listener);
-	}
-
-	public synchronized void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
-		this.changeSupport().addPropertyChangeListener(propertyName, listener);
-	}
-
-	public synchronized void removePropertyChangeListener(PropertyChangeListener listener) {
-		this.changeSupport().removePropertyChangeListener(listener);
-	}
-
-	public synchronized void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
-		this.changeSupport().removePropertyChangeListener(propertyName, listener);
-	}
-
-	protected final void firePropertyChanged(String propertyName, Object oldValue, Object newValue) {
-		this.changeSupport().firePropertyChanged(propertyName, oldValue, newValue);
-	}
-
-	protected final void firePropertyChanged(String propertyName, int oldValue, int newValue) {
-		this.changeSupport().firePropertyChanged(propertyName, oldValue, newValue);
-	}
-
-	protected final void firePropertyChanged(String propertyName, boolean oldValue, boolean newValue) {
-		this.changeSupport().firePropertyChanged(propertyName, oldValue, newValue);
-	}
-
-	protected final void firePropertyChanged(String propertyName, Object newValue) {
-		this.changeSupport().firePropertyChanged(propertyName, null, newValue);
-	}
-
-	protected final void firePropertyChanged(PropertyChangeEvent event) {
-		this.changeSupport().firePropertyChanged(event);
-	}
-
-
-	// ********** collection change support **********
-
-	public synchronized void addCollectionChangeListener(CollectionChangeListener listener) {
-		this.changeSupport().addCollectionChangeListener(listener);
-	}
-
-	public synchronized void addCollectionChangeListener(String collectionName, CollectionChangeListener listener) {
-		this.changeSupport().addCollectionChangeListener(collectionName, listener);
-	}
-
-	public synchronized void removeCollectionChangeListener(CollectionChangeListener listener) {
-		this.changeSupport().removeCollectionChangeListener(listener);
-	}
-
-	public synchronized void removeCollectionChangeListener(String collectionName, CollectionChangeListener listener) {
-		this.changeSupport().removeCollectionChangeListener(collectionName, listener);
-	}
-
-	protected final void fireItemAdded(String collectionName, Object addedItem) {
-		this.changeSupport().fireItemAdded(collectionName, addedItem);
-	}
-
-	protected final void fireItemsAdded(String collectionName, Collection<?> addedItems) {
-		this.changeSupport().fireItemsAdded(collectionName, addedItems);
-	}
-
-	protected final void fireItemsAdded(CollectionChangeEvent event) {
-		this.changeSupport().fireItemsAdded(event);
-	}
-
-	protected final void fireItemRemoved(String collectionName, Object removedItem) {
-		this.changeSupport().fireItemRemoved(collectionName, removedItem);
-	}
-
-	protected final void fireItemsRemoved(String collectionName, Collection<?> removedItems) {
-		this.changeSupport().fireItemsRemoved(collectionName, removedItems);
-	}
-
-	protected final void fireItemsRemoved(CollectionChangeEvent event) {
-		this.changeSupport().fireItemsRemoved(event);
-	}
-
-	protected final void fireCollectionCleared(String collectionName) {
-		this.changeSupport().fireCollectionCleared(collectionName);
-	}
-
-	protected final void fireCollectionCleared(CollectionChangeEvent event) {
-		this.changeSupport().fireCollectionCleared(event);
-	}
-
-	protected final void fireCollectionChanged(String collectionName) {
-		this.changeSupport().fireCollectionChanged(collectionName);
-	}
-
-	protected final void fireCollectionChanged(CollectionChangeEvent event) {
-		this.changeSupport().fireCollectionChanged(event);
-	}
-
-	/**
-	 * Convenience method.
-	 * Add the specified item to the specified bound collection
-	 * and fire the appropriate event if necessary.
-	 * Return whether the collection changed.
-	 */
-	protected <E> boolean addItemToCollection(E item, Collection<E> collection, String collectionName) {
-		if (collection.add(item)) {
-			this.fireItemAdded(collectionName, item);
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Convenience method.
-	 * Add the specified items to the specified bound collection
-	 * and fire the appropriate event if necessary.
-	 * Return whether collection changed.
-	 */
-	protected <E> boolean addItemsToCollection(Iterable<? extends E> items, Collection<E> collection, String collectionName) {
-		return this.addItemsToCollection(items.iterator(), collection, collectionName);
-	}
-
-	/**
-	 * Convenience method.
-	 * Add the specified items to the specified bound collection
-	 * and fire the appropriate event if necessary.
-	 * Return whether collection changed.
-	 */
-	protected <E> boolean addItemsToCollection(Iterator<? extends E> items, Collection<E> collection, String collectionName) {
-		Collection<E> addedItems = null;
-		while (items.hasNext()) {
-			E item = items.next();
-			if (collection.add(item)) {
-				if (addedItems == null) {
-					addedItems = new ArrayList<E>();
-				}
-				addedItems.add(item);
-			}
-		}
-		if (addedItems != null) {
-			this.fireItemsAdded(collectionName, addedItems);
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Convenience method.
-	 * Remove the specified item from the specified bound collection
-	 * and fire the appropriate event if necessary.
-	 * Return whether the collection changed.
-	 * @see java.util.Collection#remove(Object)
-	 */
-	protected boolean removeItemFromCollection(Object item, Collection<?> collection, String collectionName) {
-		if (collection.remove(item)) {
-			this.fireItemRemoved(collectionName, item);
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Convenience method.
-	 * Remove the specified items from the specified bound collection
-	 * and fire the appropriate event if necessary.
-	 * Return whether the collection changed.
-	 * @see java.util.Collection#remove(Object)
-	 */
-	protected boolean removeItemsFromCollection(Iterable<?> items, Collection<?> collection, String collectionName) {
-		return this.removeItemsFromCollection(items.iterator(), collection, collectionName);
-	}
-
-	/**
-	 * Convenience method.
-	 * Remove the specified items from the specified bound collection
-	 * and fire the appropriate event if necessary.
-	 * Return whether the collection changed.
-	 * @see java.util.Collection#remove(Object)
-	 */
-	protected boolean removeItemsFromCollection(Iterator<?> items, Collection<?> collection, String collectionName) {
-		Collection<?> items2 = CollectionTools.collection(items);
-		items2.retainAll(collection);
-		boolean changed = collection.removeAll(items2);
-
-		if ( ! items2.isEmpty()) {
-			this.fireItemsRemoved(collectionName, items2);
-		}
-		return changed;
-	}
-
-	/**
-	 * Convenience method.
-	 * Clear the entire collection
-	 * and fire the appropriate event if necessary.
-	 * Return whether the list changed.
-	 */
-	protected boolean clearCollection(Collection<?> collection, String collectionName) {
-		if (collection.isEmpty()) {
-			return false;
-		}
-		collection.clear();
-		this.fireCollectionCleared(collectionName);
-		return true;
-	}
-
-	/**
-	 * Convenience method.
-	 * Synchronize the collection with the specified new collection,
-	 * making a minimum number of removes and adds.
-	 * Return whether the collection changed.
-	 */
-	protected <E> boolean synchronizeCollection(Collection<E> newCollection, Collection<E> collection, String collectionName) {
-		if (newCollection.isEmpty()) {
-			return this.clearCollection(collection, collectionName);
-		}
-
-		if (collection.isEmpty()) {
-			return this.addItemsToCollection(newCollection, collection, collectionName);
-		}
-
-		boolean changed = false;
-		Collection<E> removeItems = new HashBag<E>(collection);
-		removeItems.removeAll(newCollection);
-		changed |= this.removeItemsFromCollection(removeItems, collection, collectionName);
-
-		Collection<E> addItems = new HashBag<E>(newCollection);
-		addItems.removeAll(collection);
-		changed |= this.addItemsToCollection(addItems, collection, collectionName);
-
-		return changed;
-	}
-
-	/**
-	 * Convenience method.
-	 * Synchronize the collection with the specified new collection,
-	 * making a minimum number of removes and adds.
-	 * Return whether the collection changed.
-	 */
-	protected <E> boolean synchronizeCollection(Iterator<E> newItems, Collection<E> collection, String collectionName) {
-		return this.synchronizeCollection(CollectionTools.collection(newItems), collection, collectionName);
-	}
-
-
-	// ********** list change support **********
-
-	public synchronized void addListChangeListener(ListChangeListener listener) {
-		this.changeSupport().addListChangeListener(listener);
-	}
-
-	public synchronized void addListChangeListener(String listName, ListChangeListener listener) {
-		this.changeSupport().addListChangeListener(listName, listener);
-	}
-
-	public synchronized void removeListChangeListener(ListChangeListener listener) {
-		this.changeSupport().removeListChangeListener(listener);
-	}
-
-	public synchronized void removeListChangeListener(String listName, ListChangeListener listener) {
-		this.changeSupport().removeListChangeListener(listName, listener);
-	}
-
-	protected final void fireItemAdded(String listName, int index, Object addedItem) {
-		this.changeSupport().fireItemAdded(listName, index, addedItem);
-	}
-
-	protected final void fireItemsAdded(String listName, int index, List<?> addedItems) {
-		this.changeSupport().fireItemsAdded(listName, index, addedItems);
-	}
-
-	protected final void fireItemsAdded(ListChangeEvent event) {
-		this.changeSupport().fireItemsAdded(event);
-	}
-
-	protected final void fireItemRemoved(String listName, int index, Object removedItem) {
-		this.changeSupport().fireItemRemoved(listName, index, removedItem);
-	}
-
-	protected final void fireItemsRemoved(String listName, int index, List<?> removedItems) {
-		this.changeSupport().fireItemsRemoved(listName, index, removedItems);
-	}
-
-	protected final void fireItemsRemoved(ListChangeEvent event) {
-		this.changeSupport().fireItemsRemoved(event);
-	}
-
-	protected final void fireItemReplaced(String listName, int index, Object newItem, Object replacedItem) {
-		this.changeSupport().fireItemReplaced(listName, index, newItem, replacedItem);
-	}
-
-	protected final <E> void fireItemsReplaced(String listName, int index, List<? extends E> newItems, List<E> replacedItems) {
-		this.changeSupport().fireItemsReplaced(listName, index, newItems, replacedItems);
-	}
-
-	protected final void fireItemsReplaced(ListChangeEvent event) {
-		this.changeSupport().fireItemsReplaced(event);
-	}
-
-	protected final void fireItemMoved(String listName, int targetIndex, int sourceIndex) {
-		this.changeSupport().fireItemMoved(listName, targetIndex, sourceIndex);
-	}
-
-	protected final <E> void fireItemsMoved(String listName, int targetIndex, int sourceIndex, int length) {
-		this.changeSupport().fireItemsMoved(listName, targetIndex, sourceIndex, length);
-	}
-
-	protected final void fireItemsMoved(ListChangeEvent event) {
-		this.changeSupport().fireItemsMoved(event);
-	}
-
-	protected final void fireListCleared(String listName) {
-		this.changeSupport().fireListCleared(listName);
-	}
-
-	protected final void fireListCleared(ListChangeEvent event) {
-		this.changeSupport().fireListCleared(event);
-	}
-
-	protected final void fireListChanged(String listName) {
-		this.changeSupport().fireListChanged(listName);
-	}
-
-	protected final void fireListChanged(ListChangeEvent event) {
-		this.changeSupport().fireListChanged(event);
-	}
-
-	/**
-	 * Convenience method.
-	 * Add the specified item to the specified bound list
-	 * and fire the appropriate event if necessary.
-	 */
-	protected <E> void addItemToList(int index, E item, List<E> list, String listName) {
-		list.add(index, item);
-		this.fireItemAdded(listName, index, item);
-	}
-
-	/**
-	 * Convenience method.
-	 * Add the specified item to the end of the specified bound list
-	 * and fire the appropriate event if necessary.
-	 */
-	protected <E> void addItemToList(E item, List<E> list, String listName) {
-		this.addItemToList(list.size(), item, list, listName);
-	}
-
-	/**
-	 * Convenience method.
-	 * Add the specified items to the specified bound list
-	 * and fire the appropriate event if necessary.
-	 */
-	protected <E> void addItemsToList(int index, List<? extends E> items, List<E> list, String listName) {
-		list.addAll(index, items);
-		this.fireItemsAdded(listName, index, items);
-	}
-
-	/**
-	 * Convenience method.
-	 * Add the specified items to the end of to the specified bound list
-	 * and fire the appropriate event if necessary.
-	 */
-	protected <E> void addItemsToList(List<? extends E> items, List<E> list, String listName) {
-		this.addItemsToList(list.size(), items, list, listName);
-	}
-
-	/**
-	 * Convenience method.
-	 * Remove the specified item from the specified bound list
-	 * and fire the appropriate event if necessary.
-	 * Return the removed item.
-	 */
-	protected Object removeItemFromList(int index, List<?> list, String listName) {
-		Object item = list.remove(index);
-		this.fireItemRemoved(listName, index, item);
-		return item;
-	}
-
-	/**
-	 * Convenience method.
-	 * Remove the specified item from the specified bound list
-	 * and fire the appropriate event if necessary.
-	 * Return the removed item.
-	 */
-	protected Object removeItemFromList(Object item, List<?> list, String listName) {
-		return this.removeItemFromList(list.indexOf(item), list, listName);
-	}
-
-	/**
-	 * Convenience method.
-	 * Remove the specified items from the specified bound list
-	 * and fire the appropriate event if necessary.
-	 * Return the removed items.
-	 */
-	protected <E> List<E> removeItemsFromList(int index, int length, List<E> list, String listName) {
-		List<E> subList = list.subList(index, index + length);
-		List<E> removedItems = new ArrayList<E>(subList);
-		subList.clear();
-		this.fireItemsRemoved(listName, index, removedItems);
-		return removedItems;
-	}
-
-	/**
-	 * Convenience method.
-	 * Set the specified item in the specified bound list
-	 * and fire the appropriate event if necessary.
-	 * Return the replaced item.
-	 */
-	protected <E> E setItemInList(int index, E item, List<E> list, String listName) {
-		E replacedItem = list.set(index, item);
-		this.fireItemReplaced(listName, index, item, replacedItem);
-		return replacedItem;
-	}
-
-	/**
-	 * Convenience method.
-	 * Replace the specified item in the specified bound list
-	 * and fire the appropriate event if necessary.
-	 * Return the replaced item.
-	 */
-	protected <E> E replaceItemInList(E oldItem, E newItem, List<E> list, String listName) {
-		return this.setItemInList(list.indexOf(oldItem), newItem, list, listName);
-	}
-
-	/**
-	 * Convenience method.
-	 * Set the specified items in the specified bound list
-	 * and fire the appropriate event if necessary.
-	 * Return the replaced items.
-	 */
-	protected <E> List<E> setItemsInList(int index, List<? extends E> items, List<E> list, String listName) {
-		List<E> subList = list.subList(index, index + items.size());
-		List<E> replacedItems = new ArrayList<E>(subList);
-		for (int i = 0; i < items.size(); i++) {
-			subList.set(i, items.get(i));
-		}
-		this.fireItemsReplaced(listName, index, items, replacedItems);
-		return replacedItems;
-	}
-
-	/**
-	 * Convenience method.
-	 * Move items in the specified list from the specified source index to the
-	 * specified target index for the specified length.
-	 */
-	protected <E> void moveItemsInList(int targetIndex, int sourceIndex, int length, List<E> list, String listName) {
-		CollectionTools.move(list, targetIndex, sourceIndex, length);
-		this.fireItemsMoved(listName, targetIndex, sourceIndex, length);
-	}
-
-	/**
-	 * Convenience method.
-	 * Move an item in the specified list from the specified source index to the
-	 * specified target index.
-	 */
-	protected <E> void moveItemInList(int targetIndex, int sourceIndex, List<E> list, String listName) {
-		CollectionTools.move(list, targetIndex, sourceIndex);
-		this.fireItemMoved(listName, targetIndex, sourceIndex);
-	}
-
-	/**
-	 * Convenience method.
-	 * Clear the entire list
-	 * and fire the appropriate event if necessary.
-	 * Return whether the list changed.
-	 */
-	protected boolean clearList(List<?> list, String listName) {
-		if (list.isEmpty()) {
-			return false;
-		}
-		list.clear();
-		this.fireListCleared(listName);
-		return true;
-	}
-
-
-	// ********** tree change support **********
-
-	public synchronized void addTreeChangeListener(TreeChangeListener listener) {
-		this.changeSupport().addTreeChangeListener(listener);
-	}
-
-	public synchronized void addTreeChangeListener(String treeName, TreeChangeListener listener) {
-		this.changeSupport().addTreeChangeListener(treeName, listener);
-	}
-
-	public synchronized void removeTreeChangeListener(TreeChangeListener listener) {
-		this.changeSupport().removeTreeChangeListener(listener);
-	}
-
-	public synchronized void removeTreeChangeListener(String treeName, TreeChangeListener listener) {
-		this.changeSupport().removeTreeChangeListener(treeName, listener);
-	}
-
-	protected final void fireNodeAdded(String treeName, Object[] path) {
-		this.changeSupport().fireNodeAdded(treeName, path);
-	}
-
-	protected final void fireNodeAdded(TreeChangeEvent event) {
-		this.changeSupport().fireNodeAdded(event);
-	}
-
-	protected final void fireNodeRemoved(String treeName, Object[] path) {
-		this.changeSupport().fireNodeRemoved(treeName, path);
-	}
-
-	protected final void fireNodeRemoved(TreeChangeEvent event) {
-		this.changeSupport().fireNodeRemoved(event);
-	}
-
-	protected final void fireTreeCleared(String treeName) {
-		this.changeSupport().fireTreeCleared(treeName);
-	}
-
-	protected final void fireTreeCleared(TreeChangeEvent event) {
-		this.changeSupport().fireTreeCleared(event);
-	}
-
-	protected final void fireTreeChanged(String treeName) {
-		this.changeSupport().fireTreeChanged(treeName);
-	}
-
-	protected final void fireTreeChanged(String treeName, Object[] path) {
-		this.changeSupport().fireTreeChanged(treeName, path);
-	}
-
-	protected final void fireTreeChanged(TreeChangeEvent event) {
-		this.changeSupport().fireTreeChanged(event);
-	}
-
-
-	// ********** queries **********
-
-	/**
-	 * Return whether there are any state change listeners.
-	 */
-	public boolean hasAnyStateChangeListeners() {
-		return this.changeSupport().hasAnyStateChangeListeners();
-	}
-
-	/**
-	 * Return whether there are no state change listeners.
-	 */
-	public boolean hasNoStateChangeListeners() {
-		return ! this.hasAnyStateChangeListeners();
-	}
-
-	/**
-	 * Return whether there are any property change listeners for a specific property.
-	 */
-	public boolean hasAnyPropertyChangeListeners(String propertyName) {
-		return this.changeSupport().hasAnyPropertyChangeListeners(propertyName);
-	}
-
-	/**
-	 * Return whether there are any property change listeners for a specific property.
-	 */
-	public boolean hasNoPropertyChangeListeners(String propertyName) {
-		return ! this.hasAnyPropertyChangeListeners(propertyName);
-	}
-
-	/**
-	 * Return whether there are any collection change listeners for a specific collection.
-	 */
-	public boolean hasAnyCollectionChangeListeners(String collectionName) {
-		return this.changeSupport().hasAnyCollectionChangeListeners(collectionName);
-	}
-
-	/**
-	 * Return whether there are any collection change listeners for a specific collection.
-	 */
-	public boolean hasNoCollectionChangeListeners(String collectionName) {
-		return ! this.hasAnyCollectionChangeListeners(collectionName);
-	}
-
-	/**
-	 * Return whether there are any list change listeners for a specific list.
-	 */
-	public boolean hasAnyListChangeListeners(String listName) {
-		return this.changeSupport().hasAnyListChangeListeners(listName);
-	}
-
-	/**
-	 * Return whether there are any list change listeners for a specific list.
-	 */
-	public boolean hasNoListChangeListeners(String listName) {
-		return ! this.hasAnyListChangeListeners(listName);
-	}
-
-	/**
-	 * Return whether there are any tree change listeners for a specific tree.
-	 */
-	public boolean hasAnyTreeChangeListeners(String treeName) {
-		return this.changeSupport().hasAnyTreeChangeListeners(treeName);
-	}
-
-	/**
-	 * Return whether there are any tree change listeners for a specific tree.
-	 */
-	public boolean hasNoTreeChangeListeners(String treeName) {
-		return ! this.hasAnyTreeChangeListeners(treeName);
-	}
-
-
-	// ********** convenience methods **********
-
-	/**
-	 * Return whether the values are equal, with the appropriate null checks.
-	 * Convenience method for checking whether an attribute value has changed.
-	 * 
-	 * DO NOT use this to determine whether to fire a change notification,
-	 * ChangeSupport already does that.
-	 */
-	protected final boolean valuesAreEqual(Object value1, Object value2) {
-		return this.changeSupport().valuesAreEqual(value1, value2);
-	}
-	protected final boolean attributeValueHasNotChanged(Object oldValue, Object newValue) {
-		return this.valuesAreEqual(oldValue, newValue);
-	}
-
-
-	/**
-	 * Return whether the values are different, with the appropriate null checks.
-	 * Convenience method for checking whether an attribute value has changed.
-	 * 
-	 * DO NOT use this to determine whether to fire a change notification,
-	 * ChangeSupport already does that.
-	 * 
-	 * For example, after firing the change notification, you can use this method
-	 * to decide if some other, related, piece of state needs to be synchronized
-	 * with the state that just changed.
-	 */
-	protected final boolean valuesAreDifferent(Object value1, Object value2) {
-		return this.changeSupport().valuesAreDifferent(value1, value2);
-	}
-	protected final boolean attributeValueHasChanged(Object oldValue, Object newValue) {
-		return this.valuesAreDifferent(oldValue, newValue);
-	}
-
-
-	// ********** Object overrides **********
-
-	/**
-	 * Although cloning models is usually not a Good Idea,
-	 * we should at least support it properly.
-	 */
-	@Override
-	protected AbstractModel clone() throws CloneNotSupportedException {
-		AbstractModel clone = (AbstractModel) super.clone();
-		clone.postClone();
-		return clone;
-	}
-
-	/**
-	 * Perform any post-clone processing necessary to
-	 * successfully disconnect the clone from the original.
-	 * When this method is called on the clone, the clone
-	 * is a "shallow" copy of the original (i.e. the clone
-	 * shares all its instance variables with the original).
-	 */
-	protected void postClone() {
-		// clear out change support - models do not share listeners
-		this.changeSupport = null;
-	// when you override this method, don't forget to include:
-	//	super.postClone();
-	}
-
-	@Override
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		StringTools.buildSimpleToStringOn(this, sb);
-		sb.append(" (");
-		this.toString(sb);
-		sb.append(')');
-		return sb.toString();
-	}
-
-	/**
-	 * make this public so one model can call a nested model's
-	 * #toString(StringBuffer)
-	 */
-	public void toString(StringBuffer sb) {
-		// subclasses should override this to do something a bit more helpful
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/ChangeEventDispatcher.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/ChangeEventDispatcher.java
deleted file mode 100644
index 68727bf..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/ChangeEventDispatcher.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model;
-
-import org.eclipse.jpt.utility.internal.model.event.CollectionChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.ListChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.PropertyChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.StateChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.TreeChangeEvent;
-import org.eclipse.jpt.utility.internal.model.listener.CollectionChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ListChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.PropertyChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.StateChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.TreeChangeListener;
-
-/**
- * Add yet another level of indirection to change support to allow
- * clients to change how and when listener notification occurs.
- * The primary use would be to dispatch the notification to the
- * AWT event queue, so the UI will be updated in a single thread.
- */
-public interface ChangeEventDispatcher {
-
-	/**
-	 * Notify the specified listener that the source's state changed,
-	 * as described in the specified event.
-	 */
-	void stateChanged(StateChangeListener listener, StateChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound property changed,
-	 * as described in the specified event.
-	 */
-	void propertyChanged(PropertyChangeListener listener, PropertyChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound collection changed,
-	 * as described in the specified event.
-	 */
-	void itemsAdded(CollectionChangeListener listener, CollectionChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound collection changed,
-	 * as described in the specified event.
-	 */
-	void itemsRemoved(CollectionChangeListener listener, CollectionChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound collection changed,
-	 * as described in the specified event.
-	 */
-	void collectionCleared(CollectionChangeListener listener, CollectionChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound collection changed,
-	 * as described in the specified event.
-	 */
-	void collectionChanged(CollectionChangeListener listener, CollectionChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound list changed,
-	 * as described in the specified event.
-	 */
-	void itemsAdded(ListChangeListener listener, ListChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound list changed,
-	 * as described in the specified event.
-	 */
-	void itemsRemoved(ListChangeListener listener, ListChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound list changed,
-	 * as described in the specified event.
-	 */
-	void itemsReplaced(ListChangeListener listener, ListChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound list changed,
-	 * as described in the specified event.
-	 */
-	void itemsMoved(ListChangeListener listener, ListChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound list changed,
-	 * as described in the specified event.
-	 */
-	void listCleared(ListChangeListener listener, ListChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound list changed,
-	 * as described in the specified event.
-	 */
-	void listChanged(ListChangeListener listener, ListChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound tree changed,
-	 * as described in the specified event.
-	 */
-	void nodeAdded(TreeChangeListener listener, TreeChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound tree changed,
-	 * as described in the specified event.
-	 */
-	void nodeRemoved(TreeChangeListener listener, TreeChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound tree changed,
-	 * as described in the specified event.
-	 */
-	void treeCleared(TreeChangeListener listener, TreeChangeEvent event);
-
-	/**
-	 * Notify the specified listener that a bound tree changed,
-	 * as described in the specified event.
-	 */
-	void treeChanged(TreeChangeListener listener, TreeChangeEvent event);
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/ChangeSupport.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/ChangeSupport.java
deleted file mode 100644
index fbef424..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/ChangeSupport.java
+++ /dev/null
@@ -1,2366 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.lang.reflect.Array;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jpt.utility.internal.CollectionTools;
-import org.eclipse.jpt.utility.internal.StringTools;
-import org.eclipse.jpt.utility.internal.model.event.CollectionChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.ListChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.PropertyChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.StateChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.TreeChangeEvent;
-import org.eclipse.jpt.utility.internal.model.listener.ChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.CollectionChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ListChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.PropertyChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.StateChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.TreeChangeListener;
-
-/**
- * Support object that can be used by implementors of the Model interface.
- * It provides for state, property, collection, list, and tree change notifications to
- * listeners.
- * 
- * NB: There is lots of copy-n-paste code in this class. Nearly all of this duplication
- * is an effort to prevent the unnecessary creation of new objects (typically event
- * objects). Since many events are fired when there are no listeners, we postpone
- * the creation of event objects until we know we have interested listeners.
- * Most methods have the "non-duplicated" version of the method body commented
- * out at the top of the current method body.
- * The hope was that this class would prove to be fairly static and the duplicated
- * code would not prove onerous; but that has not proven to be
- * the case, as we have added support for "state" changes, "dirty" notification,
- * and custom "notifiers", with more to come, I'm sure....  ~bjv
- * 
- * NB2: This class will check to see if, during the firing of events, a listener
- * on the original list of listeners has been removed from the mast list of
- * listeners *before* it is notified. If the listener has been removed
- * "concurrently" it will *not* be notified. (See the code that uses the
- * 'stillListening' local boolean flag.)
- * 
- * NB3: This class is serializable, but it will only write out listeners that
- * are also serializable while silently leaving behind listeners that are not.
- */
-public class ChangeSupport
-	implements Serializable
-{
-
-	/** The object to be provided as the "source" for any generated events. */
-	protected final Object source;
-
-	/** Maps a listener class to a collection of "generic" listeners for that class. */
-	transient private GenericListenerList[] genericListeners = EMPTY_GENERIC_LISTENERS;
-		private static final GenericListenerList[] EMPTY_GENERIC_LISTENERS = new GenericListenerList[0];
-
-	/** Maps aspect names to child change support objects. */
-	private AspectChild[] aspectChildren = EMPTY_ASPECT_CHILDREN;
-		private static final AspectChild[] EMPTY_ASPECT_CHILDREN = new AspectChild[0];
-
-	private static final long serialVersionUID = 1L;
-
-
-	// ********** constructor **********
-
-	/**
-	 * Construct support for the specified source of change events.
-	 * The source cannot be null.
-	 */
-	public ChangeSupport(Object source) {
-		super();
-		if (source == null) {
-			throw new NullPointerException();
-		}
-		this.source = source;
-	}
-
-
-	// ********** internal behavior **********
-
-	/**
-	 * Add a listener that listens to all events appropriate to that listener,
-	 * regardless of the aspect name associated with that event.
-	 * The listener cannot be null.
-	 */
-	protected <T extends ChangeListener> void addListener(Class<T> listenerClass, T listener) {
-		if (listener == null) {
-			throw new NullPointerException();		// better sooner than later
-		}
-		synchronized (this) {
-			GenericListenerList gll = this.genericListenerList(listenerClass);
-			if (gll == null) {
-				this.addGenericListenerList(listenerClass, listener);
-			} else {
-				gll.addListener(listener);
-			}
-		}
-	}
-
-	/**
-	 * Return the generic listener list for the specified listener class.
-	 * Return null if the list is not present.
-	 */
-	protected GenericListenerList genericListenerList(Class<? extends ChangeListener> listenerClass) {
-		for (GenericListenerList gll : this.genericListeners) {
-			if (gll.listenerClass == listenerClass) {
-				return gll;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Add the generic listener list for the specified listener class.
-	 * Return the newly-built generic listener list.
-	 */
-	protected <T extends ChangeListener> GenericListenerList addGenericListenerList(Class<T> listenerClass, T listener) {
-		GenericListenerList gll = new GenericListenerList(listenerClass, listener);
-		this.genericListeners = CollectionTools.add(this.genericListeners, gll);
-		return gll;
-	}
-
-	/**
-	 * Adds a listener that listens to all events appropriate to that listener,
-	 * and only to those events carrying the aspect name specified.
-	 * The aspect name cannot be null and the listener cannot be null.
-	 */
-	protected <T extends ChangeListener> void addListener(String aspectName, Class<T> listenerClass, T listener) {
-		if ((aspectName == null) || (listener == null)) {
-			throw new NullPointerException();		// better sooner than later
-		}
-		synchronized (this) {
-			ChangeSupport child = this.child(aspectName);
-			if (child == null) {
-				child = this.addChild(aspectName);
-			}
-			child.addListener(listenerClass, listener);
-		}
-	}
-
-	/**
-	 * Return the child change support for the specified aspect name.
-	 * Return null if the aspect name is null or the child is not present.
-	 */
-	protected ChangeSupport child(String aspectName) {
-		// put in a null check to simplify calling code
-		if (aspectName == null) {
-			return null;
-		}
-		for (AspectChild aspectChild : this.aspectChildren) {
-			if (aspectChild.aspectName.equals(aspectName)) {
-				return aspectChild.child;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Add the child change support for the specified aspect name.
-	 * Return the newly-built child change support.
-	 */
-	protected ChangeSupport addChild(String aspectName) {
-		ChangeSupport child = this.buildChildChangeSupport();
-		this.aspectChildren = CollectionTools.add(this.aspectChildren, new AspectChild(aspectName, child));
-		return child;
-	}
-
-	/**
-	 * Build and return a child change support to hold aspect-specific listeners.
-	 */
-	protected ChangeSupport buildChildChangeSupport() {
-		return new ChangeSupport(this.source);
-	}
-
-	/**
-	 * Removes a listener that has been registered for all events appropriate to that listener.
-	 */
-	protected <T extends ChangeListener> void removeListener(Class<T> listenerClass, T listener) {
-		synchronized (this) {
-			GenericListenerList gll = this.genericListenerList(listenerClass);
-			if (gll == null) {
-				throw new IllegalArgumentException("listener not registered");
-			}
-			if ( ! gll.removeListener(listener)) {  // leave the GLL, even if it is empty?
-				throw new IllegalArgumentException("listener not registered");
-			}
-		}
-	}
-
-	/**
-	 * Removes a listener that has been registered for appropriate
-	 * events carrying the specified aspect name.
-	 */
-	protected <T extends ChangeListener> void removeListener(String aspectName, Class<T> listenerClass, T listener) {
-		synchronized (this) {
-			ChangeSupport child = this.child(aspectName);
-			if (child == null) {
-				throw new IllegalArgumentException("listener not registered");
-			}
-			child.removeListener(listenerClass, listener);  // leave the child, even if it is empty?
-		}
-	}
-
-
-	// ********** internal queries **********
-
-	/**
-	 * Return a dispatcher that will forward change notifications to the listeners.
-	 */
-	protected ChangeEventDispatcher dispatcher() {
-		return DefaultChangeEventDispatcher.instance();
-	}
-
-	/**
-	 * Return the listeners for the specified listener class.
-	 * Return null if there are no listeners.
-	 */
-	protected ChangeListener[] listeners(Class<? extends ChangeListener> listenerClass) {
-		GenericListenerList gll = this.genericListenerList(listenerClass);
-		return (gll == null) ? null : gll.listeners;
-	}
-
-	/**
-	 * Return whether there are any "generic" listeners for the specified
-	 * listener class.
-	 */
-	protected synchronized <T extends ChangeListener> boolean hasAnyListeners(Class<T> listenerClass) {
-		GenericListenerList gll = this.genericListenerList(listenerClass);
-		return (gll != null) && gll.hasListeners();
-	}
-
-	/**
-	 * Return whether there are any listeners for the specified
-	 * listener class and aspect name.
-	 */
-	protected synchronized boolean hasAnyListeners(Class<? extends ChangeListener> listenerClass, String aspectName) {
-		if (this.hasAnyListeners(listenerClass)) {
-			return true;		// there's a "generic" listener
-		}
-		ChangeSupport child = this.child(aspectName);
-		return (child != null) &&
-			child.hasAnyListeners(listenerClass);
-	}
-
-
-	// ********** behavior **********
-
-	/**
-	 * The specified aspect of the source has changed;
-	 * override this method to perform things like setting a
-	 * dirty flag or validating the source's state.
-	 * The aspect ID will be null if a "state change" occurred.
-	 */
-	protected void sourceChanged(String aspectName) {
-		// the default is to do nothing
-	}
-
-
-	// ********** state change support **********
-
-	private static final Class<StateChangeListener> STATE_CHANGE_LISTENER_CLASS = StateChangeListener.class;
-
-	/**
-	 * Add a state change listener.
-	 */
-	public void addStateChangeListener(StateChangeListener listener) {
-		this.addListener(STATE_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Remove a state change listener.
-	 */
-	public void removeStateChangeListener(StateChangeListener listener) {
-		this.removeListener(STATE_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Return whether there are any state change listeners.
-	 */
-	public boolean hasAnyStateChangeListeners() {
-		return this.hasAnyListeners(STATE_CHANGE_LISTENER_CLASS);
-	}
-
-	private StateChangeListener[] stateChangeListeners() {
-		return (StateChangeListener[]) this.listeners(STATE_CHANGE_LISTENER_CLASS);
-	}
-
-	/**
-	 * Fire the specified state change event to any registered listeners.
-	 */
-	public void fireStateChanged(StateChangeEvent event) {
-
-		StateChangeListener[] stateChangeListeners = null;
-		StateChangeListener[] targets = null;
-
-		synchronized (this) {
-			stateChangeListeners = this.stateChangeListeners();
-			if (stateChangeListeners != null) {
-				targets = stateChangeListeners.clone();
-			}
-		}
-
-		if (targets != null) {
-			for (StateChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.stateChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().stateChanged(target, event);
-				}
-			}
-		}
-
-		this.sourceChanged(null);
-	}
-
-	/**
-	 * Report a generic state change event to any registered state change listeners.
-	 */
-	public void fireStateChanged() {
-//		this.fireStateChange(new StateChangeEvent(this.source));
-
-		StateChangeListener[] stateChangeListeners = null;
-		StateChangeListener[] targets = null;
-
-		synchronized (this) {
-			stateChangeListeners = this.stateChangeListeners();
-			if (stateChangeListeners != null) {
-				targets = stateChangeListeners.clone();
-			}
-		}
-
-		if (targets != null) {
-			StateChangeEvent event = null;
-			for (StateChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.stateChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new StateChangeEvent(this.source);
-					}
-					this.dispatcher().stateChanged(target, event);
-				}
-			}
-		}
-
-		this.sourceChanged(null);
-	}
-
-
-	// ********** property change support **********
-
-	private static final Class<PropertyChangeListener> PROPERTY_CHANGE_LISTENER_CLASS = PropertyChangeListener.class;
-
-	/**
-	 * Return whether the values are equal, with the appropriate null checks.
-	 * Convenience method for checking whether an attribute value has changed.
-	 */
-	public boolean valuesAreEqual(Object value1, Object value2) {
-		if ((value1 == null) && (value2 == null)) {
-			return true;	// both are null
-		}
-		if ((value1 == null) || (value2 == null)) {
-			return false;	// one is null but the other is not
-		}
-		return value1.equals(value2);
-	}
-
-	/**
-	 * Return whether the values are different, with the appropriate null checks.
-	 * Convenience method for checking whether an attribute value has changed.
-	 */
-	public boolean valuesAreDifferent(Object value1, Object value2) {
-		return ! this.valuesAreEqual(value1, value2);
-	}
-
-	/**
-	 * Add a property change listener that is registered for all properties.
-	 */
-	public void addPropertyChangeListener(PropertyChangeListener listener) {
-		this.addListener(PROPERTY_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Add a property change listener for the specified property. The listener
-	 * will be notified only for changes to the specified property.
-	 */
-	public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
-		this.addListener(propertyName, PROPERTY_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Remove a property change listener that was registered for all properties.
-	 */
-	public void removePropertyChangeListener(PropertyChangeListener listener) {
-		this.removeListener(PROPERTY_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Remove a property change listener that was registered for a specific property.
-	 */
-	public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
-		this.removeListener(propertyName, PROPERTY_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Return whether there are any property change listeners that will
-	 * be notified when the specified property has changed.
-	 */
-	public boolean hasAnyPropertyChangeListeners(String propertyName) {
-		return this.hasAnyListeners(PROPERTY_CHANGE_LISTENER_CLASS, propertyName);
-	}
-
-	/**
-	 * Return whether there are any property change listeners that will
-	 * be notified when any property has changed.
-	 */
-	public boolean hasAnyPropertyChangeListeners() {
-		return this.hasAnyListeners(PROPERTY_CHANGE_LISTENER_CLASS);
-	}
-
-	private PropertyChangeListener[] propertyChangeListeners() {
-		return (PropertyChangeListener[]) this.listeners(PROPERTY_CHANGE_LISTENER_CLASS);
-	}
-
-	/**
-	 * Fire the specified property change event to any registered listeners.
-	 * No event is fired if the given event's old and new values are the same;
-	 * this includes when both values are null. Use a state change event
-	 * for general purpose notification of changes.
-	 */
-	public void firePropertyChanged(PropertyChangeEvent event) {
-		if (this.valuesAreEqual(event.oldValue(), event.newValue())) {
-			return; 
-		}
-
-		String propertyName = event.propertyName();
-
-		PropertyChangeListener[] propertyChangeListeners = null;
-		PropertyChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			propertyChangeListeners = this.propertyChangeListeners();
-			if (propertyChangeListeners != null) {
-				targets = propertyChangeListeners.clone();
-			}
-			child = this.child(propertyName);
-		}
-
-		if (targets != null) {
-			for (PropertyChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.propertyChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().propertyChanged(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.firePropertyChanged(event);
-		}
-
-		this.sourceChanged(propertyName);
-	}
-
-	/**
-	 * Report a bound property update to any registered property change listeners.
-	 * No event is fired if the given old and new values are the same;
-	 * this includes when both values are null. Use a state change event
-	 * for general purpose notification of changes.
-	 */
-	public void firePropertyChanged(String propertyName, Object oldValue, Object newValue) {
-//		this.firePropertyChanged(new PropertyChangeEvent(this.source, propertyName, oldValue, newValue));
-		if (this.valuesAreEqual(oldValue, newValue)) {
-			return;
-		}
-
-		PropertyChangeListener[] propertyChangeListeners = null;
-		PropertyChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			propertyChangeListeners = this.propertyChangeListeners();
-			if (propertyChangeListeners != null) {
-				targets = propertyChangeListeners.clone();
-			}
-			child = this.child(propertyName);
-		}
-
-		PropertyChangeEvent event = null;
-
-		if (targets != null) {
-			for (PropertyChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.propertyChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new PropertyChangeEvent(this.source, propertyName, oldValue, newValue);
-					}
-					this.dispatcher().propertyChanged(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.firePropertyChanged(propertyName, oldValue, newValue);
-			} else {
-				child.firePropertyChanged(event);
-			}
-		}
-
-		this.sourceChanged(propertyName);
-	}
-
-	/**
-	 * Report an int bound property update to any registered listeners.
-	 * No event is fired if old and new are equal.
-	 * <p>
-	 * This is merely a convenience wrapper around the more general
-	 * firePropertyChange method that takes Object values.
-	 */
-	public void firePropertyChanged(String propertyName, int oldValue, int newValue) {
-//		this.firePropertyChanged(propertyName, new Integer(oldValue), new Integer(newValue));
-		if (oldValue == newValue) {
-			return;
-		}
-
-		PropertyChangeListener[] propertyChangeListeners = null;
-		PropertyChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			propertyChangeListeners = this.propertyChangeListeners();
-			if (propertyChangeListeners != null) {
-				targets = propertyChangeListeners.clone();
-			}
-			child = this.child(propertyName);
-		}
-
-		PropertyChangeEvent event = null;
-
-		if (targets != null) {
-			for (PropertyChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.propertyChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new PropertyChangeEvent(this.source, propertyName, new Integer(oldValue), new Integer(newValue));
-					}
-					this.dispatcher().propertyChanged(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.firePropertyChanged(propertyName, oldValue, newValue);
-			} else {
-				child.firePropertyChanged(event);
-			}
-		}
-
-		this.sourceChanged(propertyName);
-	}
-
-	/**
-	 * Report a boolean bound property update to any registered listeners.
-	 * No event is fired if old and new are equal.
-	 * <p>
-	 * This is merely a convenience wrapper around the more general
-	 * firePropertyChange method that takes Object values.
-	 */
-	public void firePropertyChanged(String propertyName, boolean oldValue, boolean newValue) {
-//		this.firePropertyChanged(propertyName, Boolean.valueOf(oldValue), Boolean.valueOf(newValue));
-		if (oldValue == newValue) {
-			return;
-		}
-
-		PropertyChangeListener[] propertyChangeListeners = null;
-		PropertyChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			propertyChangeListeners = this.propertyChangeListeners();
-			if (propertyChangeListeners != null) {
-				targets = propertyChangeListeners.clone();
-			}
-			child = this.child(propertyName);
-		}
-
-		PropertyChangeEvent event = null;
-
-		if (targets != null) {
-			for (PropertyChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.propertyChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new PropertyChangeEvent(this.source, propertyName, Boolean.valueOf(oldValue), Boolean.valueOf(newValue));
-					}
-					this.dispatcher().propertyChanged(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.firePropertyChanged(propertyName, oldValue, newValue);
-			} else {
-				child.firePropertyChanged(event);
-			}
-		}
-
-		this.sourceChanged(propertyName);
-	}
-
-
-	// ********** collection change support **********
-
-	private static final Class<CollectionChangeListener> COLLECTION_CHANGE_LISTENER_CLASS = CollectionChangeListener.class;
-
-	/**
-	 * Add a collection change listener that is registered for all collections.
-	 */
-	public void addCollectionChangeListener(CollectionChangeListener listener) {
-		this.addListener(COLLECTION_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Add a collection change listener for the specified collection. The listener
-	 * will be notified only for changes to the specified collection.
-	 */
-	public void addCollectionChangeListener(String collectionName, CollectionChangeListener listener) {
-		this.addListener(collectionName, COLLECTION_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Remove a collection change listener that was registered for all collections.
-	 */
-	public void removeCollectionChangeListener(CollectionChangeListener listener) {
-		this.removeListener(COLLECTION_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Remove a collection change listener that was registered for a specific collection.
-	 */
-	public void removeCollectionChangeListener(String collectionName, CollectionChangeListener listener) {
-		this.removeListener(collectionName, COLLECTION_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Return whether there are any collection change listeners that will
-	 * be notified when the specified collection has changed.
-	 */
-	public boolean hasAnyCollectionChangeListeners(String collectionName) {
-		return this.hasAnyListeners(COLLECTION_CHANGE_LISTENER_CLASS, collectionName);
-	}
-
-	/**
-	 * Return whether there are any collection change listeners that will
-	 * be notified when any collection has changed.
-	 */
-	public boolean hasAnyCollectionChangeListeners() {
-		return this.hasAnyListeners(COLLECTION_CHANGE_LISTENER_CLASS);
-	}
-
-	private CollectionChangeListener[] collectionChangeListeners() {
-		return (CollectionChangeListener[]) this.listeners(COLLECTION_CHANGE_LISTENER_CLASS);
-	}
-
-	/**
-	 * Report a bound collection update to any registered listeners.
-	 */
-	public void fireItemsAdded(CollectionChangeEvent event) {
-		if (event.itemsSize() == 0) {
-			return;
-		}
-
-		String collectionName = event.collectionName();
-
-		CollectionChangeListener[] collectionChangeListeners = null;
-		CollectionChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			collectionChangeListeners = this.collectionChangeListeners();
-			if (collectionChangeListeners != null) {
-				targets = collectionChangeListeners.clone();
-			}
-			child = this.child(collectionName);
-		}
-
-		if (targets != null) {
-			for (CollectionChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.collectionChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().itemsAdded(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.fireItemsAdded(event);
-		}
-
-		this.sourceChanged(collectionName);
-	}
-
-	/**
-	 * Report a bound collection update to any registered listeners.
-	 */
-	public void fireItemsAdded(String collectionName, Collection<?> addedItems) {
-//		this.fireItemsAdded(new CollectionChangeEvent(this.source, collectionName, addedItems));
-		if (addedItems.size() == 0) {
-			return;
-		}
-
-		CollectionChangeListener[] collectionChangeListeners = null;
-		CollectionChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			collectionChangeListeners = this.collectionChangeListeners();
-			if (collectionChangeListeners != null) {
-				targets = collectionChangeListeners.clone();
-			}
-			child = this.child(collectionName);
-		}
-
-		CollectionChangeEvent event = null;
-
-		if (targets != null) {
-			for (CollectionChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.collectionChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new CollectionChangeEvent(this.source, collectionName, addedItems);
-					}
-					this.dispatcher().itemsAdded(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireItemsAdded(collectionName, addedItems);
-			} else {
-				child.fireItemsAdded(event);
-			}
-		}
-
-		this.sourceChanged(collectionName);
-	}
-
-	/**
-	 * Report a bound collection update to any registered listeners.
-	 */
-	public void fireItemAdded(String collectionName, Object addedItem) {
-//		this.fireItemsAdded(collectionName, Collections.singleton(addedItem));
-
-		CollectionChangeListener[] collectionChangeListeners = null;
-		CollectionChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			collectionChangeListeners = this.collectionChangeListeners();
-			if (collectionChangeListeners != null) {
-				targets = collectionChangeListeners.clone();
-			}
-			child = this.child(collectionName);
-		}
-
-		CollectionChangeEvent event = null;
-
-		if (targets != null) {
-			for (CollectionChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.collectionChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new CollectionChangeEvent(this.source, collectionName, Collections.singleton(addedItem));
-					}
-					this.dispatcher().itemsAdded(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireItemAdded(collectionName, addedItem);
-			} else {
-				child.fireItemsAdded(event);
-			}
-		}
-
-		this.sourceChanged(collectionName);
-	}
-
-	/**
-	 * Report a bound collection update to any registered listeners.
-	 */
-	public void fireItemsRemoved(CollectionChangeEvent event) {
-		if (event.itemsSize() == 0) {
-			return;
-		}
-
-		String collectionName = event.collectionName();
-
-		CollectionChangeListener[] collectionChangeListeners = null;
-		CollectionChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			collectionChangeListeners = this.collectionChangeListeners();
-			if (collectionChangeListeners != null) {
-				targets = collectionChangeListeners.clone();
-			}
-			child = this.child(collectionName);
-		}
-
-		if (targets != null) {
-			for (CollectionChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.collectionChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().itemsRemoved(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.fireItemsRemoved(event);
-		}
-
-		this.sourceChanged(collectionName);
-	}
-
-	/**
-	 * Report a bound collection update to any registered listeners.
-	 */
-	public void fireItemsRemoved(String collectionName, Collection<?> removedItems) {
-//		this.fireItemsRemoved(new CollectionChangeEvent(this.source, collectionName, removedItems));
-		if (removedItems.size() == 0) {
-			return;
-		}
-
-		CollectionChangeListener[] collectionChangeListeners = null;
-		CollectionChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			collectionChangeListeners = this.collectionChangeListeners();
-			if (collectionChangeListeners != null) {
-				targets = collectionChangeListeners.clone();
-			}
-			child = this.child(collectionName);
-		}
-
-		CollectionChangeEvent event = null;
-
-		if (targets != null) {
-			for (CollectionChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.collectionChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new CollectionChangeEvent(this.source, collectionName, removedItems);
-					}
-					this.dispatcher().itemsRemoved(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireItemsRemoved(collectionName, removedItems);
-			} else {
-				child.fireItemsRemoved(event);
-			}
-		}
-
-		this.sourceChanged(collectionName);
-	}
-
-	/**
-	 * Report a bound collection update to any registered listeners.
-	 */
-	public void fireItemRemoved(String collectionName, Object removedItem) {
-//		this.fireItemsRemoved(collectionName, Collections.singleton(removedItem));
-
-		CollectionChangeListener[] collectionChangeListeners = null;
-		CollectionChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			collectionChangeListeners = this.collectionChangeListeners();
-			if (collectionChangeListeners != null) {
-				targets = collectionChangeListeners.clone();
-			}
-			child = this.child(collectionName);
-		}
-
-		CollectionChangeEvent event = null;
-
-		if (targets != null) {
-			for (CollectionChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.collectionChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new CollectionChangeEvent(this.source, collectionName, Collections.singleton(removedItem));
-					}
-					this.dispatcher().itemsRemoved(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireItemRemoved(collectionName, removedItem);
-			} else {
-				child.fireItemsRemoved(event);
-			}
-		}
-
-		this.sourceChanged(collectionName);
-	}
-
-	/**
-	 * Report a bound collection update to any registered listeners.
-	 */
-	public void fireCollectionCleared(CollectionChangeEvent event) {
-		String collectionName = event.collectionName();
-
-		CollectionChangeListener[] collectionChangeListeners = null;
-		CollectionChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			collectionChangeListeners = this.collectionChangeListeners();
-			if (collectionChangeListeners != null) {
-				targets = collectionChangeListeners.clone();
-			}
-			child = this.child(collectionName);
-		}
-
-		if (targets != null) {
-			for (CollectionChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.collectionChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().collectionCleared(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.fireCollectionCleared(event);
-		}
-
-		this.sourceChanged(collectionName);
-	}
-
-	/**
-	 * Report a bound collection update to any registered listeners.
-	 */
-	public void fireCollectionCleared(String collectionName) {
-//		this.fireCollectionCleared(new CollectionChangeEvent(this.source, collectionName));
-
-		CollectionChangeListener[] collectionChangeListeners = null;
-		CollectionChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			collectionChangeListeners = this.collectionChangeListeners();
-			if (collectionChangeListeners != null) {
-				targets = collectionChangeListeners.clone();
-			}
-			child = this.child(collectionName);
-		}
-
-		CollectionChangeEvent event = null;
-
-		if (targets != null) {
-			for (CollectionChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.collectionChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new CollectionChangeEvent(this.source, collectionName);
-					}
-					this.dispatcher().collectionCleared(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireCollectionCleared(collectionName);
-			} else {
-				child.fireCollectionCleared(event);
-			}
-		}
-
-		this.sourceChanged(collectionName);
-	}
-
-	/**
-	 * Report a bound collection update to any registered listeners.
-	 */
-	public void fireCollectionChanged(CollectionChangeEvent event) {
-		String collectionName = event.collectionName();
-
-		CollectionChangeListener[] collectionChangeListeners = null;
-		CollectionChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			collectionChangeListeners = this.collectionChangeListeners();
-			if (collectionChangeListeners != null) {
-				targets = collectionChangeListeners.clone();
-			}
-			child = this.child(collectionName);
-		}
-
-		if (targets != null) {
-			for (CollectionChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.collectionChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().collectionChanged(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.fireCollectionChanged(event);
-		}
-
-		this.sourceChanged(collectionName);
-	}
-
-	/**
-	 * Report a bound collection update to any registered listeners.
-	 */
-	public void fireCollectionChanged(String collectionName) {
-//		this.fireCollectionChanged(new CollectionChangeEvent(this.source, collectionName));
-
-		CollectionChangeListener[] collectionChangeListeners = null;
-		CollectionChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			collectionChangeListeners = this.collectionChangeListeners();
-			if (collectionChangeListeners != null) {
-				targets = collectionChangeListeners.clone();
-			}
-			child = this.child(collectionName);
-		}
-
-		CollectionChangeEvent event = null;
-
-		if (targets != null) {
-			for (CollectionChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.collectionChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new CollectionChangeEvent(this.source, collectionName);
-					}
-					this.dispatcher().collectionChanged(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireCollectionChanged(collectionName);
-			} else {
-				child.fireCollectionChanged(event);
-			}
-		}
-
-		this.sourceChanged(collectionName);
-	}
-
-
-	// ********** list change support **********
-
-	private static final Class<ListChangeListener> LIST_CHANGE_LISTENER_CLASS = ListChangeListener.class;
-
-	/**
-	 * Add a list change listener that is registered for all lists.
-	 */
-	public void addListChangeListener(ListChangeListener listener) {
-		this.addListener(LIST_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Add a list change listener for the specified list. The listener
-	 * will be notified only for changes to the specified list.
-	 */
-	public void addListChangeListener(String listName, ListChangeListener listener) {
-		this.addListener(listName, LIST_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Remove a list change listener that was registered for all lists.
-	 */
-	public void removeListChangeListener(ListChangeListener listener) {
-		this.removeListener(LIST_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Remove a list change listener that was registered for a specific list.
-	 */
-	public void removeListChangeListener(String listName, ListChangeListener listener) {
-		this.removeListener(listName, LIST_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Return whether there are any list change listeners that will
-	 * be notified when the specified list has changed.
-	 */
-	public boolean hasAnyListChangeListeners(String listName) {
-		return this.hasAnyListeners(LIST_CHANGE_LISTENER_CLASS, listName);
-	}
-
-	/**
-	 * Return whether there are any list change listeners that will
-	 * be notified when any list has changed.
-	 */
-	public boolean hasAnyListChangeListeners() {
-		return this.hasAnyListeners(LIST_CHANGE_LISTENER_CLASS);
-	}
-
-	private ListChangeListener[] listChangeListeners() {
-		return (ListChangeListener[]) this.listeners(LIST_CHANGE_LISTENER_CLASS);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireItemsAdded(ListChangeEvent event) {
-		if (event.itemsSize() == 0) {
-			return;
-		}
-
-		String listName = event.listName();
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().itemsAdded(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.fireItemsAdded(event);
-		}
-
-		this.sourceChanged(listName);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireItemsAdded(String listName, int index, List<?> addedItems) {
-//		this.fireItemsAdded(new ListChangeEvent(this.source, listName, index, addedItems));
-		if (addedItems.size() == 0) {
-			return;
-		}
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		ListChangeEvent event = null;
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new ListChangeEvent(this.source, listName, index, addedItems);
-					}
-					this.dispatcher().itemsAdded(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireItemsAdded(listName, index, addedItems);
-			} else {
-				child.fireItemsAdded(event);
-			}
-		}
-
-		this.sourceChanged(listName);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireItemAdded(String listName, int index, Object addedItem) {
-//		this.fireItemsAdded(listName, index, Collections.singletonList(addedItem));
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		ListChangeEvent event = null;
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new ListChangeEvent(this.source, listName, index, Collections.singletonList(addedItem));
-					}
-					this.dispatcher().itemsAdded(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireItemAdded(listName, index, addedItem);
-			} else {
-				child.fireItemsAdded(event);
-			}
-		}
-
-		this.sourceChanged(listName);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireItemsRemoved(ListChangeEvent event) {
-		if (event.itemsSize() == 0) {
-			return;
-		}
-
-		String listName = event.listName();
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().itemsRemoved(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.fireItemsRemoved(event);
-		}
-
-		this.sourceChanged(listName);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireItemsRemoved(String listName, int index, List<?> removedItems) {
-//		this.fireItemsRemoved(new ListChangeEvent(this.source, listName, index, removedItems));
-		if (removedItems.size() == 0) {
-			return;
-		}
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		ListChangeEvent event = null;
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new ListChangeEvent(this.source, listName, index, removedItems);
-					}
-					this.dispatcher().itemsRemoved(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireItemsRemoved(listName, index, removedItems);
-			} else {
-				child.fireItemsRemoved(event);
-			}
-		}
-
-		this.sourceChanged(listName);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireItemRemoved(String listName, int index, Object removedItem) {
-//		this.fireItemsRemoved(listName, index, Collections.singletonList(removedItem));
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		ListChangeEvent event = null;
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new ListChangeEvent(this.source, listName, index, Collections.singletonList(removedItem));
-					}
-					this.dispatcher().itemsRemoved(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireItemRemoved(listName, index, removedItem);
-			} else {
-				child.fireItemsRemoved(event);
-			}
-		}
-
-		this.sourceChanged(listName);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireItemsReplaced(ListChangeEvent event) {
-		if (event.itemsSize() == 0) {
-			return;
-		}
-
-		String listName = event.listName();
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().itemsReplaced(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.fireItemsReplaced(event);
-		}
-
-		this.sourceChanged(listName);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireItemsReplaced(String listName, int index, List<?> newItems, List<?> replacedItems) {
-//		this.fireItemsReplaced(new ListChangeEvent(this.source, listName, index, newItems, replacedItems));
-		if (newItems.size() == 0) {
-			return;
-		}
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		ListChangeEvent event = null;
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new ListChangeEvent(this.source, listName, index, newItems, replacedItems);
-					}
-					this.dispatcher().itemsReplaced(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireItemsReplaced(listName, index, newItems, replacedItems);
-			} else {
-				child.fireItemsReplaced(event);
-			}
-		}
-
-		this.sourceChanged(listName);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireItemReplaced(String listName, int index, Object newItem, Object replacedItem) {
-//		this.fireItemsReplaced(listName, index, Collections.singletonList(newItem), Collections.singletonList(replacedItem));
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		ListChangeEvent event = null;
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new ListChangeEvent(this.source, listName, index, Collections.singletonList(newItem), Collections.singletonList(replacedItem));
-					}
-					this.dispatcher().itemsReplaced(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireItemReplaced(listName, index, newItem, replacedItem);
-			} else {
-				child.fireItemsReplaced(event);
-			}
-		}
-
-		this.sourceChanged(listName);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireItemsMoved(ListChangeEvent event) {
-		if (event.targetIndex() == event.sourceIndex()) {
-			return;
-		}
-
-		String listName = event.listName();
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().itemsMoved(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.fireItemsMoved(event);
-		}
-
-		this.sourceChanged(listName);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireItemsMoved(String listName, int targetIndex, int sourceIndex, int length) {
-//		this.fireItemsMoved(new ListChangeEvent(this.source, listName, targetIndex, sourceIndex, length));
-		if (targetIndex == sourceIndex) {
-			return;
-		}
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		ListChangeEvent event = null;
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new ListChangeEvent(this.source, listName, targetIndex, sourceIndex, length);
-					}
-					this.dispatcher().itemsMoved(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireItemsMoved(listName, targetIndex, sourceIndex, length);
-			} else {
-				child.fireItemsMoved(event);
-			}
-		}
-
-		this.sourceChanged(listName);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireItemMoved(String listName, int targetIndex, int sourceIndex) {
-		this.fireItemsMoved(listName, targetIndex, sourceIndex, 1);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireListCleared(ListChangeEvent event) {
-		String listName = event.listName();
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().listCleared(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.fireListCleared(event);
-		}
-
-		this.sourceChanged(listName);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireListCleared(String listName) {
-//		this.fireListCleared(new ListChangeEvent(this.source, listName));
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		ListChangeEvent event = null;
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new ListChangeEvent(this.source, listName);
-					}
-					this.dispatcher().listCleared(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireListCleared(listName);
-			} else {
-				child.fireListCleared(event);
-			}
-		}
-
-		this.sourceChanged(listName);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireListChanged(ListChangeEvent event) {
-		String listName = event.listName();
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().listChanged(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.fireListChanged(event);
-		}
-
-		this.sourceChanged(listName);
-	}
-
-	/**
-	 * Report a bound list update to any registered listeners.
-	 */
-	public void fireListChanged(String listName) {
-//		this.fireListChanged(new ListChangeEvent(this.source, listName));
-
-		ListChangeListener[] listChangeListeners = null;
-		ListChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			listChangeListeners = this.listChangeListeners();
-			if (listChangeListeners != null) {
-				targets = listChangeListeners.clone();
-			}
-			child = this.child(listName);
-		}
-
-		ListChangeEvent event = null;
-
-		if (targets != null) {
-			for (ListChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.listChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new ListChangeEvent(this.source, listName);
-					}
-					this.dispatcher().listChanged(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireListChanged(listName);
-			} else {
-				child.fireListChanged(event);
-			}
-		}
-
-		this.sourceChanged(listName);
-	}
-
-
-	// ********** tree change support **********
-
-	private static final Class<TreeChangeListener> TREE_CHANGE_LISTENER_CLASS = TreeChangeListener.class;
-	private static final Object[] EMPTY_TREE_PATH = new Object[0];
-
-	/**
-	 * Add a tree change listener that is registered for all trees.
-	 */
-	public void addTreeChangeListener(TreeChangeListener listener) {
-		this.addListener(TREE_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Add a tree change listener for the specified tree. The listener
-	 * will be notified only for changes to the specified tree.
-	 */
-	public void addTreeChangeListener(String treeName, TreeChangeListener listener) {
-		this.addListener(treeName, TREE_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Remove a tree change listener that was registered for all tree.
-	 */
-	public void removeTreeChangeListener(TreeChangeListener listener) {
-		this.removeListener(TREE_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Remove a tree change listener that was registered for a specific tree.
-	 */
-	public void removeTreeChangeListener(String treeName, TreeChangeListener listener) {
-		this.removeListener(treeName, TREE_CHANGE_LISTENER_CLASS, listener);
-	}
-
-	/**
-	 * Return whether there are any tree change listeners that will
-	 * be notified when the specified tree has changed.
-	 */
-	public boolean hasAnyTreeChangeListeners(String treeName) {
-		return this.hasAnyListeners(TREE_CHANGE_LISTENER_CLASS, treeName);
-	}
-
-	/**
-	 * Return whether there are any tree change listeners that will
-	 * be notified when any tree has changed.
-	 */
-	public boolean hasAnyTreeChangeListeners() {
-		return this.hasAnyListeners(TREE_CHANGE_LISTENER_CLASS);
-	}
-
-	private TreeChangeListener[] treeChangeListeners() {
-		return (TreeChangeListener[]) this.listeners(TREE_CHANGE_LISTENER_CLASS);
-	}
-
-	/**
-	 * Report a bound tree update to any registered listeners.
-	 */
-	public void fireNodeAdded(TreeChangeEvent event) {
-		String treeName = event.treeName();
-
-		TreeChangeListener[] treeChangeListeners = null;
-		TreeChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			treeChangeListeners = this.treeChangeListeners();
-			if (treeChangeListeners != null) {
-				targets = treeChangeListeners.clone();
-			}
-			child = this.child(treeName);
-		}
-
-		if (targets != null) {
-			for (TreeChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.treeChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().nodeAdded(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.fireNodeAdded(event);
-		}
-
-		this.sourceChanged(treeName);
-	}
-
-	/**
-	 * Report a bound tree update to any registered listeners.
-	 */
-	public void fireNodeAdded(String treeName, Object[] path) {
-//		this.fireNodeAdded(new TreeChangeEvent(this.source, treeName, path));
-
-		TreeChangeListener[] treeChangeListeners = null;
-		TreeChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			treeChangeListeners = this.treeChangeListeners();
-			if (treeChangeListeners != null) {
-				targets = treeChangeListeners.clone();
-			}
-			child = this.child(treeName);
-		}
-
-		TreeChangeEvent event = null;
-
-		if (targets != null) {
-			for (TreeChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.treeChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new TreeChangeEvent(this.source, treeName, path);
-					}
-					this.dispatcher().nodeAdded(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireNodeAdded(treeName, path);
-			} else {
-				child.fireNodeAdded(event);
-			}
-		}
-
-		this.sourceChanged(treeName);
-	}
-
-	/**
-	 * Report a bound tree update to any registered listeners.
-	 */
-	public void fireNodeRemoved(TreeChangeEvent event) {
-		String treeName = event.treeName();
-
-		TreeChangeListener[] treeChangeListeners = null;
-		TreeChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			treeChangeListeners = this.treeChangeListeners();
-			if (treeChangeListeners != null) {
-				targets = treeChangeListeners.clone();
-			}
-			child = this.child(treeName);
-		}
-
-		if (targets != null) {
-			for (TreeChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.treeChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().nodeRemoved(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.fireNodeRemoved(event);
-		}
-
-		this.sourceChanged(treeName);
-	}
-
-	/**
-	 * Report a bound tree update to any registered listeners.
-	 */
-	public void fireNodeRemoved(String treeName, Object[] path) {
-//		this.fireNodeRemoved(new TreeChangeEvent(this.source, treeName, path));
-
-		TreeChangeListener[] treeChangeListeners = null;
-		TreeChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			treeChangeListeners = this.treeChangeListeners();
-			if (treeChangeListeners != null) {
-				targets = treeChangeListeners.clone();
-			}
-			child = this.child(treeName);
-		}
-
-		TreeChangeEvent event = null;
-
-		if (targets != null) {
-			for (TreeChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.treeChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new TreeChangeEvent(this.source, treeName, path);
-					}
-					this.dispatcher().nodeRemoved(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireNodeRemoved(treeName, path);
-			} else {
-				child.fireNodeRemoved(event);
-			}
-		}
-
-		this.sourceChanged(treeName);
-	}
-
-	/**
-	 * Report a bound tree update to any registered listeners.
-	 */
-	public void fireTreeCleared(TreeChangeEvent event) {
-		String treeName = event.treeName();
-
-		TreeChangeListener[] treeChangeListeners = null;
-		TreeChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			treeChangeListeners = this.treeChangeListeners();
-			if (treeChangeListeners != null) {
-				targets = treeChangeListeners.clone();
-			}
-			child = this.child(treeName);
-		}
-
-		if (targets != null) {
-			for (TreeChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.treeChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().treeCleared(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.fireTreeCleared(event);
-		}
-
-		this.sourceChanged(treeName);
-	}
-
-	/**
-	 * Report a bound tree update to any registered listeners.
-	 */
-	public void fireTreeCleared(String treeName, Object[] path) {
-//		this.fireTreeCleared(new TreeChangeEvent(this.source, treeName, path));
-
-		TreeChangeListener[] treeChangeListeners = null;
-		TreeChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			treeChangeListeners = this.treeChangeListeners();
-			if (treeChangeListeners != null) {
-				targets = treeChangeListeners.clone();
-			}
-			child = this.child(treeName);
-		}
-
-		TreeChangeEvent event = null;
-
-		if (targets != null) {
-			for (TreeChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.treeChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new TreeChangeEvent(this.source, treeName, path);
-					}
-					this.dispatcher().treeCleared(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireTreeCleared(treeName, path);
-			} else {
-				child.fireTreeCleared(event);
-			}
-		}
-
-		this.sourceChanged(treeName);
-	}
-
-	/**
-	 * Report a bound tree update to any registered listeners.
-	 */
-	public void fireTreeCleared(String treeName) {
-		this.fireTreeCleared(treeName, EMPTY_TREE_PATH);
-	}
-
-	/**
-	 * Report a bound tree update to any registered listeners.
-	 */
-	public void fireTreeChanged(TreeChangeEvent event) {
-		String treeName = event.treeName();
-
-		TreeChangeListener[] treeChangeListeners = null;
-		TreeChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			treeChangeListeners = this.treeChangeListeners();
-			if (treeChangeListeners != null) {
-				targets = treeChangeListeners.clone();
-			}
-			child = this.child(treeName);
-		}
-
-		if (targets != null) {
-			for (TreeChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.treeChangeListeners(), target);
-				}
-				if (stillListening) {
-					this.dispatcher().treeChanged(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			child.fireTreeChanged(event);
-		}
-
-		this.sourceChanged(treeName);
-	}
-
-	/**
-	 * Report a bound tree update to any registered listeners.
-	 */
-	public void fireTreeChanged(String treeName, Object[] path) {
-//		this.fireTreeChanged(new TreeChangeEvent(this.source, treeName, path));
-
-		TreeChangeListener[] treeChangeListeners = null;
-		TreeChangeListener[] targets = null;
-		ChangeSupport child = null;
-
-		synchronized (this) {
-			treeChangeListeners = this.treeChangeListeners();
-			if (treeChangeListeners != null) {
-				targets = treeChangeListeners.clone();
-			}
-			child = this.child(treeName);
-		}
-
-		TreeChangeEvent event = null;
-
-		if (targets != null) {
-			for (TreeChangeListener target : targets) {
-				boolean stillListening;
-				synchronized (this) {
-					stillListening = CollectionTools.contains(this.treeChangeListeners(), target);
-				}
-				if (stillListening) {
-					if (event == null) {
-						// here's the reason for the duplicate code...
-						event = new TreeChangeEvent(this.source, treeName, path);
-					}
-					this.dispatcher().treeChanged(target, event);
-				}
-			}
-		}
-		if (child != null) {
-			if (event == null) {
-				child.fireTreeChanged(treeName, path);
-			} else {
-				child.fireTreeChanged(event);
-			}
-		}
-
-		this.sourceChanged(treeName);
-	}
-
-	/**
-	 * Report a bound tree update to any registered listeners.
-	 */
-	public void fireTreeChanged(String treeName) {
-		this.fireTreeChanged(treeName, EMPTY_TREE_PATH);
-	}
-
-
-	// ********** standard methods **********
-
-	@Override
-	public String toString() {
-		return StringTools.buildToStringFor(this, this.source);
-	}
-
-
-	// ********** serialization **********
-
-	private synchronized void writeObject(ObjectOutputStream s) throws IOException {
-		// write out the source, children, and any hidden stuff
-		s.defaultWriteObject();
-
-		// only write out Serializable listeners
-		int len1 = this.genericListeners.length;
-		for (int i = 0; i < len1; i++) {
-			this.writeObject(s, this.genericListeners[i]);
-		}
-		s.writeObject(null);
-    }
-
-	private void writeObject(ObjectOutputStream s, GenericListenerList gll) throws IOException {
-		boolean first = true;
-		int len = gll.listeners.length;
-		for (int i = 0; i < len; i++) {
-			ChangeListener listener = gll.listeners[i];
-			if (listener instanceof Serializable) {
-				if (first) {
-					first = false;
-					s.writeObject(gll.listenerClass);
-				}
-				s.writeObject(listener);
-			}
-		}
-		if ( ! first) {
-			s.writeObject(null);
-		}
-	}
-
-	private synchronized void readObject(ObjectInputStream s) throws ClassNotFoundException, IOException {
-		// read in the source, children, and any hidden stuff
-		s.defaultReadObject();
-
-		// read in generic listener lists
-		this.genericListeners = EMPTY_GENERIC_LISTENERS;
-		Object o;
-		while (null != (o = s.readObject())) {
-			@SuppressWarnings("unchecked")
-			Class<? extends ChangeListener> listenerClass = (Class<? extends ChangeListener>) o;
-			GenericListenerList gll = null;
-			while (null != (o = s.readObject())) {
-				if (gll == null) {
-					gll = this.addGenericListenerListInternal(listenerClass, (ChangeListener) o);
-				} else {
-					gll.addListener((ChangeListener) o);
-				}
-			}
-		}
-	}
-
-	@SuppressWarnings("unchecked")
-	private <T extends ChangeListener> GenericListenerList addGenericListenerListInternal(Class<T> listenerClass, ChangeListener listener) {
-		return this.addGenericListenerList(listenerClass, (T) listener);
-	}
-
-
-	// ********** member classes **********
-
-	/**
-	 * Pair a listener class with its generic listeners.
-	 */
-	private static class GenericListenerList {
-		final Class<? extends ChangeListener> listenerClass;
-		ChangeListener[] listeners;
-		<T extends ChangeListener> GenericListenerList(Class<T> listenerClass, T listener) {
-			super();
-			this.listenerClass = listenerClass;
-			this.listeners = (ChangeListener[]) Array.newInstance(listenerClass, 1);
-			this.listeners[0] = listener;
-		}
-		void addListener(ChangeListener listener) {
-			this.listeners = CollectionTools.add(this.listeners, listener);
-		}
-		boolean removeListener(ChangeListener listener) {
-			int len = this.listeners.length;
-			if (len == 0) {
-				return false;
-			}
-			try {
-				this.listeners = CollectionTools.remove(this.listeners, listener);
-			} catch (ArrayIndexOutOfBoundsException ex) {
-				return false;  // listener not in the list
-			}
-			return (this.listeners.length + 1) == len;
-		}
-		boolean hasListeners() {
-			return this.listeners.length > 0;
-		}
-	}
-
-	/**
-	 * Pair an aspect name with the change support holding its associated
-	 * listeners.
-	 */
-	private static class AspectChild implements Serializable {
-		final String aspectName;
-		final ChangeSupport child;
-		private static final long serialVersionUID = 1L;
-		AspectChild(String aspectName, ChangeSupport child) {
-			super();
-			this.aspectName = aspectName;
-			this.child = child;
-		}
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/DefaultChangeEventDispatcher.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/DefaultChangeEventDispatcher.java
deleted file mode 100644
index f6433b1..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/DefaultChangeEventDispatcher.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model;
-
-import java.io.Serializable;
-
-import org.eclipse.jpt.utility.internal.model.event.CollectionChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.ListChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.PropertyChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.StateChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.TreeChangeEvent;
-import org.eclipse.jpt.utility.internal.model.listener.CollectionChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ListChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.PropertyChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.StateChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.TreeChangeListener;
-
-/**
- * Straightforward implementation of ChangeEventDispatcher interface:
- * Just forward the change notification directly to the listener.
- */
-public class DefaultChangeEventDispatcher
-	implements ChangeEventDispatcher, Serializable
-{
-	// singleton
-	private static ChangeEventDispatcher INSTANCE;
-
-	private static final long serialVersionUID = 1L;
-
-
-	/**
-	 * Return the singleton.
-	 */
-	public synchronized static ChangeEventDispatcher instance() {
-		if (INSTANCE == null) {
-			INSTANCE = new DefaultChangeEventDispatcher();
-		}
-		return INSTANCE;
-	}
-
-	/**
-	 * Ensure non-instantiability.
-	 */
-	private DefaultChangeEventDispatcher() {
-		super();
-	}
-
-	public void stateChanged(StateChangeListener listener, StateChangeEvent event) {
-		listener.stateChanged(event);
-	}
-
-	public void propertyChanged(PropertyChangeListener listener, PropertyChangeEvent event) {
-		listener.propertyChanged(event);
-	}
-
-	public void itemsAdded(CollectionChangeListener listener, CollectionChangeEvent event) {
-		listener.itemsAdded(event);
-	}
-
-	public void itemsRemoved(CollectionChangeListener listener, CollectionChangeEvent event) {
-		listener.itemsRemoved(event);
-	}
-
-	public void collectionCleared(CollectionChangeListener listener, CollectionChangeEvent event) {
-		listener.collectionCleared(event);
-	}
-
-	public void collectionChanged(CollectionChangeListener listener, CollectionChangeEvent event) {
-		listener.collectionChanged(event);
-	}
-
-	public void itemsAdded(ListChangeListener listener, ListChangeEvent event) {
-		listener.itemsAdded(event);
-	}
-
-	public void itemsRemoved(ListChangeListener listener, ListChangeEvent event) {
-		listener.itemsRemoved(event);
-	}
-
-	public void itemsReplaced(ListChangeListener listener, ListChangeEvent event) {
-		listener.itemsReplaced(event);
-	}
-
-	public void itemsMoved(ListChangeListener listener, ListChangeEvent event) {
-		listener.itemsMoved(event);
-	}
-
-	public void listCleared(ListChangeListener listener, ListChangeEvent event) {
-		listener.listCleared(event);
-	}
-
-	public void listChanged(ListChangeListener listener, ListChangeEvent event) {
-		listener.listChanged(event);
-	}
-
-	public void nodeAdded(TreeChangeListener listener, TreeChangeEvent event) {
-		listener.nodeAdded(event);
-	}
-
-	public void nodeRemoved(TreeChangeListener listener, TreeChangeEvent event) {
-		listener.nodeRemoved(event);
-	}
-
-	public void treeCleared(TreeChangeListener listener, TreeChangeEvent event) {
-		listener.treeCleared(event);
-	}
-
-	public void treeChanged(TreeChangeListener listener, TreeChangeEvent event) {
-		listener.treeChanged(event);
-	}
-
-	/**
-	 * Serializable singleton support
-	 */
-	private Object readResolve() {
-		return instance();
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/Model.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/Model.java
deleted file mode 100644
index fc3916d..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/Model.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model;
-
-import org.eclipse.jpt.utility.internal.model.listener.CollectionChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ListChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.PropertyChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.StateChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.TreeChangeListener;
-
-/**
- * Interface to be implemented by models that notify listeners of
- * changes to bound properties, collections, lists, and/or trees.
- */
-public interface Model {
-
-	// ********** state change **********
-
-	/**
-	 * Add a listener that listens to all state change events.
-	 * The same listener may be added more than once and will be called
-	 * as many times as it is added. The listener cannot be null.
-	 */
-	void addStateChangeListener(StateChangeListener listener);
-
-	/**
-	 * Remove the specified state change listener. If the listener
-	 * was added more than once, it will be notified one less time
-	 * after being removed. An exception will be thrown if the
-	 * listener is null or if the listener was never added.
-	 */
-	void removeStateChangeListener(StateChangeListener listener);
-
-
-	// ********** property change **********
-
-	/**
-	 * Add a listener that listens to all property change events,
-	 * regardless of the property ID associated with that event.
-	 * The same listener may be added more than once and will be called
-	 * as many times as it is added. The listener cannot be null.
-	 */
-	void addPropertyChangeListener(PropertyChangeListener listener);
-
-	/**
-	 * Add a listener that listens to all property change events with
-	 * the specified property ID.
-	 * The same listener may be added more than once and will be called
-	 * as many times as it is added. The listener cannot be null.
-	 */
-	void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);
-
-	/**
-	 * Remove a listener that listens to all property change events,
-	 * regardless of the property ID associated with that event.
-	 * If the listener was added more than once, it will be notified one less
-	 * time after being removed. An exception will be thrown if the
-	 * listener is null or if the listener was never added.
-	 */
-	void removePropertyChangeListener(PropertyChangeListener listener);
-
-	/**
-	 * Remove a listener that listens to all property change events,
-	 * with the specified property ID.
-	 * If the listener was added more than once, it will be notified one less
-	 * time after being removed. An exception will be thrown if the
-	 * listener is null or if the listener was never added.
-	 */
-	void removePropertyChangeListener(String propertyName, PropertyChangeListener listener);
-
-
-	// ********** collection change **********
-
-	/**
-	 * Add a listener that listens to all collection change events,
-	 * regardless of the collection ID associated with that event.
-	 * The same listener may be added more than once and will be called
-	 * as many times as it is added. The listener cannot be null.
-	 */
-	void addCollectionChangeListener(CollectionChangeListener listener);
-
-	/**
-	 * Add a listener that listens to all collection change events with
-	 * the specified collection ID.
-	 * The same listener may be added more than once and will be called
-	 * as many times as it is added. The listener cannot be null.
-	 */
-	void addCollectionChangeListener(String collectionName, CollectionChangeListener listener);
-
-	/**
-	 * Remove a listener that listens to all collection change events,
-	 * regardless of the collection ID associated with that event.
-	 * If the listener was added more than once, it will be notified one less
-	 * time after being removed. An exception will be thrown if the
-	 * listener is null or if the listener was never added.
-	 */
-	void removeCollectionChangeListener(CollectionChangeListener listener);
-
-	/**
-	 * Remove a listener that listens to all collection change events,
-	 * with the specified collection ID.
-	 * If the listener was added more than once, it will be notified one less
-	 * time after being removed. An exception will be thrown if the
-	 * listener is null or if the listener was never added.
-	 */
-	void removeCollectionChangeListener(String collectionName, CollectionChangeListener listener);
-
-
-	// ********** list change **********
-
-	/**
-	 * Add a listener that listens to all list change events,
-	 * regardless of the list ID associated with that event.
-	 * The same listener may be added more than once and will be called
-	 * as many times as it is added. The listener cannot be null.
-	 */
-	void addListChangeListener(ListChangeListener listener);
-
-	/**
-	 * Add a listener that listens to all list change events with
-	 * the specified list ID.
-	 * The same listener may be added more than once and will be called
-	 * as many times as it is added. The listener cannot be null.
-	 */
-	void addListChangeListener(String listName, ListChangeListener listener);
-
-	/**
-	 * Remove a listener that listens to all list change events,
-	 * regardless of the list ID associated with that event.
-	 * If the listener was added more than once, it will be notified one less
-	 * time after being removed. An exception will be thrown if the
-	 * listener is null or if the listener was never added.
-	 */
-	void removeListChangeListener(ListChangeListener listener);
-
-	/**
-	 * Remove a listener that listens to all list change events,
-	 * with the specified list ID.
-	 * If the listener was added more than once, it will be notified one less
-	 * time after being removed. An exception will be thrown if the
-	 * listener is null or if the listener was never added.
-	 */
-	void removeListChangeListener(String listName, ListChangeListener listener);
-
-
-	// ********** tree change **********
-
-	/**
-	 * Add a listener that listens to all tree change events,
-	 * regardless of the tree ID associated with that event.
-	 * The same listener may be added more than once and will be called
-	 * as many times as it is added. The listener cannot be null.
-	 */
-	void addTreeChangeListener(TreeChangeListener listener);
-
-	/**
-	 * Add a listener that listens to all tree change events with
-	 * the specified tree ID.
-	 * The same listener may be added more than once and will be called
-	 * as many times as it is added. The listener cannot be null.
-	 */
-	void addTreeChangeListener(String treeName, TreeChangeListener listener);
-
-	/**
-	 * Remove a listener that listens to all tree change events,
-	 * regardless of the tree ID associated with that event.
-	 * If the listener was added more than once, it will be notified one less
-	 * time after being removed. An exception will be thrown if the
-	 * listener is null or if the listener was never added.
-	 */
-	void removeTreeChangeListener(TreeChangeListener listener);
-
-	/**
-	 * Remove a listener that listens to all tree change events,
-	 * with the specified tree ID.
-	 * If the listener was added more than once, it will be notified one less
-	 * time after being removed. An exception will be thrown if the
-	 * listener is null or if the listener was never added.
-	 */
-	void removeTreeChangeListener(String treeName, TreeChangeListener listener);
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/NullChangeEventDispatcher.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/NullChangeEventDispatcher.java
deleted file mode 100644
index 22c09c8..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/NullChangeEventDispatcher.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model;
-
-import java.io.Serializable;
-
-import org.eclipse.jpt.utility.internal.model.event.CollectionChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.ListChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.PropertyChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.StateChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.TreeChangeEvent;
-import org.eclipse.jpt.utility.internal.model.listener.CollectionChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ListChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.PropertyChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.StateChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.TreeChangeListener;
-
-/**
- * Null implementation of ChangeEventDispatcher interface: Do nothing.
- */
-public class NullChangeEventDispatcher
-	implements ChangeEventDispatcher, Serializable
-{
-	// singleton
-	private static ChangeEventDispatcher INSTANCE;
-
-	private static final long serialVersionUID = 1L;
-
-
-	/**
-	 * Return the singleton.
-	 */
-	public synchronized static ChangeEventDispatcher instance() {
-		if (INSTANCE == null) {
-			INSTANCE = new NullChangeEventDispatcher();
-		}
-		return INSTANCE;
-	}
-
-	/**
-	 * Ensure non-instantiability.
-	 */
-	private NullChangeEventDispatcher() {
-		super();
-	}
-
-	public void stateChanged(StateChangeListener listener, StateChangeEvent event) {
-		// do nothing
-	}
-
-	public void propertyChanged(PropertyChangeListener listener, PropertyChangeEvent event) {
-		// do nothing
-	}
-
-	public void itemsAdded(CollectionChangeListener listener, CollectionChangeEvent event) {
-		// do nothing
-	}
-
-	public void itemsRemoved(CollectionChangeListener listener, CollectionChangeEvent event) {
-		// do nothing
-	}
-
-	public void collectionCleared(CollectionChangeListener listener, CollectionChangeEvent event) {
-		// do nothing
-	}
-
-	public void collectionChanged(CollectionChangeListener listener, CollectionChangeEvent event) {
-		// do nothing
-	}
-
-	public void itemsAdded(ListChangeListener listener, ListChangeEvent event) {
-		// do nothing
-	}
-
-	public void itemsRemoved(ListChangeListener listener, ListChangeEvent event) {
-		// do nothing
-	}
-
-	public void itemsReplaced(ListChangeListener listener, ListChangeEvent event) {
-		// do nothing
-	}
-
-	public void itemsMoved(ListChangeListener listener, ListChangeEvent event) {
-		// do nothing
-	}
-
-	public void listCleared(ListChangeListener listener, ListChangeEvent event) {
-		// do nothing
-	}
-
-	public void listChanged(ListChangeListener listener, ListChangeEvent event) {
-		// do nothing
-	}
-
-	public void nodeAdded(TreeChangeListener listener, TreeChangeEvent event) {
-		// do nothing
-	}
-
-	public void nodeRemoved(TreeChangeListener listener, TreeChangeEvent event) {
-		// do nothing
-	}
-
-	public void treeCleared(TreeChangeListener listener, TreeChangeEvent event) {
-		// do nothing
-	}
-
-	public void treeChanged(TreeChangeListener listener, TreeChangeEvent event) {
-		// do nothing
-	}
-
-	/**
-	 * Serializable singleton support
-	 */
-	private Object readResolve() {
-		return instance();
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/NullModel.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/NullModel.java
deleted file mode 100644
index 998ff3e..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/NullModel.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model;
-
-import java.io.Serializable;
-
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.internal.model.listener.CollectionChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ListChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.PropertyChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.StateChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.TreeChangeListener;
-
-/**
- * Null implementation that never notifies any listeners of any changes
- * because it never changes.
- */
-public class NullModel
-	implements Model, Cloneable, Serializable
-{
-	private static final long serialVersionUID = 1L;
-
-
-	/**
-	 * Default constructor.
-	 */
-	public NullModel() {
-		super();
-	}
-
-
-	// ********** Model implementation **********
-
-	public void addStateChangeListener(StateChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void removeStateChangeListener(StateChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void addPropertyChangeListener(PropertyChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void removePropertyChangeListener(PropertyChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void addCollectionChangeListener(CollectionChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void addCollectionChangeListener(String collectionName, CollectionChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void removeCollectionChangeListener(CollectionChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void removeCollectionChangeListener(String collectionName, CollectionChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void addListChangeListener(ListChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void addListChangeListener(String listName, ListChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void removeListChangeListener(ListChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void removeListChangeListener(String listName, ListChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void addTreeChangeListener(TreeChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void addTreeChangeListener(String treeName, TreeChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void removeTreeChangeListener(TreeChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-	public void removeTreeChangeListener(String treeName, TreeChangeListener listener) {
-		// ignore listeners - nothing ever changes
-	}
-
-
-	// ********** Object overrides **********
-
-	@Override
-	public synchronized NullModel clone() {
-		try {
-			return (NullModel) super.clone();
-		} catch (CloneNotSupportedException ex) {
-			throw new InternalError();
-		}
-	}
-
-	@Override
-	public String toString() {
-		return ClassTools.shortClassNameForObject(this);
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/ChangeEvent.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/ChangeEvent.java
deleted file mode 100644
index f5d6827..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/ChangeEvent.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.event;
-
-import java.util.EventObject;
-
-import org.eclipse.jpt.utility.internal.StringTools;
-
-/**
- * Abstract class for all the change events that can be fired by models.
- */
-public abstract class ChangeEvent extends EventObject {
-
-	private static final long serialVersionUID = 1L;
-
-
-	/**
-	 * Construct a new change event.
-	 *
-	 * @param source The object on which the event initially occurred.
-	 */
-	protected ChangeEvent(Object source) {
-		super(source);
-	}
-
-	/**
-	 * Return the name of the aspect of the source that changed.
-	 * May be null if inappropriate.
-	 */
-	public abstract String aspectName();
-
-	/**
-	 * Return a copy of the event with the specified source
-	 * replacing the current source.
-	 */
-	public abstract ChangeEvent cloneWithSource(Object newSource);
-
-	@Override
-	public String toString() {
-		return StringTools.buildToStringFor(this, this.aspectName());
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/CollectionChangeEvent.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/CollectionChangeEvent.java
deleted file mode 100644
index 1076be3..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/CollectionChangeEvent.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.event;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-
-/**
- * A "collection change" event gets delivered whenever a model changes a "bound"
- * or "constrained" collection. A CollectionChangeEvent is sent as an
- * argument to the CollectionChangeListener.
- * 
- * Normally a CollectionChangeEvent is accompanied by the collection name and
- * the items that were added to or removed from the changed collection.
- * 
- * Design options:
- * - create a collection to wrap a single added or removed item
- * 	(this is the option we implemented below and in collaborating code)
- * 	since there is no way to optimize downstream code for
- * 	single items, we take another performance hit by building
- * 	a collection each time  (@see Collections.singleton(Object))
- * 	and forcing downstream code to use an iterator every time
- * 
- * - fire a separate event for each item added or removed
- * 	eliminates any potential for optimizations to downstream code
- * 
- * - add protocol to support both single items and collections
- * 	adds conditional logic to downstream code
- */
-public class CollectionChangeEvent extends ChangeEvent {
-
-	/** Name of the collection that changed. */
-	private final String collectionName;
-
-	/** The items that were added to or removed from the collection. May be empty, if not known. */
-	private final Collection<?> items;
-
-	private static final long serialVersionUID = 1L;
-
-
-	/**
-	 * Construct a new collection change event.
-	 *
-	 * @param source The object on which the event initially occurred.
-	 * @param collectionName The programmatic name of the collection that was changed.
-	 * @param items The items that were added to or removed from the collection.
-	 */
-	public CollectionChangeEvent(Object source, String collectionName, Collection<?> items) {
-		super(source);
-		if ((collectionName == null) || (items == null)) {
-			throw new NullPointerException();
-		}
-		this.collectionName = collectionName;
-		this.items = Collections.unmodifiableCollection(items);
-	}
-
-	/**
-	 * Construct a new collection change event.
-	 *
-	 * @param source The object on which the event initially occurred.
-	 * @param collectionName The programmatic name of the collection that was changed.
-	 */
-	@SuppressWarnings("unchecked")
-	public CollectionChangeEvent(Object source, String collectionName) {
-		this(source, collectionName, Collections.emptySet());
-	}
-
-	/**
-	 * Return the programmatic name of the collection that was changed.
-	 */
-	public String collectionName() {
-		return this.collectionName;
-	}
-
-	/**
-	 * Return an iterator on the items that were added to or
-	 * removed from the collection.
-	 * May be empty if inappropriate or unknown.
-	 */
-	public Iterator<?> items() {
-		return this.items.iterator();
-	}
-
-	/**
-	 * Return the number of items that were added to or
-	 * removed from the collection.
-	 * May be 0 if inappropriate or unknown.
-	 */
-	public int itemsSize() {
-		return this.items.size();
-	}
-
-	@Override
-	public String aspectName() {
-		return this.collectionName;
-	}
-
-	/**
-	 * Return a copy of the event with the specified source
-	 * replacing the current source.
-	 */
-	@Override
-	public CollectionChangeEvent cloneWithSource(Object newSource) {
-		return new CollectionChangeEvent(newSource, this.collectionName, this.items);
-	}
-
-	/**
-	 * Return a copy of the event with the specified source
-	 * replacing the current source and collection name.
-	 */
-	public CollectionChangeEvent cloneWithSource(Object newSource, String newCollectionName) {
-		return new CollectionChangeEvent(newSource, newCollectionName, this.items);
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/ListChangeEvent.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/ListChangeEvent.java
deleted file mode 100644
index d79680f..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/ListChangeEvent.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.event;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.ListIterator;
-
-/**
- * A "list change" event gets delivered whenever a model changes a "bound"
- * or "constrained" list. A ListChangeEvent is sent as an
- * argument to the ListChangeListener.
- * 
- * Normally a ListChangeEvent is accompanied by the list name,
- * the items that were added to or removed from the changed list,
- * and the index of where the items are or were in the list.
- * 
- * Design options:
- * - create a list to wrap a single added or removed item
- * 	(this is the option we implemented below and in collaborating code)
- * 	since there is no way to optimize downstream code for
- * 	single items, we take another performance hit by building
- * 	a list each time  (@see Collections.singletonList(Object))
- * 	and forcing downstream code to use a list iterator every time
- * 
- * - fire a separate event for each item added or removed
- * 	eliminates any potential for optimizations to downstream code
- * 
- * - add protocol to support both single items and collections
- * 	adds conditional logic to downstream code
- */
-public class ListChangeEvent extends ChangeEvent {
-
-	/**
-	 * Name of the list that changed.
-	 */
-	private final String listName;
-
-	/**
-	 * The index at which the items were added or removed.
-	 * In the case of "moved" items, this will be the "target" index.
-	 * May be -1, if not known.
-	 */
-	private final int index;
-
-	/**
-	 * The items that were added to or removed from the list. In the case of
-	 * "replaced" items, these are the new items in the list.
-	 * In the case of "moved" items, this will be empty.
-	 * May be empty, if not known.
-	 */
-	private final List<?> items;
-
-	/**
-	 * The items in the list that were replaced by the items listed above,
-	 * in #items. May be empty, if not known.
-	 */
-	private final List<?> replacedItems;
-
-	/**
-	 * In the case of "moved" items, this will be the "source" index.
-	 * May be -1, if not known.
-	 */
-	private final int sourceIndex;
-
-	/**
-	 * In the case of "moved" items, this will be the number of items moved.
-	 * May be -1, if not known.
-	 */
-	private final int moveLength;
-
-	private static final long serialVersionUID = 1L;
-
-
-	protected ListChangeEvent(Object source, String listName, int index, List<?> items, List<?> replacedItems, int sourceIndex, int moveLength) {
-		super(source);
-		if ((listName == null) || (items == null) || (replacedItems == null)) {
-			throw new NullPointerException();
-		}
-		this.listName = listName;
-		this.index = index;
-		this.items = Collections.unmodifiableList(items);
-		this.replacedItems = Collections.unmodifiableList(replacedItems);
-		this.sourceIndex = sourceIndex;
-		this.moveLength = moveLength;
-	}
-	
-	/**
-	 * Construct a new list change event for a list of replaced items.
-	 *
-	 * @param source The object on which the event initially occurred.
-	 * @param listName The programmatic name of the list that was changed.
-	 * @param index The index at which the items in the list were replaced.
-	 * @param items The new items in the list.
-	 * @param replacedItems The items in the list that were replaced.
-	 */
-	public ListChangeEvent(Object source, String listName, int index, List<?> items, List<?> replacedItems) {
-		this(source, listName, index, items, replacedItems, -1, -1);
-	}
-	
-	/**
-	 * Construct a new list change event for a list of added or removed items.
-	 *
-	 * @param source The object on which the event initially occurred.
-	 * @param listName The programmatic name of the list that was changed.
-	 * @param index The index at which the items were added to or removed from the list.
-	 * @param items The items that were added to or removed from the list.
-	 */
-	@SuppressWarnings("unchecked")
-	public ListChangeEvent(Object source, String listName, int index, List<?> items) {
-		this(source, listName, index, items, Collections.emptyList(), -1, -1);
-	}
-	
-	/**
-	 * Construct a new list change event for a list of moved items.
-	 *
-	 * @param source The object on which the event initially occurred.
-	 * @param listName The programmatic name of the list that was changed.
-	 * @param targetIndex The index to which the items were moved.
-	 * @param sourceIndex The index from which the items were moved.
-	 */
-	@SuppressWarnings("unchecked")
-	public ListChangeEvent(Object source, String listName, int targetIndex, int sourceIndex, int length) {
-		this(source, listName, targetIndex, Collections.emptyList(), Collections.emptyList(), sourceIndex, length);
-	}
-	
-	/**
-	 * Construct a new list change event.
-	 *
-	 * @param source The object on which the event initially occurred.
-	 * @param listName The programmatic name of the list that was changed.
-	 */
-	@SuppressWarnings("unchecked")
-	public ListChangeEvent(Object source, String listName) {
-		this(source, listName, -1, Collections.emptyList(), Collections.emptyList(), -1, -1);
-	}
-	
-	/**
-	 * Return the programmatic name of the list that was changed.
-	 */
-	public String listName() {
-		return this.listName;
-	}
-
-	/**
-	 * Return the index at which the items were added to or removed from the list.
-	 * In the case of "moved" items, this will be the "target" index.
-	 * May be -1 if inappropriate or unknown.
-	 */
-	public int index() {
-		return this.index;
-	}
-
-	/**
-	 * Return the index at which the items were added to or removed from the list.
-	 * In the case of "moved" items, this will be the "target" index.
-	 * May be -1 if inappropriate or unknown.
-	 */
-	public int targetIndex() {
-		return this.index;
-	}
-
-	/**
-	 * Return a list iterator on the items that were added to or
-	 * removed from the list. In the case of "replaced" items, these
-	 * are the new items in the list.
-	 * May be empty if inappropriate or unknown.
-	 */
-	public ListIterator<?> items() {
-		return this.items.listIterator();
-	}
-
-	/**
-	 * Return the number of items that were added to or
-	 * removed from the list.
-	 * May be 0 if inappropriate or unknown.
-	 */
-	public int itemsSize() {
-		return this.items.size();
-	}
-
-	/**
-	 * Return a list iterator on the items in the list that were replaced.
-	 * May be empty if inappropriate or unknown.
-	 */
-	public ListIterator<?> replacedItems() {
-		return this.replacedItems.listIterator();
-	}
-
-	/**
-	 * In the case of "moved" items, this will be the "source" index.
-	 * May be -1 if inappropriate or unknown.
-	 */
-	public int sourceIndex() {
-		return this.sourceIndex;
-	}
-
-	/**
-	 * In the case of "moved" items, this will be the number of items moved.
-	 * May be -1 if inappropriate or unknown.
-	 */
-	public int moveLength() {
-		return this.moveLength;
-	}
-
-	@Override
-	public String aspectName() {
-		return this.listName;
-	}
-
-	/**
-	 * Return a copy of the event with the specified source
-	 * replacing the current source.
-	 */
-	@Override
-	public ListChangeEvent cloneWithSource(Object newSource) {
-		return new ListChangeEvent(newSource, this.listName, this.index, this.items, this.replacedItems);
-	}
-
-	/**
-	 * Return a copy of the event with the specified source
-	 * replacing the current source and list name.
-	 */
-	public ListChangeEvent cloneWithSource(Object newSource, String newListName) {
-		return new ListChangeEvent(newSource, newListName, this.index, this.items, this.replacedItems);
-	}
-
-	/**
-	 * Return a copy of the event with the specified source
-	 * replacing the current source and list name and displacing
-	 * the index by the specified amount.
-	 */
-	public ListChangeEvent cloneWithSource(Object newSource, String newListName, int offset) {
-		return new ListChangeEvent(newSource, newListName, this.index + offset, this.items, this.replacedItems);
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/PropertyChangeEvent.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/PropertyChangeEvent.java
deleted file mode 100644
index d78a372..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/PropertyChangeEvent.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.event;
-
-/**
- * A "property change" event gets delivered whenever a model changes a "bound"
- * or "constrained" property. A PropertyChangeEvent is sent as an
- * argument to the PropertyChangeListener.
- */
-public class PropertyChangeEvent extends ChangeEvent {
-
-	/** Name of the property that changed. */
-	private final String propertyName;
-
-	/** The property's old value, before the change. */
-	private final Object oldValue;
-
-	/** The property's new value, after the change. */
-	private final Object newValue;
-
-	private static final long serialVersionUID = 1L;
-
-
-	/**
-	 * Construct a new property change event.
-	 *
-	 * @param source The object on which the event initially occurred.
-	 * @param propertyName The programmatic name of the property that was changed.
-	 * @param oldValue The old value of the property.
-	 * @param newValue The new value of the property.
-	 */
-	public PropertyChangeEvent(Object source, String propertyName, Object oldValue, Object newValue) {
-		super(source);
-		if (propertyName == null) {
-			throw new NullPointerException();
-		}
-		this.propertyName = propertyName;
-		this.oldValue = oldValue;
-		this.newValue = newValue;
-	}
-
-	/**
-	 * Return the programmatic name of the property that was changed.
-	 */
-	public String propertyName() {
-		return this.propertyName;
-	}
-
-	/**
-	 * Return the old value of the property.
-	 */
-	public Object oldValue() {
-		return this.oldValue;
-	}
-
-	/**
-	 * Return the new value of the property.
-	 */
-	public Object newValue() {
-		return this.newValue;
-	}
-
-	@Override
-	public String aspectName() {
-		return this.propertyName;
-	}
-
-	@Override
-	public PropertyChangeEvent cloneWithSource(Object newSource) {
-		return new PropertyChangeEvent(newSource, this.propertyName, this.oldValue, this.newValue);
-	}
-
-	/**
-	 * Return a copy of the event with the specified source
-	 * replacing the current source and the property name.
-	 */
-	public PropertyChangeEvent cloneWithSource(Object newSource, String newPropertyName) {
-		return new PropertyChangeEvent(newSource, newPropertyName, this.oldValue, this.newValue);
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/StateChangeEvent.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/StateChangeEvent.java
deleted file mode 100644
index a73e178..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/StateChangeEvent.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.event;
-
-/**
- * A generic "state change" event gets delivered whenever a model changes to 
- * such extent that it cannot be delineated all aspects of it that have changed. 
- * A StateChangeEvent is sent as an argument to the StateChangeListener.
- */
-public class StateChangeEvent extends ChangeEvent {
-
-	private static final long serialVersionUID = 1L;
-
-
-	/**
-	 * Construct a new state change event.
-	 *
-	 * @param source The object on which the event initially occurred.
-	 */
-	public StateChangeEvent(Object source) {
-		super(source);
-	}
-
-	@Override
-	public String aspectName() {
-		return null;  // the point of the event is that the name is unknown...
-	}
-
-	@Override
-	public StateChangeEvent cloneWithSource(Object newSource) {
-		return new StateChangeEvent(newSource);
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/TreeChangeEvent.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/TreeChangeEvent.java
deleted file mode 100644
index b42477d..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/event/TreeChangeEvent.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.event;
-
-/**
- * A "tree change" event gets delivered whenever a model changes a "bound"
- * or "constrained" tree. A TreeChangeEvent is sent as an
- * argument to the TreeChangeListener.
- * 
- * Normally a TreeChangeEvent is accompanied by the tree name and a path
- * to the part of the tree that was changed.
- */
-public class TreeChangeEvent extends ChangeEvent {
-
-	/** Name of the tree that changed. */
-	private final String treeName;
-
-    /**
-     * Path to the parent of the part of the tree that was changed.
-     * May be empty, if not known or if the entire tree changed.
-     */
-	protected final Object[] path;
-
-	private static final Object[] EMPTY_PATH = new Object[0];
-
-	private static final long serialVersionUID = 1L;
-
-
-	/**
-	 * Construct a new tree change event.
-	 *
-	 * @param source The object on which the event initially occurred.
-	 * @param treeName The programmatic name of the tree that was changed.
-	 * @param path The path to the part of the tree that was changed.
-	 */
-	public TreeChangeEvent(Object source, String treeName, Object[] path) {
-		super(source);
-		if ((treeName == null) || (path == null)) {
-			throw new NullPointerException();
-		}
-		this.treeName = treeName;
-		this.path = path;
-	}
-	
-	/**
-	 * Construct a new tree change event.
-	 *
-	 * @param source The object on which the event initially occurred.
-	 * @param treeName The programmatic name of the tree that was changed.
-	 */
-	@SuppressWarnings("unchecked")
-	public TreeChangeEvent(Object source, String treeName) {
-		this(source, treeName, EMPTY_PATH);
-	}
-	
-	/**
-	 * Return the programmatic name of the tree that was changed.
-	 */
-	public String treeName() {
-		return this.treeName;
-	}
-
-	/**
-	 * Return the path to the part of the tree that was changed.
-	 * May be null, if not known.
-	 */
-	public Object[] path() {
-		return this.path;
-	}
-
-	@Override
-	public String aspectName() {
-		return this.treeName;
-	}
-
-	@Override
-	public TreeChangeEvent cloneWithSource(Object newSource) {
-		return new TreeChangeEvent(newSource, this.treeName, this.path);
-	}
-
-	/**
-	 * Return a copy of the event with the specified source
-	 * replacing the current source and the tree name.
-	 */
-	public TreeChangeEvent cloneWithSource(Object newSource, String newTreeName) {
-		return new TreeChangeEvent(newSource, newTreeName, this.path);
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/ChangeListener.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/ChangeListener.java
deleted file mode 100644
index 5224781..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/ChangeListener.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.listener;
-
-import java.util.EventListener;
-
-/**
- * Marker interface.
- */
-public interface ChangeListener extends EventListener {
-	// nothing for now
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/CollectionChangeAdapter.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/CollectionChangeAdapter.java
deleted file mode 100644
index 34d2f9d..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/CollectionChangeAdapter.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.listener;
-
-import org.eclipse.jpt.utility.internal.model.event.CollectionChangeEvent;
-
-/**
- * Convenience implementation of CollectionChangeListener.
- */
-public class CollectionChangeAdapter implements CollectionChangeListener {
-
-	/**
-	 * Default constructor.
-	 */
-	public CollectionChangeAdapter() {
-		super();
-	}
-
-	public void itemsAdded(CollectionChangeEvent event) {
-		// do nothing
-	}
-
-	public void itemsRemoved(CollectionChangeEvent event) {
-		// do nothing
-	}
-
-	public void collectionCleared(CollectionChangeEvent event) {
-		// do nothing
-	}
-
-	public void collectionChanged(CollectionChangeEvent event) {
-		// do nothing
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/CollectionChangeListener.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/CollectionChangeListener.java
deleted file mode 100644
index 86009d1..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/CollectionChangeListener.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.listener;
-
-import org.eclipse.jpt.utility.internal.model.event.CollectionChangeEvent;
-
-/**
- * A "collection change" event gets fired whenever a model changes a "bound"
- * collection. You can register a CollectionChangeListener with a source
- * model so as to be notified of any bound collection updates.
- */
-public interface CollectionChangeListener extends ChangeListener {
-
-	/**
-	 * This method gets called when items are added to a bound collection.
-	 * 
-	 * @param event A CollectionChangeEvent describing the event source,
-	 * the collection that changed, and the items that were added.
-	 */
-	void itemsAdded(CollectionChangeEvent event);
-
-	/**
-	 * This method gets called when items are removed from a bound collection.
-	 * 
-	 * @param event A CollectionChangeEvent describing the event source,
-	 * the collection that changed, and the items that were removed.
-	 */
-	void itemsRemoved(CollectionChangeEvent event);
-
-	/**
-	 * This method gets called when a bound collection is cleared.
-	 * 
-	 * @param event A CollectionChangeEvent describing the event source 
-	 * and the collection that changed.
-	 */
-	void collectionCleared(CollectionChangeEvent event);
-
-	/**
-	 * This method gets called when a bound collection is changed in a manner
-	 * that is not easily characterized by the other methods in this interface.
-	 * 
-	 * @param event A CollectionChangeEvent describing the event source 
-	 * and the collection that changed.
-	 */
-	void collectionChanged(CollectionChangeEvent event);
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/ListChangeAdapter.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/ListChangeAdapter.java
deleted file mode 100644
index 5468ac3..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/ListChangeAdapter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.listener;
-
-import org.eclipse.jpt.utility.internal.model.event.ListChangeEvent;
-
-/**
- * Convenience implementation of ListChangeListener.
- */
-public class ListChangeAdapter implements ListChangeListener {
-
-	/**
-	 * Default constructor.
-	 */
-	public ListChangeAdapter() {
-		super();
-	}
-
-	public void itemsAdded(ListChangeEvent event) {
-		// do nothing
-	}
-
-	public void itemsRemoved(ListChangeEvent event) {
-		// do nothing
-	}
-
-	public void itemsReplaced(ListChangeEvent event) {
-		// do nothing
-	}
-
-	public void itemsMoved(ListChangeEvent event) {
-		// do nothing
-	}
-
-	public void listCleared(ListChangeEvent event) {
-		// do nothing
-	}
-
-	public void listChanged(ListChangeEvent event) {
-		// do nothing
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/ListChangeListener.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/ListChangeListener.java
deleted file mode 100644
index ad3454b..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/ListChangeListener.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.listener;
-
-import org.eclipse.jpt.utility.internal.model.event.ListChangeEvent;
-
-/**
- * A "list change" event gets fired whenever a model changes a "bound"
- * list. You can register a ListChangeListener with a source
- * model so as to be notified of any bound list updates.
- */
-public interface ListChangeListener extends ChangeListener {
-
-	/**
-	 * This method gets called when items are added to a bound list.
-	 * 
-	 * @param event A ListChangeEvent describing the event source,
-	 * the list that changed, the items that were added, and the index
-	 * at which the items were added.
-	 */
-	void itemsAdded(ListChangeEvent event);
-
-	/**
-	 * This method gets called when items are removed from a bound list.
-	 * 
-	 * @param event A ListChangeEvent describing the event source,
-	 * the list that changed, the items that were removed, and the index
-	 * at which the items were removed.
-	 */
-	void itemsRemoved(ListChangeEvent event);
-
-	/**
-	 * This method gets called when items in a bound list are replaced.
-	 * 
-	 * @param event A ListChangeEvent describing the event source,
-	 * the list that changed, the items that were added, the items that were
-	 * replaced, and the index at which the items were replaced.
-	 */
-	void itemsReplaced(ListChangeEvent event);
-
-	/**
-	 * This method gets called when items in a bound list are moved.
-	 * 
-	 * @param event A ListChangeEvent describing the event source,
-	 * the list that changed, and the indices of where items were moved
-	 * from and to.
-	 */
-	void itemsMoved(ListChangeEvent event);
-
-	/**
-	 * This method gets called when a bound list is cleared.
-	 * 
-	 * @param event A ListChangeEvent object describing the event source 
-	 * and the list that changed.
-	 */
-	void listCleared(ListChangeEvent event);
-
-	/**
-	 * This method gets called when a bound list is changed in a manner
-	 * that is not easily characterized by the other methods in this interface.
-	 * 
-	 * @param event A ListChangeEvent object describing the event source 
-	 * and the list that changed.
-	 */
-	void listChanged(ListChangeEvent event);
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/MultiMethodReflectiveChangeListener.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/MultiMethodReflectiveChangeListener.java
deleted file mode 100644
index ddc89fe..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/MultiMethodReflectiveChangeListener.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.listener;
-
-import java.lang.reflect.Method;
-
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.internal.model.event.CollectionChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.ListChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.TreeChangeEvent;
-
-/**
- * This class is used by ReflectiveChangeListener when the requested listener
- * needs to implement multiple methods (i.e. CollectionChangeListener,
- * ListChangeListener, or TreeChangeListener).
- */
-class MultiMethodReflectiveChangeListener
-	extends ReflectiveChangeListener 
-	implements CollectionChangeListener, ListChangeListener, TreeChangeListener
-{
-	/** the methods we will invoke on the target object */
-	private final Method addMethod;
-	private final Method removeMethod;
-	private final Method replaceMethod;	// this can be null
-	private final Method moveMethod;	// this can be null
-	private final Method clearMethod;
-	private final Method changeMethod;
-
-
-	/**
-	 * The "replace" and "move" methods are optional.
-	 */
-	MultiMethodReflectiveChangeListener(Object target, Method addMethod, Method removeMethod, Method replaceMethod, Method moveMethod, Method clearMethod, Method changeMethod) {
-		super(target);
-		this.addMethod = addMethod;
-		this.removeMethod = removeMethod;
-		this.replaceMethod = replaceMethod;
-		this.moveMethod = moveMethod;
-		this.clearMethod = clearMethod;
-		this.changeMethod = changeMethod;
-	}
-
-	/**
-	 * No "replace" or "move" methods.
-	 */
-	MultiMethodReflectiveChangeListener(Object target, Method addMethod, Method removeMethod, Method clearMethod, Method changeMethod) {
-		this(target, addMethod, removeMethod, null, null, clearMethod, changeMethod);
-	}
-
-
-	// ********** CollectionChangeListener implementation **********
-
-	private void invoke(Method method, CollectionChangeEvent event) {
-		if (method.getParameterTypes().length == 0) {
-			ClassTools.executeMethod(method, this.target, EMPTY_COLLECTION_CHANGE_EVENT_ARRAY);
-		} else {
-			ClassTools.executeMethod(method, this.target, new CollectionChangeEvent[] {event});
-		}
-	}
-
-	public void itemsAdded(CollectionChangeEvent event) {
-		this.invoke(this.addMethod, event);
-	}
-
-	public void itemsRemoved(CollectionChangeEvent event) {
-		this.invoke(this.removeMethod, event);
-	}
-
-	public void collectionCleared(CollectionChangeEvent event) {
-		this.invoke(this.clearMethod, event);
-	}
-
-	public void collectionChanged(CollectionChangeEvent event) {
-		this.invoke(this.changeMethod, event);
-	}
-
-
-	// ********** ListChangeListener implementation **********
-
-	private void invoke(Method method, ListChangeEvent event) {
-		if (method.getParameterTypes().length == 0) {
-			ClassTools.executeMethod(method, this.target, EMPTY_LIST_CHANGE_EVENT_ARRAY);
-		} else {
-			ClassTools.executeMethod(method, this.target, new ListChangeEvent[] {event});
-		}
-	}
-
-	public void itemsAdded(ListChangeEvent event) {
-		this.invoke(this.addMethod, event);
-	}
-
-	public void itemsRemoved(ListChangeEvent event) {
-		this.invoke(this.removeMethod, event);
-	}
-
-	public void itemsReplaced(ListChangeEvent event) {
-		this.invoke(this.replaceMethod, event);
-	}
-
-	public void itemsMoved(ListChangeEvent event) {
-		this.invoke(this.moveMethod, event);
-	}
-
-	public void listCleared(ListChangeEvent event) {
-		this.invoke(this.clearMethod, event);
-	}
-
-	public void listChanged(ListChangeEvent event) {
-		this.invoke(this.changeMethod, event);
-	}
-
-
-	// ********** TreeChangeListener implementation **********
-
-	private void invoke(Method method, TreeChangeEvent event) {
-		if (method.getParameterTypes().length == 0) {
-			ClassTools.executeMethod(method, this.target, EMPTY_TREE_CHANGE_EVENT_ARRAY);
-		} else {
-			ClassTools.executeMethod(method, this.target, new TreeChangeEvent[] {event});
-		}
-	}
-
-	public void nodeAdded(TreeChangeEvent event) {
-		this.invoke(this.addMethod, event);
-	}
-
-	public void nodeRemoved(TreeChangeEvent event) {
-		this.invoke(this.removeMethod, event);
-	}
-
-	public void treeCleared(TreeChangeEvent event) {
-		this.invoke(this.clearMethod, event);
-	}
-
-	public void treeChanged(TreeChangeEvent event) {
-		this.invoke(this.changeMethod, event);
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/PropertyChangeListener.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/PropertyChangeListener.java
deleted file mode 100644
index bd0d453..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/PropertyChangeListener.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.listener;
-
-import org.eclipse.jpt.utility.internal.model.event.PropertyChangeEvent;
-
-/**
- * A "property change" event gets fired whenever a model changes a "bound"
- * property. You can register a PropertyChangeListener with a source
- * model so as to be notified of any bound property updates.
- */
-public interface PropertyChangeListener extends ChangeListener {
-
-	/**
-	 * This method gets called when a model has changed a bound property.
-	 * 
-	 * @param event A StateChangeEvent describing the event source
-	 * and the property's old and new values.
-	 */
-	void propertyChanged(PropertyChangeEvent event);
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/ReflectiveChangeListener.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/ReflectiveChangeListener.java
deleted file mode 100644
index 7a1e074..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/ReflectiveChangeListener.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.listener;
-
-import java.lang.reflect.Method;
-
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.internal.model.event.ChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.CollectionChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.ListChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.PropertyChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.StateChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.TreeChangeEvent;
-
-/**
- * This factory builds listeners that reflectively forward ChangeEvents.
- * If you are worried about having too many little classes that have to be
- * loaded and maintained by the class loader, you can use one of these.
- * Of course, this comes with the additional overhead of reflection....
- * Also note that the validity of the method name is not checked at compile
- * time, but at runtime; although we *do* check the method as soon as the
- * listener is instantiated.
- */
-public abstract class ReflectiveChangeListener {
-
-	/** the target object on which we will invoke the method */
-	protected final Object target;
-
-
-	protected static final Class<StateChangeEvent> STATE_CHANGE_EVENT_CLASS = StateChangeEvent.class;
-	@SuppressWarnings("unchecked")
-	protected static final Class<StateChangeEvent>[] STATE_CHANGE_EVENT_CLASS_ARRAY = new Class[] {STATE_CHANGE_EVENT_CLASS};
-	protected static final StateChangeEvent[] EMPTY_STATE_CHANGE_EVENT_ARRAY = new StateChangeEvent[0];
-
-	protected static final Class<PropertyChangeEvent> PROPERTY_CHANGE_EVENT_CLASS = PropertyChangeEvent.class;
-	@SuppressWarnings("unchecked")
-	protected static final Class<PropertyChangeEvent>[] PROPERTY_CHANGE_EVENT_CLASS_ARRAY = new Class[] {PROPERTY_CHANGE_EVENT_CLASS};
-	protected static final PropertyChangeEvent[] EMPTY_PROPERTY_CHANGE_EVENT_ARRAY = new PropertyChangeEvent[0];
-
-	protected static final Class<CollectionChangeEvent> COLLECTION_CHANGE_EVENT_CLASS = CollectionChangeEvent.class;
-	@SuppressWarnings("unchecked")
-	protected static final Class<CollectionChangeEvent>[] COLLECTION_CHANGE_EVENT_CLASS_ARRAY = new Class[] {COLLECTION_CHANGE_EVENT_CLASS};
-	protected static final CollectionChangeEvent[] EMPTY_COLLECTION_CHANGE_EVENT_ARRAY = new CollectionChangeEvent[0];
-
-	protected static final Class<ListChangeEvent> LIST_CHANGE_EVENT_CLASS = ListChangeEvent.class;
-	@SuppressWarnings("unchecked")
-	protected static final Class<ListChangeEvent>[] LIST_CHANGE_EVENT_CLASS_ARRAY = new Class[] {LIST_CHANGE_EVENT_CLASS};
-	protected static final ListChangeEvent[] EMPTY_LIST_CHANGE_EVENT_ARRAY = new ListChangeEvent[0];
-
-	protected static final Class<TreeChangeEvent> TREE_CHANGE_EVENT_CLASS = TreeChangeEvent.class;
-	@SuppressWarnings("unchecked")
-	protected static final Class<TreeChangeEvent>[] TREE_CHANGE_EVENT_CLASS_ARRAY = new Class[] {TREE_CHANGE_EVENT_CLASS};
-	protected static final TreeChangeEvent[] EMPTY_TREE_CHANGE_EVENT_ARRAY = new TreeChangeEvent[0];
-
-
-
-	// ********** helper methods **********
-
-	/**
-	 * Find and return a method implemented by the target that can be invoked
-	 * reflectively when a change event occurs.
-	 */
-	private static Method findChangeListenerMethod(Object target, String methodName, Class<? extends ChangeEvent>[] eventClassArray) {
-		Method method;
-		try {
-			method = ClassTools.method(target, methodName, eventClassArray);
-		} catch (NoSuchMethodException ex1) {
-			try {
-				method = ClassTools.method(target, methodName);
-			} catch (NoSuchMethodException ex2) {
-				throw new RuntimeException(ex2);  // "checked" exceptions bite
-			}
-		}
-		return method;
-	}
-
-	/**
-	 * Check whether the specified method is suitable for being invoked when a
-	 * change event has occurred. Throw an exception if it is not suitable.
-	 */
-	private static void checkChangeListenerMethod(Method method, Class<? extends ChangeEvent> eventClass) {
-		Class<?>[] parmTypes = method.getParameterTypes();
-		int parmTypesLength = parmTypes.length;
-		if (parmTypesLength == 0) {
-			return;
-		}
-		if ((parmTypesLength == 1) && parmTypes[0].isAssignableFrom(eventClass)) {
-			return;
-		}
-		throw new IllegalArgumentException(method.toString());
-	}
-
-
-	// ********** factory methods: StateChangeListener **********
-
-	/**
-	 * Construct a state change listener that will invoke the specified method
-	 * on the specified target.
-	 */
-	public static StateChangeListener buildStateChangeListener(Object target, Method method) {
-		checkChangeListenerMethod(method, STATE_CHANGE_EVENT_CLASS);
-		return new SingleMethodReflectiveChangeListener(target, method);
-	}
-
-	/**
-	 * Construct a state change listener that will invoke the specified method
-	 * on the specified target. If a single-argument method with the specified
-	 * name and appropriate argument is found, it will be invoked; otherwise,
-	 * a zero-argument method with the specified name will be invoked.
-	 */
-	public static StateChangeListener buildStateChangeListener(Object target, String methodName) {
-		return buildStateChangeListener(target, findChangeListenerMethod(target, methodName, STATE_CHANGE_EVENT_CLASS_ARRAY));
-	}
-
-
-	// ********** factory methods: PropertyChangeListener **********
-
-	/**
-	 * Construct a property change listener that will invoke the specified method
-	 * on the specified target.
-	 */
-	public static PropertyChangeListener buildPropertyChangeListener(Object target, Method method) {
-		checkChangeListenerMethod(method, PROPERTY_CHANGE_EVENT_CLASS);
-		return new SingleMethodReflectiveChangeListener(target, method);
-	}
-
-	/**
-	 * Construct a property change listener that will invoke the specified method
-	 * on the specified target. If a single-argument method with the specified
-	 * name and appropriate argument is found, it will be invoked; otherwise,
-	 * a zero-argument method with the specified name will be invoked.
-	 */
-	public static PropertyChangeListener buildPropertyChangeListener(Object target, String methodName) {
-		return buildPropertyChangeListener(target, findChangeListenerMethod(target, methodName, PROPERTY_CHANGE_EVENT_CLASS_ARRAY));
-	}
-
-
-	// ********** factory methods: CollectionChangeListener **********
-
-	/**
-	 * Construct a collection change listener that will invoke the specified methods
-	 * on the specified target.
-	 */
-	public static CollectionChangeListener buildCollectionChangeListener(Object target, Method addMethod, Method removeMethod, Method clearMethod, Method changeMethod) {
-		checkChangeListenerMethod(addMethod, COLLECTION_CHANGE_EVENT_CLASS);
-		checkChangeListenerMethod(removeMethod, COLLECTION_CHANGE_EVENT_CLASS);
-		checkChangeListenerMethod(clearMethod, COLLECTION_CHANGE_EVENT_CLASS);
-		checkChangeListenerMethod(changeMethod, COLLECTION_CHANGE_EVENT_CLASS);
-		return new MultiMethodReflectiveChangeListener(target, addMethod, removeMethod, clearMethod, changeMethod);
-	}
-
-	/**
-	 * Construct a collection change listener that will invoke the specified method
-	 * on the specified target for any change event.
-	 */
-	public static CollectionChangeListener buildCollectionChangeListener(Object target, Method method) {
-		return buildCollectionChangeListener(target, method, method, method, method);
-	}
-
-	/**
-	 * Construct a collection change listener that will invoke the specified methods
-	 * on the specified target for change events. If a single-argument method
-	 * with the specified name and appropriate argument is found, it will be invoked;
-	 * otherwise, a zero-argument method with the specified name will be invoked.
-	 */
-	public static CollectionChangeListener buildCollectionChangeListener(Object target, String addMethodName, String removeMethodName, String clearMethodName, String changeMethodName) {
-		return buildCollectionChangeListener(
-				target,
-				findChangeListenerMethod(target, addMethodName, COLLECTION_CHANGE_EVENT_CLASS_ARRAY),
-				findChangeListenerMethod(target, removeMethodName, COLLECTION_CHANGE_EVENT_CLASS_ARRAY),
-				findChangeListenerMethod(target, clearMethodName, COLLECTION_CHANGE_EVENT_CLASS_ARRAY),
-				findChangeListenerMethod(target, changeMethodName, COLLECTION_CHANGE_EVENT_CLASS_ARRAY)
-		);
-	}
-
-	/**
-	 * Construct a collection change listener that will invoke the specified method
-	 * on the specified target for any change event. If a single-argument method
-	 * with the specified name and appropriate argument is found, it will be invoked;
-	 * otherwise, a zero-argument method with the specified name will be invoked.
-	 */
-	public static CollectionChangeListener buildCollectionChangeListener(Object target, String methodName) {
-		return buildCollectionChangeListener(target, findChangeListenerMethod(target, methodName, COLLECTION_CHANGE_EVENT_CLASS_ARRAY));
-	}
-
-
-	// ********** factory methods: ListChangeListener **********
-
-	/**
-	 * Construct a list change listener that will invoke the specified methods
-	 * on the specified target.
-	 */
-	public static ListChangeListener buildListChangeListener(Object target, Method addMethod, Method removeMethod, Method replaceMethod, Method moveMethod, Method clearMethod, Method changeMethod) {
-		checkChangeListenerMethod(addMethod, LIST_CHANGE_EVENT_CLASS);
-		checkChangeListenerMethod(removeMethod, LIST_CHANGE_EVENT_CLASS);
-		checkChangeListenerMethod(replaceMethod, LIST_CHANGE_EVENT_CLASS);
-		checkChangeListenerMethod(moveMethod, LIST_CHANGE_EVENT_CLASS);
-		checkChangeListenerMethod(clearMethod, LIST_CHANGE_EVENT_CLASS);
-		checkChangeListenerMethod(changeMethod, LIST_CHANGE_EVENT_CLASS);
-		return new MultiMethodReflectiveChangeListener(target, addMethod, removeMethod, replaceMethod, moveMethod, clearMethod, changeMethod);
-	}
-
-	/**
-	 * Construct a list change listener that will invoke the specified method
-	 * on the specified target for any change event.
-	 */
-	public static ListChangeListener buildListChangeListener(Object target, Method method) {
-		return buildListChangeListener(target, method, method, method, method, method, method);
-	}
-
-	/**
-	 * Construct a list change listener that will invoke the specified methods
-	 * on the specified target for change events. If a single-argument method
-	 * with the specified name and appropriate argument is found, it will be invoked;
-	 * otherwise, a zero-argument method with the specified name will be invoked.
-	 */
-	public static ListChangeListener buildListChangeListener(Object target, String addMethodName, String removeMethodName, String replaceMethodName, String moveMethodName, String clearMethodName, String changeMethodName) {
-		return buildListChangeListener(
-				target,
-				findChangeListenerMethod(target, addMethodName, LIST_CHANGE_EVENT_CLASS_ARRAY),
-				findChangeListenerMethod(target, removeMethodName, LIST_CHANGE_EVENT_CLASS_ARRAY),
-				findChangeListenerMethod(target, replaceMethodName, LIST_CHANGE_EVENT_CLASS_ARRAY),
-				findChangeListenerMethod(target, moveMethodName, LIST_CHANGE_EVENT_CLASS_ARRAY),
-				findChangeListenerMethod(target, clearMethodName, LIST_CHANGE_EVENT_CLASS_ARRAY),
-				findChangeListenerMethod(target, changeMethodName, LIST_CHANGE_EVENT_CLASS_ARRAY)
-		);
-	}
-
-	/**
-	 * Construct a list change listener that will invoke the specified method
-	 * on the specified target for any change event. If a single-argument method
-	 * with the specified name and appropriate argument is found, it will be invoked;
-	 * otherwise, a zero-argument method with the specified name will be invoked.
-	 */
-	public static ListChangeListener buildListChangeListener(Object target, String methodName) {
-		return buildListChangeListener(target, findChangeListenerMethod(target, methodName, LIST_CHANGE_EVENT_CLASS_ARRAY));
-	}
-
-
-	// ********** factory methods: TreeChangeListener **********
-
-	/**
-	 * Construct a tree change listener that will invoke the specified methods
-	 * on the specified target.
-	 */
-	public static TreeChangeListener buildTreeChangeListener(Object target, Method addMethod, Method removeMethod, Method clearMethod, Method changeMethod) {
-		checkChangeListenerMethod(addMethod, TREE_CHANGE_EVENT_CLASS);
-		checkChangeListenerMethod(removeMethod, TREE_CHANGE_EVENT_CLASS);
-		checkChangeListenerMethod(clearMethod, TREE_CHANGE_EVENT_CLASS);
-		checkChangeListenerMethod(changeMethod, TREE_CHANGE_EVENT_CLASS);
-		return new MultiMethodReflectiveChangeListener(target, addMethod, removeMethod, clearMethod, changeMethod);
-	}
-
-	/**
-	 * Construct a tree change listener that will invoke the specified method
-	 * on the specified target for any change event.
-	 */
-	public static TreeChangeListener buildTreeChangeListener(Object target, Method method) {
-		return buildTreeChangeListener(target, method, method, method, method);
-	}
-
-	/**
-	 * Construct a tree change listener that will invoke the specified methods
-	 * on the specified target for change events. If a single-argument method
-	 * with the specified name and appropriate argument is found, it will be invoked;
-	 * otherwise, a zero-argument method with the specified name will be invoked.
-	 */
-	public static TreeChangeListener buildTreeChangeListener(Object target, String addMethodName, String removeMethodName, String clearMethodName, String changeMethodName) {
-		return buildTreeChangeListener(
-				target,
-				findChangeListenerMethod(target, addMethodName, TREE_CHANGE_EVENT_CLASS_ARRAY),
-				findChangeListenerMethod(target, removeMethodName, TREE_CHANGE_EVENT_CLASS_ARRAY),
-				findChangeListenerMethod(target, clearMethodName, TREE_CHANGE_EVENT_CLASS_ARRAY),
-				findChangeListenerMethod(target, changeMethodName, TREE_CHANGE_EVENT_CLASS_ARRAY)
-		);
-	}
-
-	/**
-	 * Construct a tree change listener that will invoke the specified method
-	 * on the specified target for any change event. If a single-argument method
-	 * with the specified name and appropriate argument is found, it will be invoked;
-	 * otherwise, a zero-argument method with the specified name will be invoked.
-	 */
-	public static TreeChangeListener buildTreeChangeListener(Object target, String methodName) {
-		return buildTreeChangeListener(target, findChangeListenerMethod(target, methodName, TREE_CHANGE_EVENT_CLASS_ARRAY));
-	}
-
-
-	// ********** constructor **********
-
-	/**
-	 * Construct a listener that will invoke the specified method
-	 * on the specified target.
-	 */
-	protected ReflectiveChangeListener(Object target) {
-		super();
-		this.target = target;
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/SingleMethodReflectiveChangeListener.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/SingleMethodReflectiveChangeListener.java
deleted file mode 100644
index 9602b84..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/SingleMethodReflectiveChangeListener.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.listener;
-
-import java.lang.reflect.Method;
-
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.internal.model.event.PropertyChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.StateChangeEvent;
-
-/**
- * This class is used by ReflectiveChangeListener when the requested listener
- * need only implement a single method (i.e. StateChangeListener or
- * PropertyChangeListener).
- */
-class SingleMethodReflectiveChangeListener
-	extends ReflectiveChangeListener
-	implements StateChangeListener, PropertyChangeListener
-{
-
-	/** the method we will invoke on the target object */
-	private final Method method;
-	/** cache the number of arguments */
-	private final boolean methodIsZeroArgument;
-
-	SingleMethodReflectiveChangeListener(Object target, Method method) {
-		super(target);
-		this.method = method;
-		this.methodIsZeroArgument = method.getParameterTypes().length == 0;
-	}
-
-
-	// ********** StateChangeListener implementation **********
-
-	public void stateChanged(StateChangeEvent event) {
-		if (this.methodIsZeroArgument) {
-			ClassTools.executeMethod(this.method, this.target, EMPTY_STATE_CHANGE_EVENT_ARRAY);
-		} else {
-			ClassTools.executeMethod(this.method, this.target, new StateChangeEvent[] {event});
-		}
-	}
-
-
-	// ********** PropertyChangeListener implementation **********
-
-	public void propertyChanged(PropertyChangeEvent event) {
-		if (this.methodIsZeroArgument) {
-			ClassTools.executeMethod(this.method, this.target, EMPTY_PROPERTY_CHANGE_EVENT_ARRAY);
-		} else {
-			ClassTools.executeMethod(this.method, this.target, new PropertyChangeEvent[] {event});
-		}
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/StateChangeListener.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/StateChangeListener.java
deleted file mode 100644
index 760b209..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/StateChangeListener.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.listener;
-
-import org.eclipse.jpt.utility.internal.model.event.StateChangeEvent;
-
-/**
- * A generic "state change" event gets delivered whenever a model changes to 
- * such extent that it cannot be delineated all aspects of it that have changed. 
- * You can register a StateChangeListener with a source model so as to be notified 
- * of any such changes.
- */
-public interface StateChangeListener extends ChangeListener {
-
-	/**
-	 * This method gets called when a model has changed in some general fashion.
-	 * 
-	 * @param event A StateChangeEvent describing the event source.
-	 */
-	void stateChanged(StateChangeEvent event);
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/TreeChangeAdapter.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/TreeChangeAdapter.java
deleted file mode 100644
index 897f4f8..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/TreeChangeAdapter.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.listener;
-
-import org.eclipse.jpt.utility.internal.model.event.TreeChangeEvent;
-
-/**
- * Convenience implementation of TreeChangeListener.
- */
-public class TreeChangeAdapter implements TreeChangeListener {
-
-	/**
-	 * Default constructor.
-	 */
-	public TreeChangeAdapter() {
-		super();
-	}
-
-	public void nodeAdded(TreeChangeEvent event) {
-		// do nothing
-	}
-
-	public void nodeRemoved(TreeChangeEvent event) {
-		// do nothing
-	}
-
-	public void treeCleared(TreeChangeEvent event) {
-		// do nothing
-	}
-
-	public void treeChanged(TreeChangeEvent event) {
-		// do nothing
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/TreeChangeListener.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/TreeChangeListener.java
deleted file mode 100644
index b0c87ca..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/model/listener/TreeChangeListener.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.model.listener;
-
-import org.eclipse.jpt.utility.internal.model.event.TreeChangeEvent;
-
-/**
- * A "tree change" event gets fired whenever a model changes a "bound"
- * tree. You can register a TreeChangeListener with a source
- * model so as to be notified of any bound tree updates.
- */
-public interface TreeChangeListener extends ChangeListener {
-
-	/**
-	 * This method gets called when a node is added to a bound tree.
-	 * 
-	 * @param event A TreeChangeEvent describing the event source,
-	 * the tree that changed, and the path to the node that was added.
-	 */
-	void nodeAdded(TreeChangeEvent event);
-
-	/**
-	 * This method gets called when a node is removed from a bound tree.
-	 * 
-	 * @param event A TreeChangeEvent describing the event source,
-	 * the tree that changed, and the path to the node that was removed.
-	 */
-	void nodeRemoved(TreeChangeEvent event);
-
-	/**
-	 * This method gets called when a bound tree is cleared.
-	 * 
-	 * @param event A TreeChangeEvent describing the event source,
-	 * the tree that changed, and an empty path.
-	 */
-	void treeCleared(TreeChangeEvent event);
-
-	/**
-	 * This method gets called when a portion of a bound tree is changed in
-	 * a manner that is not easily characterized by the other methods in this
-	 * interface.
-	 * 
-	 * @param event A TreeChangeEvent describing the event source,
-	 * the tree that changed, and the path to the branch of the
-	 * tree that changed.
-	 */
-	void treeChanged(TreeChangeEvent event);
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/AbstractNodeModel.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/AbstractNodeModel.java
deleted file mode 100644
index 2f90588..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/AbstractNodeModel.java
+++ /dev/null
@@ -1,998 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.node;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.Vector;
-
-import org.eclipse.jpt.utility.internal.iterators.CloneIterator;
-import org.eclipse.jpt.utility.internal.iterators.CloneListIterator;
-import org.eclipse.jpt.utility.internal.iterators.FilteringIterator;
-import org.eclipse.jpt.utility.internal.model.AbstractModel;
-import org.eclipse.jpt.utility.internal.model.ChangeEventDispatcher;
-import org.eclipse.jpt.utility.internal.model.ChangeSupport;
-
-/**
- * Base class for Node Model classes.
- * Provides support for the following:
- *     initialization
- *     enforced object identity wrt #equals()/#hashCode()
- *     containment hierarchy (parent/child)
- *     user comment
- *     dirty flag
- *     problems
- *     sorting
- * 
- * Typically, subclasses should consider implementing the following methods:
- *     the appropriate constructors
- *         (with the appropriately-restrictive type declaration for parent)
- *     #initialize()
- *     #initialize(Node parentNode)
- *     #checkParent(Node parentNode)
- *     #addChildrenTo(List list)
- *     #nodeRemoved(Node)
- *     #validator()
- *     #transientAspectNames() or
- *         #addTransientAspectNamesTo(Set transientAspectNames)
- *     #addProblemsTo(List currentProblems)
- *     #nonValidatedAspectNames()
- *         #addNonValidatedAspectNamesTo(Set nonValidatedAspectNames)
- *     #displayString()
- *     #toString(StringBuffer sb)
- */
-public abstract class AbstractNodeModel 
-	extends AbstractModel 
-	implements NodeModel 
-{
-
-	/** Containment hierarchy. */
-	private volatile Node parent;
-
-	/** User comment. */
-	private volatile String comment;
-		public static final String COMMENT_PROPERTY = "comment";
-
-	/** Track whether the node has changed. */
-	private volatile boolean dirty;
-	private volatile boolean dirtyBranch;
-
-	/**
-	 * The node's problems, as calculated during validation.
-	 * This list should only be modified via a ProblemSynchronizer,
-	 * allowing for asynchronous modification from another thread.
-	 */
-	private List<Problem> problems;		// pseudo-final
-		private static final Object[] EMPTY_PROBLEM_MESSAGE_ARGUMENTS = new Object[0];
-
-	/**
-	 * Cache the node's "branch" problems, as calculated during validation.
-	 * This list should only be modified via a ProblemSynchronizer,
-	 * allowing for asynchronous modification from another thread.
-	 * This must be recalculated every time this node or one of its
-	 * descendants changes it problems.
-	 */
-	private List<Problem> branchProblems;		// pseudo-final
-
-
-
-	/**
-	 * Sets of transient aspect names, keyed by class.
-	 * This is built up lazily, as the objects are modified.
-	 */
-	private static final Map<Class<? extends AbstractNodeModel>, Set<String>> transientAspectNameSets = new Hashtable<Class<? extends AbstractNodeModel>, Set<String>>();
-
-	/**
-	 * Sets of non-validated aspect names, keyed by class.
-	 * This is built up lazily, as the objects are modified.
-	 */
-	private static final Map<Class<? extends AbstractNodeModel>, Set<String>> nonValidatedAspectNameSets = new Hashtable<Class<? extends AbstractNodeModel>, Set<String>>();
-
-
-	// ********** constructors **********
-
-	/**
-	 * Most objects must have a parent.
-	 * Use this constructor to create a new node.
-	 * @see #initialize(Node)
-	 */
-	protected AbstractNodeModel(Node parent) {
-		super();
-		this.initialize(parent);
-	}
-
-
-	// ********** initialization **********
-
-	/**
-	 * Initialize a newly-created instance.
-	 * @see #initialize(Node)
-	 */
-	@Override
-	protected void initialize() {
-		super.initialize();
-		this.comment = "";
-
-		// a new object is dirty, by definition
-		this.dirty = true;
-		this.dirtyBranch = true;
-
-		this.problems = new Vector<Problem>();
-		this.branchProblems = new Vector<Problem>();
-
-	// when you override this method, don't forget to include:
-	//	super.initialize();
-	}
-
-	/**
-	 * Initialize a newly-created instance.
-	 * @see #initialize()
-	 */
-	protected void initialize(Node parentNode) {
-		this.checkParent(parentNode);
-		this.parent = parentNode;
-	// when you override this method, don't forget to include:
-	//	super.initialize(parentNode);
-	}
-
-	/**
-	 * Build a change support object that will notify the node
-	 * when one of the node's aspects has changed.
-	 * @see #aspectChanged(String)
-	 */
-	@Override
-	protected ChangeSupport buildChangeSupport() {
-		return new ChangeSupport(this) {
-			private static final long serialVersionUID = 1L;
-			@Override
-			protected ChangeEventDispatcher dispatcher() {
-				return AbstractNodeModel.this.changeEventDispatcher();
-			}
-			@Override
-			protected ChangeSupport buildChildChangeSupport() {
-				return AbstractNodeModel.this.buildChildChangeSupport();
-			}
-			@Override
-			protected void sourceChanged(String aspectName) {
-				super.sourceChanged(aspectName);
-				AbstractNodeModel.this.aspectChanged(aspectName);
-			}
-		};
-	}
-
-	/**
-	 * The aspect-specific change support objects do not need to
-	 * notify the node of changes (the parent will take care of that);
-	 * nor do they need to build "grandchildren" change support objects.
-	 */
-	protected ChangeSupport buildChildChangeSupport() {
-		return new ChangeSupport(this) {
-			private static final long serialVersionUID = 1L;
-			@Override
-			protected ChangeEventDispatcher dispatcher() {
-				return AbstractNodeModel.this.changeEventDispatcher();
-			}
-			@Override
-			protected ChangeSupport buildChildChangeSupport() {
-				// there are no grandchildren
-				throw new UnsupportedOperationException();
-			}
-		};
-	}
-
-
-	// ********** equality **********
-
-	/**
-	 * Enforce object identity - do not allow objects to be equal unless
-	 * they are the same object.
-	 * Do NOT override this method - we rely on object identity extensively.
-	 */
-	@Override
-	public final boolean equals(Object o) {
-		return this == o;
-	}
-
-	/**
-	 * Enforce object identity - do not allow objects to be equal unless
-	 * they are the same object.
-	 * Do NOT override this method - we rely on object identity extensively.
-	 */
-	@Override
-	public final int hashCode() {
-		return super.hashCode();
-	}
-
-
-	// ********** containment hierarchy (parent/children) **********
-
-	/**
-	 * INTRA-TREE API?
-	 * Return the node's parent in the containment hierarchy.
-	 * Most nodes must have a parent.
-	 */
-	public final Node parent() {
-		return this.parent;
-	}
-
-	/**
-	 * Throw an IllegalArgumentException if the parent is not valid
-	 * for the node.
-	 * By default require a non-null parent. Override if other restrictions exist
-	 * or the parent should be null.
-	 */
-	protected void checkParent(Node parentNode) {
-		if (parentNode == null) {
-			throw new IllegalArgumentException("The parent node cannot be null");
-		}
-	}
-
-	/**
-	 * INTRA-TREE API?
-	 * Return the node's children, which are also nodes.
-	 * Do NOT override this method.
-	 * Override #addChildrenTo(List).
-	 * @see #addChildrenTo(java.util.List)
-	 */
-	public final Iterator<Node> children() {
-		List<Node> children = new ArrayList<Node>();
-		this.addChildrenTo(children);
-		return children.iterator();
-	}
-
-	/**
-	 * Subclasses should override this method to add their children
-	 * to the specified list.
-	 * @see #children()
-	 */
-	protected void addChildrenTo(List<Node> list) {
-		// this class has no children, subclasses will...
-	// when you override this method, don't forget to include:
-	//	super.addChildrenTo(list);
-	}
-
-	/**
-	 * Return whether the node is a descendant of the specified node.
-	 * By definition, a node is a descendant of itself.
-	 */
-	public final boolean isDescendantOf(Node node) {
-		return (this == node) || this.parentIsDescendantOf(node);
-	}
-
-	protected boolean parentIsDescendantOf(Node node) {
-		return (this.parent != null) && this.parent.isDescendantOf(node);
-	}
-
-	/**
-	 * Return a collection holding all the node's "references", and all
-	 * the node's descendants' "references". "References" are
-	 * objects that are "referenced" by another object, as opposed
-	 * to "owned" by another object.
-	 */
-	public final Iterator<Node> branchReferences() {
-		Collection<Node> branchReferences = new ArrayList<Node>(1000);		// start big
-		this.addBranchReferencesTo(branchReferences);
-		return branchReferences.iterator();
-	}
-
-	/**
-	 * INTRA-TREE API
-	 * Add the node's "references", and all the node's descendants'
-	 * "references", to the specified collection. "References" are
-	 * objects that are "referenced" by another object, as opposed
-	 * to "owned" by another object.
-	 * This method is of particular concern to Handles, since most
-	 * (hopefully all) "references" are held by Handles.
-	 * @see Reference
-	 * @see #children()
-	 */
-	public final void addBranchReferencesTo(Collection<Node> branchReferences) {
-		for (Iterator<Node> stream = this.children(); stream.hasNext(); ) {
-			Node child = stream.next();		// pull out the child to ease debugging
-			child.addBranchReferencesTo(branchReferences);
-		}
-	}
-
-	/**
-	 * Return all the nodes in the object's branch of the tree,
-	 * including the node itself. The nodes will probably returned
-	 * in "depth-first" order.
-	 * Only really used for testing and debugging.
-	 */
-	public final Iterator<Node> allNodes() {
-		Collection<Node> nodes = new ArrayList<Node>(1000);		// start big
-		this.addAllNodesTo(nodes);
-		return nodes.iterator();
-	}
-
-	/**
-	 * INTRA-TREE API?
-	 * Add all the nodes in the object's branch of the tree,
-	 * including the node itself, to the specified collection.
-	 * Only really used for testing and debugging.
-	 */
-	public final void addAllNodesTo(Collection<Node> nodes) {
-		nodes.add(this);
-		for (Iterator<Node> stream = this.children(); stream.hasNext(); ) {
-			Node child = stream.next();		// pull out the child to ease debugging
-			child.addAllNodesTo(nodes);
-		}
-	}
-
-
-	// ********** model synchronization support **********
-
-	/**
-	 * INTRA-TREE API
-	 * This is a general notification that the specified node has been
-	 * removed from the tree. The node receiving this notification
-	 * should perform any necessary updates to remain in synch
-	 * with the tree (e.g. clearing out or replacing any references
-	 * to the removed node or any of the removed node's descendants).
-	 * @see #isDescendantOf(Node)
-	 */
-	public void nodeRemoved(Node node) {
-		for (Iterator<Node> stream = this.children(); stream.hasNext(); ) {
-			Node child = stream.next();		// pull out the child to ease debugging
-			child.nodeRemoved(node);
-		}
-	// when you override this method, don't forget to include:
-	//	super.nodeRemoved(node);
-	}
-
-	/**
-	 * convenience method
-	 * return whether node1 is a descendant of node2;
-	 * node1 can be null
-	 */
-	protected boolean nodeIsDescendantOf(Node node1, Node node2) {
-		return (node1 != null) && node1.isDescendantOf(node2);
-	}
-
-	/**
-	 * INTRA-TREE API
-	 * This is a general notification that the specified node has been
-	 * renamed. The node receiving this notification should mark its
-	 * branch dirty if necessary (i.e. it references the renamed node
-	 * or one of its descendants). This method is of particular concern
-	 * to Handles.
-	 * @see #isDescendantOf(Node)
-	 */
-	public void nodeRenamed(Node node) {
-		for (Iterator<Node> stream = this.children(); stream.hasNext(); ) {
-			Node child = stream.next();		// pull out the child to ease debugging
-			child.nodeRenamed(node);
-		}
-	// when you override this method, don't forget to include:
-	//	super.nodeRenamed(node);
-	}
-	
-	
-	// ********** user comment **********
-
-	/**
-	 * Return the object's user comment.
-	 */
-	public final String comment() {
-		return this.comment;
-	}
-
-	/**
-	 * Set the object's user comment.
-	 */
-	public final void setComment(String comment) {
-		Object old = this.comment;
-		this.comment = comment;
-		this.firePropertyChanged(COMMENT_PROPERTY, old, comment);
-	}
-
-
-	// ********** change support **********
-
-	/**
-	 * INTRA-TREE API
-	 * Return a change event dispatcher that will be used to dispatch
-	 * change notifications to listeners.
-	 * Typically only the root node directly holds a dispatcher.
-	 */
-	public ChangeEventDispatcher changeEventDispatcher() {
-		if (this.parent == null) {
-			throw new IllegalStateException("This node should not be firing change events during its construction.");
-		}
-		return this.parent.changeEventDispatcher();
-	}
-
-	/**
-	 * Set a change event dispatcher that will be used to dispatch
-	 * change notifications to listeners.
-	 * Typically only the root node directly holds a dispatcher.
-	 */
-	public void setChangeEventDispatcher(ChangeEventDispatcher changeEventDispatcher) {
-		if (this.parent == null) {
-			throw new IllegalStateException("This root node should implement #setChangeEventDispatcher(ChangeEventDispatcher).");
-		}
-		throw new UnsupportedOperationException("Only root nodes implement #setChangeEventDispatcher(ChangeEventDispatcher).");
-	}
-
-	/**
-	 * An aspect of the node has changed:
-	 * 	- if it is a persistent aspect, mark the object dirty
-	 * 	- if it is a significant aspect, validate the object
-	 */
-	protected void aspectChanged(String aspectName) {
-		if (this.aspectIsPersistent(aspectName)) {
-			// System.out.println(Thread.currentThread() + " dirty change: " + this + ": " + aspectName);
-			this.markDirty();
-		}
-		if (this.aspectChangeRequiresValidation(aspectName)) {
-			// System.out.println(Thread.currentThread() + " validation change: " + this + ": " + aspectName);
-			this.validator().validate();
-		}
-	}
-
-	/**
-	 * INTRA-TREE API
-	 * Return a validator that will be invoked whenever a
-	 * "validated" aspect of the node tree changes.
-	 * Typically only the root node directly holds a validator.
-	 */
-	public Node.Validator validator() {
-		if (this.parent == null) {
-			throw new IllegalStateException("This node should not be firing change events during its construction.");
-		}
-		return this.parent.validator();
-	}
-
-	/**
-	 * Set a validator that will be invoked whenever a
-	 * "validated" aspect of the node tree changes.
-	 * Typically only the root node directly holds a validator.
-	 */
-	public void setValidator(Node.Validator validator) {
-		if (this.parent == null) {
-			throw new IllegalStateException("This root node should implement #setValidator(Node.Validator).");
-		}
-		throw new UnsupportedOperationException("Only root nodes implement #setValidator(Node.Validator).");
-	}
-
-
-	// ********** dirty flag support **********
-
-	/**
-	 * Return whether any persistent aspects of the object
-	 * have changed since the object was last read or saved.
-	 * This does NOT include changes to the object's descendants.
-	 */
-	public final boolean isDirty() {
-		return this.dirty;
-	}
-
-	/**
-	 * Return whether any persistent aspects of the object,
-	 * or any of its descendants, have changed since the object and
-	 * its descendants were last read or saved.
-	 */
-	public final boolean isDirtyBranch() {
-		return this.dirtyBranch;
-	}
-
-	/**
-	 * Return whether the object is unmodified
-	 * since it was last read or saved.
-	 * This does NOT include changes to the object's descendants.
-	 */
-	public final boolean isClean() {
-		return ! this.dirty;
-	}
-
-	/**
-	 * Return whether the object and all of its descendants
-	 * are unmodified since the object and
-	 * its descendants were last read or saved.
-	 */
-	public final boolean isCleanBranch() {
-		return ! this.dirtyBranch;
-	}
-
-	/**
-	 * Set the dirty branch flag setting. This is set to true
-	 * when either the object or one of its descendants becomes dirty.
-	 */
-	private void setIsDirtyBranch(boolean dirtyBranch) {
-		boolean old = this.dirtyBranch;
-		this.dirtyBranch = dirtyBranch;
-		this.firePropertyChanged(DIRTY_BRANCH_PROPERTY, old, dirtyBranch);
-	}
-
-	/**
-	 * Mark the object as dirty and as a dirty branch.
-	 * An object is marked dirty when either a "persistent" attribute
-	 * has changed or its save location has changed.
-	 */
-	private void markDirty() {
-		this.dirty = true;
-		this.markBranchDirty();
-	}
-
-	/**
-	 * INTRA-TREE API
-	 * Mark the node and its parent as dirty branches.
-	 * This message is propagated up the containment
-	 * tree when a particular node becomes dirty.
-	 */
-	public void markBranchDirty() {
-		// short-circuit any unnecessary propagation
-		if (this.dirtyBranch) {
-			// if this is already a dirty branch, the parent must be also
-			return;
-		}
-
-		this.setIsDirtyBranch(true);
-		this.markParentBranchDirty();
-	}
-
-	protected void markParentBranchDirty() {
-		if (this.parent != null) {
-			this.parent.markBranchDirty();
-		}
-	}
-
-	/**
-	 * Mark the object and all its descendants as dirty.
-	 * This is used when the save location of some
-	 * top-level object is changed and the entire
-	 * containment tree must be marked dirty so it
-	 * will be written out.
-	 */
-	public final void markEntireBranchDirty() {
-		this.markDirty();
-		for (Iterator<Node> stream = this.children(); stream.hasNext(); ) {
-			Node child = stream.next();		// pull out the child to ease debugging
-			child.markEntireBranchDirty();
-		}
-	}
-
-	/**
-	 * Mark the object and all its descendants as clean.
-	 * Then notify the object's parent that it (the parent)
-	 * might now be a clean branch also.
-	 * Typically used when the object has just been
-	 * read in or written out.
-	 */
-	public final void markEntireBranchClean() {
-		this.cascadeMarkEntireBranchClean();
-		this.markParentBranchCleanIfPossible();
-	}
-
-	protected void markParentBranchCleanIfPossible() {
-		if (this.parent != null) {
-			this.parent.markBranchCleanIfPossible();
-		}
-	}
-
-	/**
-	 * INTRA-TREE API
-	 * Mark the node and all its descendants as clean.
-	 * Typically used when the node has just been
-	 * read in or written out.
-	 * This method is for internal use only; it is not for
-	 * client use.
-	 * Not the best of method names.... :-(
-	 */
-	public final void cascadeMarkEntireBranchClean() {
-		for (Iterator<Node> stream = this.children(); stream.hasNext(); ) {
-			Node child = stream.next();		// pull out the child to ease debugging
-			child.cascadeMarkEntireBranchClean();
-		}
-		this.dirty = false;
-		this.setIsDirtyBranch(false);
-	}
-
-	/**
-	 * INTRA-TREE API
-	 * A child node's branch has been marked clean. If the node
-	 * itself is clean and if all of its children are also clean, the
-	 * node's branch can be marked clean. Then, if the node's
-	 * branch is clean, the node will notify its parent that it might
-	 * be clean also. This message is propagated up the containment
-	 * tree when a particular node becomes clean.
-	 */
-	public final void markBranchCleanIfPossible() {
-		// short-circuit any unnecessary propagation
-		if (this.dirty) {
-			// if the object is "locally" dirty, it is still a dirty branch
-			return;
-		}
-
-		for (Iterator<Node> stream = this.children(); stream.hasNext(); ) {
-			Node child = stream.next();		// pull out the child to ease debugging
-			if (child.isDirtyBranch()) {
-				return;
-			}
-		}
-
-		this.setIsDirtyBranch(false);
-		this.markParentBranchCleanIfPossible();
-	}
-
-	private boolean aspectIsPersistent(String aspectName) {
-		return ! this.aspectIsTransient(aspectName);
-	}
-
-	private boolean aspectIsTransient(String aspectName) {
-		return this.transientAspectNames().contains(aspectName);
-	}
-
-	/**
-	 * Return a set of the object's transient aspect names.
-	 * These are the aspects that, when they change, will NOT cause the
-	 * object to be marked dirty.
-	 * If you need instance-based calculation of your transient aspects,
-	 * override this method. If class-based calculation is sufficient,
-	 * override #addTransientAspectNamesTo(Set).
-	 */
-	protected final Set<String> transientAspectNames() {
-		synchronized (transientAspectNameSets) {
-			Set<String> transientAspectNames = transientAspectNameSets.get(this.getClass());
-			if (transientAspectNames == null) {
-				transientAspectNames = new HashSet<String>();
-				this.addTransientAspectNamesTo(transientAspectNames);
-				transientAspectNameSets.put(this.getClass(), transientAspectNames);
-			}
-			return transientAspectNames;
-		}
-	}
-
-	/**
-	 * Add the object's transient aspect names to the specified set.
-	 * These are the aspects that, when they change, will NOT cause the
-	 * object to be marked dirty.
-	 * If class-based calculation of your transient aspects is sufficient,
-	 * override this method. If you need instance-based calculation,
-	 * override #transientAspectNames().
-	 */
-	protected void addTransientAspectNamesTo(Set<String> transientAspectNames) {
-		transientAspectNames.add(DIRTY_BRANCH_PROPERTY);
-		transientAspectNames.add(BRANCH_PROBLEMS_LIST);
-		transientAspectNames.add(HAS_BRANCH_PROBLEMS_PROPERTY);
-	// when you override this method, don't forget to include:
-	//	super.addTransientAspectNamesTo(transientAspectNames);
-	}
-
-	/**
-	 * Return the dirty nodes in the object's branch of the tree,
-	 * including the node itself (if appropriate).
-	 * Only really used for testing and debugging.
-	 */
-	public final Iterator<Node> allDirtyNodes() {
-		return new FilteringIterator<Node>(this.allNodes()) {
-			@Override
-			protected boolean accept(Object o) {
-				return (o instanceof AbstractNodeModel) && ((AbstractNodeModel) o).isDirty();
-			}
-		};
-	}
-
-
-	// ********** problems **********
-
-	/**
-	 * Return the node's problems.
-	 * This does NOT include the problems of the node's descendants.
-	 * @see #branchProblems()
-	 */
-	public final Iterator<Problem> problems() {
-		return new CloneIterator<Problem>(this.problems);	// removes are not allowed
-	}
-
-	/**
-	 * Return the size of the node's problems.
-	 * This does NOT include the problems of the node's descendants.
-	 * @see #branchProblemsSize()
-	 */
-	public final int problemsSize() {
-		return this.problems.size();
-	}
-
-	/**
-	 * Return whether the node has problems
-	 * This does NOT include the problems of the node's descendants.
-	 * @see #hasBranchProblems()
-	 */
-	public final boolean hasProblems() {
-		return ! this.problems.isEmpty();
-	}
-
-	/**
-	 * Return all the node's problems along with all the
-	 * node's descendants' problems.
-	 */
-	public final ListIterator<Problem> branchProblems() {
-		return new CloneListIterator<Problem>(this.branchProblems);	// removes are not allowed
-	}
-
-	/**
-	 * Return the size of all the node's problems along with all the
-	 * node's descendants' problems.
-	 */
-	public final int branchProblemsSize() {
-		return this.branchProblems.size();
-	}
-
-	/**
-	 * Return whether the node or any of its descendants have problems.
-	 */
-	public final boolean hasBranchProblems() {
-		return ! this.branchProblems.isEmpty();
-	}
-
-	public final boolean containsBranchProblem(Problem problem) {
-		return this.branchProblems.contains(problem);
-	}
-
-	protected final Problem buildProblem(String messageKey, Object[] messageArguments) {
-		return new DefaultProblem(this, messageKey, messageArguments);
-	}
-
-	protected final Problem buildProblem(String messageKey) {
-		return this.buildProblem(messageKey, EMPTY_PROBLEM_MESSAGE_ARGUMENTS);
-	}
-
-	protected final Problem buildProblem(String messageKey, Object messageArgument) {
-		return this.buildProblem(messageKey, new Object[] {messageArgument});
-	}
-
-	protected final Problem buildProblem(String messageKey, Object messageArgument1, Object messageArgument2) {
-		return this.buildProblem(messageKey, new Object[] {messageArgument1, messageArgument2});
-	}
-
-	protected final Problem buildProblem(String messageKey, Object messageArgument1, Object messageArgument2, Object messageArgument3) {
-		return this.buildProblem(messageKey, new Object[] {messageArgument1, messageArgument2, messageArgument3});
-	}
-
-	/**
-	 * Validate the node and all of its descendants,
-	 * and update their sets of "branch" problems.
-	 * If the node's "branch" problems have changed,
-	 * notify the node's parent.
-	 */
-	public void validateBranch() {
-		if (this.validateBranchInternal()) {
-			// if our "branch" problems have changed, then
-			// our parent must rebuild its "branch" problems also
-			this.rebuildParentBranchProblems();
-		}
-	}
-
-	protected void rebuildParentBranchProblems() {
-		if (this.parent != null) {
-			this.parent.rebuildBranchProblems();
-		}
-	}
-
-	/**
-	 * INTRA-TREE API
-	 * Validate the node and all of its descendants,
-	 * and update their sets of "branch" problems.
-	 * Return true if the collection of "branch" problems has changed.
-	 * This method is for internal use only; it is not for
-	 * client use.
-	 */
-	public boolean validateBranchInternal() {
-		// rebuild "branch" problems in children first
-		for (Iterator<Node> stream = this.children(); stream.hasNext(); ) {
-			Node child = stream.next();		// pull out the child to ease debugging
-			// ignore the return value because we are going to rebuild our "branch"
-			// problems no matter what, to see if they have changed
-			child.validateBranchInternal();
-		}
-
-		this.problems.clear();
-		this.addProblemsTo(this.problems);
-
-		return this.checkBranchProblems();
-	}
-
-	/**
-	 * Check for any problems and add them to the specified list.
-	 * This method should ONLY add problems for this particular node;
-	 * it should NOT add problems for any of this node's descendants
-	 * or ancestors. (Although there will be times when it is debatable
-	 * as to which node a problem "belongs" to....)
-	 * 
-	 * NB: This method should NOT modify ANY part of the node's state!
-	 * It is a READ-ONLY behavior. ONLY the list of current problems
-	 * passed in to the method should be modified.
-	 */
-	protected void addProblemsTo(List<Problem> currentProblems) {
-		// The default is to do nothing.
-		// When you override this method, don't forget to include:
-	//	super.addProblemsTo(currentProblems);
-	}
-
-	/**
-	 * Rebuild the "branch" problems and return whether they have
-	 * changed.
-	 * NB: The entire collection of "branch" problems must be re-calculated
-	 * with EVERY "significant" change - we cannot keep it in synch via
-	 * change notifications because if a descendant with problems is
-	 * removed or replaced we will not receive notification that its
-	 * problems were removed from our "branch" problems.
-	 */
-	private boolean checkBranchProblems() {
-		List<Problem> oldBranchProblems = new Vector<Problem>(this.branchProblems);
-		int oldSize = this.branchProblems.size();
-
-		this.branchProblems.clear();
-		this.branchProblems.addAll(this.problems);
-		for (Iterator<Node> stream = this.children(); stream.hasNext(); ) {
-			Node child = stream.next();		// pull out the child to ease debugging
-			child.addBranchProblemsTo(this.branchProblems);
-		}
-
-		// if the size has changed to or from zero, our virtual flag has changed
-		int newSize = this.branchProblems.size();
-		if ((oldSize == 0) && (newSize != 0)) {
-			this.firePropertyChanged(HAS_BRANCH_PROBLEMS_PROPERTY, false, true);
-		} else if ((oldSize != 0) && (newSize == 0)) {
-			this.firePropertyChanged(HAS_BRANCH_PROBLEMS_PROPERTY, true, false);
-		}
-
-		if (oldBranchProblems.equals(this.branchProblems)) {
-			return false;		// our "branch" problems did not change
-		}
-		// our "branch" problems changed
-		this.fireListChanged(BRANCH_PROBLEMS_LIST);
-		return true;
-	}
-
-	/**
-	 * INTRA-TREE API
-	 * Add all the problems of the node and all
-	 * the problems of its descendants to the
-	 * specified collection.
-	 */
-	public final void addBranchProblemsTo(List<Problem> list) {
-		list.addAll(this.branchProblems);
-	}
-
-	/**
-	 * INTRA-TREE API
-	 * A child node's "branch" problems changed;
-	 * therefore the node's "branch" problems have changed also and
-	 * must be rebuilt.
-	 */
-	public final void rebuildBranchProblems() {
-		if ( ! this.checkBranchProblems()) {
-			throw new IllegalStateException("we should not get here unless our \"branch\" problems have changed");
-		}
-		this.rebuildParentBranchProblems();
-	}
-
-	/**
-	 * Clear the node's "branch" problems and the "branch"
-	 * problems of all of its descendants.
-	 * If the node's "branch" problems have changed,
-	 * notify the node's parent.
-	 */
-	public final void clearAllBranchProblems() {
-		if (this.clearAllBranchProblemsInternal()) {
-			// if our "branch" problems have changed, then
-			// our parent must rebuild its "branch" problems also
-			this.rebuildParentBranchProblems();
-		}
-	}
-
-	/**
-	 * INTRA-TREE API
-	 * Clear the node's "branch" problems and the "branch"
-	 * problems of all of its descendants.
-	 * Return true if the collection of "branch" problems has changed.
-	 * This method is for internal use only; it is not for
-	 * client use.
-	 */
-	public final boolean clearAllBranchProblemsInternal() {
-		if (this.branchProblems.isEmpty()) {
-			return false;
-		}
-		for (Iterator<Node> stream = this.children(); stream.hasNext(); ) {
-			Node child = stream.next();		// pull out the child to ease debugging
-			// ignore the return value because we are going to clear our "branch"
-			// problems no matter what
-			child.clearAllBranchProblemsInternal();
-		}
-		this.problems.clear();
-		this.branchProblems.clear();
-		this.firePropertyChanged(HAS_BRANCH_PROBLEMS_PROPERTY, true, false);
-		this.fireListChanged(BRANCH_PROBLEMS_LIST);
-		return true;
-	}
-
-	/**
-	 * Return whether a change to specified aspect requires a re-validation
-	 * of the node's tree.
-	 */
-	private boolean aspectChangeRequiresValidation(String aspectName) {
-		return ! this.aspectChangeDoesNotRequireValidation(aspectName);
-	}
-
-	private boolean aspectChangeDoesNotRequireValidation(String aspectName) {
-		return this.nonValidatedAspectNames().contains(aspectName);
-	}
-
-	/**
-	 * Return a set of the object's "non-validated" aspect names.
-	 * These are the aspects that, when they change, will NOT cause the
-	 * object (or its containing tree) to be validated, i.e. checked for problems.
-	 * If you need instance-based calculation of your "non-validated" aspects,
-	 * override this method. If class-based calculation is sufficient,
-	 * override #addNonValidatedAspectNamesTo(Set).
-	 */
-	protected final Set<String> nonValidatedAspectNames() {
-		synchronized (nonValidatedAspectNameSets) {
-			Set<String> nonValidatedAspectNames = nonValidatedAspectNameSets.get(this.getClass());
-			if (nonValidatedAspectNames == null) {
-				nonValidatedAspectNames = new HashSet<String>();
-				this.addNonValidatedAspectNamesTo(nonValidatedAspectNames);
-				nonValidatedAspectNameSets.put(this.getClass(), nonValidatedAspectNames);
-			}
-			return nonValidatedAspectNames;
-		}
-	}
-
-	/**
-	 * Add the object's "non-validated" aspect names to the specified set.
-	 * These are the aspects that, when they change, will NOT cause the
-	 * object (or its containing tree) to be validated, i.e. checked for problems.
-	 * If class-based calculation of your "non-validated" aspects is sufficient,
-	 * override this method. If you need instance-based calculation,
-	 * override #nonValidatedAspectNames().
-	 */
-	protected void addNonValidatedAspectNamesTo(Set<String> nonValidatedAspectNames) {
-		nonValidatedAspectNames.add(COMMENT_PROPERTY);
-		nonValidatedAspectNames.add(DIRTY_BRANCH_PROPERTY);
-		nonValidatedAspectNames.add(BRANCH_PROBLEMS_LIST);
-		nonValidatedAspectNames.add(HAS_BRANCH_PROBLEMS_PROPERTY);
-	// when you override this method, don't forget to include:
-	//	super.addNonValidatedAspectNamesTo(nonValidatedAspectNames);
-	}
-
-
-	// ********** display methods **********
-
-	/**
-	 * Compare display strings.
-	 */
-	public int compareTo(Node node) {
-		return DEFAULT_COMPARATOR.compare(this, node);
-	}
-
-	/**
-	 * Return a developer-friendly String. If you want something useful for
-	 * displaying in a user interface, use #displayString().
-	 * If you want to give more information in your #toString(),
-	 * override #toString(StringBuffer sb). 
-	 * Whatever you add to that string buffer will show up between the parentheses.
-	 * @see oracle.toplink.workbench.utility.AbstractModel#toString(StringBuffer sb)
-	 * @see #displayString()
-	 */
-	@Override
-	public final String toString() {
-		return super.toString();
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/AsynchronousValidator.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/AsynchronousValidator.java
deleted file mode 100644
index 58b3e3f..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/AsynchronousValidator.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.node;
-
-import org.eclipse.jpt.utility.internal.StringTools;
-import org.eclipse.jpt.utility.internal.SynchronizedBoolean;
-
-/**
- * This implementation of the PluggableValidator.Delegate interface
- * simply sets a shared "validate" flag to true. This should trigger a
- * separate "validation" thread to begin validating the appropriate
- * branch of nodes.
- */
-public class AsynchronousValidator
-	implements PluggableValidator.Delegate
-{
-	private SynchronizedBoolean validateFlag;
-
-	/**
-	 * Construct a validator delegate with the specified shared
-	 * "validate" flag. This flag should be shared with
-	 * another thread that will perform the actual validation.
-	 */
-	public AsynchronousValidator(SynchronizedBoolean validateFlag) {
-		super();
-		this.validateFlag = validateFlag;
-	}
-
-	/**
-	 * Set the shared "validate" flag to true, triggering
-	 * an asynchronous validation of the appropriate
-	 * branch of nodes.
-	 * @see PluggableValidator.Delegate#validate()
-	 */
-	public void validate() {
-		this.validateFlag.setTrue();
-	}
-
-	@Override
-	public String toString() {
-		return StringTools.buildToStringFor(this, this.validateFlag);
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/DefaultProblem.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/DefaultProblem.java
deleted file mode 100644
index 75f5741..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/DefaultProblem.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.node;
-
-import java.util.Arrays;
-
-import org.eclipse.jpt.utility.internal.StringTools;
-
-/**
- * This class is a straightforward implementation of the Problem interface.
- */
-public class DefaultProblem
-	implements Problem
-{
-	private final Node source;
-	private final String messageKey;
-	private final Object[] messageArguments;
-
-
-	DefaultProblem(Node source, String messageKey, Object[] messageArguments) {
-		super();
-		this.source = source;
-		this.messageKey = messageKey;
-		this.messageArguments = messageArguments;
-	}
-
-
-	// ********** Problem implementation **********
-
-	public Node source() {
-		return this.source;
-	}
-
-	public String messageKey() {
-		return this.messageKey;
-	}
-
-	public Object[] messageArguments() {
-		return this.messageArguments;
-	}
-
-
-	// ********** Object overrides **********
-
-	/**
-	 * We implement #equals(Object) because problems are repeatedly
-	 * re-calculated and the resulting problems merged with the existing
-	 * set of problems; and we want to keep the original problems and
-	 * ignore any freshly-generated duplicates.
-	 * Also, problems are not saved to disk....
-	 */
-	@Override
-	public boolean equals(Object o) {
-		if ( ! (o instanceof Problem)) {
-			return false;
-		}
-		Problem other = (Problem) o;
-		return this.source == other.source()
-				&& this.messageKey.equals(other.messageKey())
-				&& Arrays.equals(this.messageArguments, other.messageArguments());
-	}
-
-	@Override
-	public int hashCode() {
-		return this.source.hashCode() ^ this.messageKey.hashCode();
-	}
-
-	@Override
-	public String toString() {
-		return StringTools.buildToStringFor(this, this.messageKey);
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/Node.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/Node.java
deleted file mode 100644
index 51ed92e..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/Node.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.node;
-
-import java.text.Collator;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.jpt.utility.internal.StringTools;
-import org.eclipse.jpt.utility.internal.model.ChangeEventDispatcher;
-
-/**
- * This interface defines the methods that must be implemented
- * by any class whose instances are to be part of a containment hierarchy
- * that supports a "dirty" state and validation "problems".
- * 
- * Note: Methods marked "INTRA-TREE API" are typically only used by
- * the nodes themselves, as opposed to clients of the nodes. These
- * methods are called by a node on either its parent or its children.
- */
-public interface Node extends Comparable<Node> {
-
-
-	// ********** containment hierarchy (parent/children) **********
-
-	/**
-	 * INTRA-TREE API?
-	 * Return the node's children, which are also nodes.
-	 */
-	Iterator<Node> children();
-
-	/**
-	 * INTRA-TREE API?
-	 * Return the node's parent in the containment hierarchy.
-	 * Most nodes must have a parent.
-	 */
-	Node parent();
-
-	/**
-	 * Return whether the node is a descendant of the specified node.
-	 * By definition, a node is a descendant of itself.
-	 */
-	boolean isDescendantOf(Node node);
-
-	/**
-	 * INTRA-TREE API
-	 * Add the node's "references", and all the node's descendants'
-	 * "references", to the specified collection. "References" are
-	 * objects that are "referenced" by another object, as opposed
-	 * to "owned" by another object.
-	 * This method is of particular concern to Handles, since most
-	 * (hopefully all) "references" are held by Handles.
-	 * @see Reference
-	 * @see #children()
-	 */
-	void addBranchReferencesTo(Collection<Node> branchReferences);
-
-	/**
-	 * INTRA-TREE API?
-	 * Add all the nodes in the object's branch of the tree,
-	 * including the node itself, to the specified collection.
-	 * Only really used for testing and debugging.
-	 */
-	void addAllNodesTo(Collection<Node> nodes);
-
-
-	// ********** model synchronization support **********
-
-	/**
-	 * INTRA-TREE API
-	 * This is a general notification that the specified node has been
-	 * removed from the tree. The node receiving this notification
-	 * should perform any necessary updates to remain in synch
-	 * with the tree (e.g. clearing out or replacing any references
-	 * to the removed node or any of the removed node's descendants).
-	 * @see #isDescendantOf(Node)
-	 */
-	void nodeRemoved(Node node);
-
-	/**
-	 * INTRA-TREE API
-	 * This is a general notification that the specified node has been
-	 * renamed. The node receiving this notification should mark its
-	 * branch dirty if necessary (i.e. it references the renamed node
-	 * or one of its descendants). This method is of particular concern
-	 * to Handles.
-	 * @see #isDescendantOf(Node)
-	 */
-	void nodeRenamed(Node node);
-	
-
-	// ********** dirty flag support **********
-
-	/**
-	 * Return whether any persistent aspects of the node,
-	 * or any of its descendants, have changed since the node and
-	 * its descendants were last read or saved.
-	 */
-	boolean isDirtyBranch();
-		String DIRTY_BRANCH_PROPERTY = "dirtyBranch";
-
-	/**
-	 * INTRA-TREE API
-	 * Mark the node and its parent as dirty branches.
-	 * This message is propagated up the containment
-	 * tree when a particular node becomes dirty.
-	 */
-	void markBranchDirty();
-
-	/**
-	 * Mark the node and all its descendants as dirty.
-	 * This is used when the save location of some
-	 * top-level node is changed and the entire
-	 * containment tree must be marked dirty so it
-	 * will be written out.
-	 */
-	void markEntireBranchDirty();
-
-	/**
-	 * INTRA-TREE API
-	 * A child node's branch has been marked clean. If the node
-	 * itself is clean and if all of its children are also clean, the
-	 * node's branch can be marked clean. Then, if the node's
-	 * branch is clean, the node will notify its parent that it might
-	 * be clean also. This message is propagated up the containment
-	 * tree when a particular node becomes clean.
-	 */
-	void markBranchCleanIfPossible();
-
-	/**
-	 * INTRA-TREE API
-	 * Mark the node and all its descendants as clean.
-	 * Typically used when the node has just been
-	 * read in or written out.
-	 * This method is for internal use only; it is not for
-	 * client use.
-	 * Not the best of method names.... :-(
-	 */
-	void cascadeMarkEntireBranchClean();
-
-
-	// ********** change support **********
-
-	/**
-	 * INTRA-TREE API
-	 * Return a change event dispatcher that will be used to dispatch
-	 * change notifications to listeners.
-	 * Typically only the root node directly holds a dispatcher.
-	 */
-	ChangeEventDispatcher changeEventDispatcher();
-
-	/**
-	 * Set a change event dispatcher that will be used to dispatch
-	 * change notifications to listeners.
-	 * Typically only the root node directly holds a dispatcher.
-	 */
-	void setChangeEventDispatcher(ChangeEventDispatcher changeEventDispatcher);
-
-
-	// ********** problems **********
-
-	/**
-	 * INTRA-TREE API
-	 * Return a validator that will be invoked whenever a
-	 * "validated" aspect of the node tree changes.
-	 * Typically only the root node directly holds a validator.
-	 */
-	Validator validator();
-
-	/**
-	 * Set a validator that will be invoked whenever a
-	 * "validated" aspect of the node tree changes.
-	 * Typically only the root node directly holds a validator.
-	 */
-	void setValidator(Validator validator);
-
-	/**
-	 * Validate the node and its descendants.
-	 * This is an explicit request invoked by a client; and it will
-	 * typically be followed by a call to one of the following methods:
-	 * 	#branchProblems()
-	 * 	#hasBranchProblems()
-	 * Whether the node maintains its problems on the fly
-	 * or waits until this method is called is determined by the
-	 * implementation.
-	 * @see Problem
-	 */
-	void validateBranch();
-
-	/**
-	 * INTRA-TREE API
-	 * Validate the node and all of its descendants,
-	 * and update their sets of "branch" problems.
-	 * Return true if the collection of "branch" problems has changed.
-	 * This method is for internal use only; it is not for
-	 * client use.
-	 */
-	boolean validateBranchInternal();
-
-	/**
-	 * Return all the node's problems along with all the
-	 * node's descendants' problems.
-	 */
-	ListIterator<Problem> branchProblems();
-		String BRANCH_PROBLEMS_LIST = "branchProblems";
-
-	/**
-	 * Return the size of all the node's problems along with all the
-	 * node's descendants' problems.
-	 */
-	int branchProblemsSize();
-
-	/**
-	 * Return whether the node or any of its descendants have problems.
-	 */
-	boolean hasBranchProblems();
-		String HAS_BRANCH_PROBLEMS_PROPERTY = "hasBranchProblems";
-
-	/**
-	 * Return whether the node contains the specified branch problem.
-	 */
-	boolean containsBranchProblem(Problem problem);
-
-	/**
-	 * INTRA-TREE API
-	 * Something changed, rebuild the node's collection of branch problems.
-	 */
-	void rebuildBranchProblems();
-
-	/**
-	 * INTRA-TREE API
-	 * Add the node's problems, and all the node's descendants'
-	 * problems, to the specified list.
-	 * A call to this method should be immediately preceded by a call to
-	 * #validateBranch() or all of the problems might not be
-	 * added to the list.
-	 * @see Problem
-	 */
-	void addBranchProblemsTo(List<Problem> branchProblems);
-
-	/**
-	 * Clear the node's "branch" problems and the "branch"
-	 * problems of all of its descendants.
-	 */
-	void clearAllBranchProblems();
-
-	/**
-	 * INTRA-TREE API
-	 * Clear the node's "branch" problems and the "branch"
-	 * problems of all of its descendants.
-	 * Return true if the collection of "branch" problems has changed.
-	 * This method is for internal use only; it is not for
-	 * client use.
-	 */
-	boolean clearAllBranchProblemsInternal();
-
-
-	// ********** displaying/sorting **********
-
-	/**
-	 * Return a string representation of the model, suitable for sorting.
-	 */
-	String displayString();
-
-
-	// ********** sub-interfaces **********
-
-	/**
-	 * Simple interface defining a "reference" between two nodes.
-	 * @see Node#addBranchReferencesTo(java.util.Collection)
-	 */
-	interface Reference {
-
-		/**
-		 * Return the "source" node of the reference, i.e. the node that
-		 * references the "target" node.
-		 */
-		Node source();
-
-		/**
-		 * Return the "target" node of the reference, i.e. the node that
-		 * is referenced by the "source" node.
-		 */
-		Node target();
-
-	}
-
-
-	/**
-	 * A validator will validate a node as appropriate.
-	 * Typically the validation will
-	 * 	- occur whenever a node has changed
-	 * 	- encompass the entire tree containing the node
-	 * 	- execute asynchronously
-	 */
-	interface Validator {
-
-		/**
-		 * A "significant" aspect has changed;
-		 * validate the node as appropriate
-		 */
-		void validate();
-
-		/**
-		 * Stop all validation of the node until #resume() is called.
-		 * This can be used to improve the performance of any long-running
-		 * action that triggers numerous changes to the node. Be sure to
-		 * match a call to this method with a corresponding call to
-		 * #resume().
-		 */
-		void pause();
-
-		/**
-		 * Resume validation of the node. This method can only be
-		 * called after a matching call to #pause().
-		 */
-		void resume();
-
-	}
-
-
-	// ********** helper implementations **********
-
-	/**
-	 * Straightforward implementation of the Reference interface
-	 * defined above.
-	 */
-	public class SimpleReference implements Reference {
-		private Node source;
-		private Node target;
-		public SimpleReference(Node source, Node target) {
-			super();
-			if (source == null || target == null) {
-				throw new NullPointerException();
-			}
-			this.source = source;
-			this.target = target;
-		}
-		public Node source() {
-			return this.source;
-		}
-		public Node target() {
-			return this.target;
-		}
-		@Override
-		public String toString() {
-			return StringTools.buildToStringFor(this, this.source + " => " + this.target);
-		}
-	}
-
-	/**
-	 * Typical comparator that can be used to sort a collection of nodes.
-	 * Sort based on display string:
-	 * 	- identical objects are equal (which means that cannot
-	 * 		co-exist in a SortedSet)
-	 * 	- use the default collator (which typically interleaves
-	 * 		lower- and upper-case letters)
-	 * 	- allow duplicate display strings (from different objects)
-	 * 	- try to return consistent results for same object pairs
-	 */
-	Comparator<Node> DEFAULT_COMPARATOR =
-		new Comparator<Node>() {
-			public int compare(Node node1, Node node2) {
-				// disallow duplicates based on object identity
-				if (node1 == node2) {
-					return 0;
-				}
-
-				// first compare display strings using the default collator
-				int result = Collator.getInstance().compare(node1.displayString(), node2.displayString());
-				if (result != 0) {
-					return result;
-				}
-
-				// then compare using object-id
-				result = System.identityHashCode(node1) - System.identityHashCode(node2);
-				if (result != 0) {
-					return result;
-				}
-
-				// It's unlikely that we get to this point; but, just in case, we will return -1.
-				// Unfortunately, this introduces some mild unpredictability to the sort order
-				// (unless the objects are always passed into this method in the same order).
-				return -1;		// if all else fails, indicate that o1 < o2
-			}
-			@Override
-			public String toString() {
-				return "Node.DEFAULT_COMPARATOR";
-			}
-		};
-
-
-	/**
-	 * This validator does nothing to validate the node.
-	 */
-	Validator NULL_VALIDATOR =
-		new PluggableValidator(PluggableValidator.Delegate.NULL_DELEGATE) {
-			@Override
-			public String toString() {
-				return "Node.NULL_VALIDATOR";
-			}
-		};
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/NodeModel.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/NodeModel.java
deleted file mode 100644
index c5eebb0..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/NodeModel.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.node;
-
-import org.eclipse.jpt.utility.internal.model.Model;
-
-/**
- * Some nodes are models....
- */
-public interface NodeModel extends Node, Model {
-	// no additional behavior
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/PluggableValidator.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/PluggableValidator.java
deleted file mode 100644
index 9a21a6e..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/PluggableValidator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.node;
-
-import org.eclipse.jpt.utility.internal.StringTools;
-import org.eclipse.jpt.utility.internal.SynchronizedBoolean;
-
-/**
- * This implementation of the Validator interface implements the
- * pause/resume portion of the protocol, but delegates the actual
- * validation to a "pluggable" delegate.
- */
-public class PluggableValidator implements Node.Validator {
-	private boolean pause;
-	private Delegate delegate;
-
-
-	/**
-	 * Convenience factory method.
-	 */
-	public static Node.Validator buildAsynchronousValidator(SynchronizedBoolean validateFlag) {
-		return new PluggableValidator(new AsynchronousValidator(validateFlag));
-	}
-
-	/**
-	 * Convenience factory method.
-	 */
-	public static Node.Validator buildSynchronousValidator(Node node) {
-		return new PluggableValidator(new SynchronousValidator(node));
-	}
-
-	/**
-	 * Construct a validator with the specified delegate.
-	 */
-	public PluggableValidator(Delegate delegate) {
-		super();
-		this.pause = false;
-		this.delegate = delegate;
-	}
-
-	public void validate() {
-		if ( ! this.pause) {
-			this.delegate.validate();
-		}
-	}
-
-	public void pause() {
-		if (this.pause) {
-			throw new IllegalStateException("already paused");
-		}
-		this.pause = true;
-	}
-
-	public void resume() {
-		if ( ! this.pause) {
-			throw new IllegalStateException("not paused");
-		}
-		this.pause = false;
-		// validate all the changes that occurred while the validation was paused
-		this.delegate.validate();
-	}
-
-	@Override
-	public String toString() {
-		return StringTools.buildToStringFor(this, this.delegate);
-	}
-
-
-	// ********** member interface **********
-
-	/**
-	 * Interface implemented by any delegates of a pluggable validator.
-	 */
-	public interface Delegate {
-
-		/**
-		 * The validator is not "paused" - perform the appropriate validation.
-		 */
-		void validate();
-
-
-		/**
-		 * This delegate does nothing.
-		 */
-		Delegate NULL_DELEGATE =
-			new PluggableValidator.Delegate() {
-				public void validate() {
-					// do nothing
-				}
-				@Override
-				public String toString() {
-					return "NULL_DELEGATE";
-				}
-			};
-
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/Problem.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/Problem.java
deleted file mode 100644
index 4f8e730..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/Problem.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.node;
-
-/**
- * Define an interface describing the problems associated with a node.
- */
-public interface Problem {
-
-	/**
-	 * Return the node most closely associated with the problem.
-	 */
-	Node source();
-
-	/**
-	 * Return a key that can be used to uniquely identify the problem's message.
-	 */
-	String messageKey();
-
-	/**
-	 * Return the arguments associate with the problem's message.
-	 */
-	Object[] messageArguments();
-
-	/**
-	 * Return whether the problem is equal to the specified object.
-	 * It is equal if the specified object is a implementation of the
-	 * Problem interface and its source, message key, and message
-	 * arguments are all equal to this problem's.
-	 */
-	boolean equals(Object o);
-
-	/**
-	 * Return the problem's hash code, which should calculated as an
-	 * XOR of the source's hash code and the message key's hash code.
-	 */
-	int hashCode();
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/RunnableValidation.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/RunnableValidation.java
deleted file mode 100644
index 3be7c0d..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/RunnableValidation.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.node;
-
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
-import java.util.logging.Logger;
-
-import org.eclipse.jpt.utility.internal.SynchronizedBoolean;
-
-/**
- * This implementation of Runnable will asynchronously validate
- * a branch of nodes. It will wait until a shared "validate" flag is
- * set to validate the branch. Once the the branch is validated,
- * the thread will quiesce until the flag is set again.
- * 
- * There are two ways to stop this thread:
- * 	- Thread.interrupt()
- * 	- set the "continue" flag to false
- * For now, these two are equivalent; but in the future we might
- * pass the "continue" flag to the Node.validate(Node.ProblemSynchronizer)
- * method so we can short-circuit the validation instead of waiting
- * until the entire branch is validated.
- */
-public class RunnableValidation
-	implements Runnable
-{
-	/** The node whose branch this thread will validate. */
-	private Node node;
-
-	/** When this flag is set to true, we kick off the validation routine. */
-	private SynchronizedBoolean validateFlag;
-
-	/** When this flag is set to false, we allow this thread to die. */
-	private SynchronizedBoolean continueFlag;
-
-	/** Log any exceptions encountered during validation with the following settings. */
-	private Logger exceptionLogger;
-	private Level exceptionLevel;
-	private String exceptionMessage;
-
-
-	/**
-	 * Construct a validation thread.
-	 */
-	public RunnableValidation(
-			Node node,
-			SynchronizedBoolean validateFlag,
-			SynchronizedBoolean continueFlag,
-			Logger exceptionLogger,
-			Level exceptionLevel,
-			String exceptionMessage
-	) {
-		super();
-		this.node = node;
-		this.validateFlag = validateFlag;
-		this.continueFlag = continueFlag;
-		this.exceptionLogger = exceptionLogger;
-		this.exceptionLevel = exceptionLevel;
-		this.exceptionMessage = exceptionMessage;
-	}
-
-
-	// ********** Runnable Implementation **********
-
-	/**
-	 * Loop while the "continue" flag is true and the thread
-	 * has not been interrupted by another thread.
-	 * In each loop: Wait until the "validate" flag is set to true,
-	 * then set it back to false and validate the branch of nodes.
-	 */
-	public void run() {
-		while (this.continueFlag.isTrue()) {
-			try {
-				this.validateFlag.waitToSetFalse();
-			} catch (InterruptedException ex) {
-				// we were interrupted while waiting, must be quittin' time
-				return;
-			}
-			this.validateNode();
-		}
-	}
-
-	/**
-	 * Validate the node, logging any exceptions.
-	 * If an exception occurs, we terminate the validation until the
-	 * "validation" flag is set again. Some exceptions occur because
-	 * of concurrent changes to the model that occur *after* validation
-	 * starts but before it completes an entire pass over the model. If that
-	 * is the case, things should be OK; because the exception will be
-	 * caught and the "validation" flag will have been set again *during* the
-	 * initial validation pass. So when we return from catching the exception
-	 * we will simply re-start the validation, hopefully with the model in
-	 * a consistent state that will prevent another exception from
-	 * occurring. Of course, if we have any exceptions that are *not*
-	 * the result of the model being in an inconsistent state, we will
-	 * probably fill the log; and those exceptions are bugs that need
-	 * to be fixed. (!) Hopefully the user will notice the enormous log and
-	 * contact support....  ~bjv
-	 */
-	private void validateNode() {
-		try {
-			this.node.validateBranch();
-		} catch (Throwable ex) {
-			this.logException(ex);
-		}
-	}
-
-	/**
-	 * We need to do all this because Logger#log(LogRecord) does not pass through
-	 * Logger#doLog(LogRecord) like all the other Logger#log(...) methods.
-	 */
-	private void logException(Throwable ex) {
-		LogRecord logRecord = new LogRecord(this.exceptionLevel, this.exceptionMessage);
-		logRecord.setParameters(new Object[] { this.node.displayString() });
-		logRecord.setThrown(ex);
-		logRecord.setLoggerName(this.exceptionLogger.getName());
-		logRecord.setResourceBundle(this.exceptionLogger.getResourceBundle());
-		this.exceptionLogger.log(logRecord);
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/SynchronousValidator.java b/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/SynchronousValidator.java
deleted file mode 100644
index 7ff3204..0000000
--- a/jpa/plugins/org.eclipse.jpt.utility/src/org/eclipse/jpt/utility/internal/node/SynchronousValidator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.internal.node;
-
-import org.eclipse.jpt.utility.internal.StringTools;
-
-/**
- * This implementation of the PluggableValidator.Delegate interface
- * will validate the node immediately.
- * 
- * This is useful for debugging in a single thread or generating
- * problem reports.
- */
-public class SynchronousValidator
-	implements PluggableValidator.Delegate
-{
-	private Node node;
-
-	/**
-	 * Construct a validator that will immediately validate the
-	 * specified node.
-	 */
-	public SynchronousValidator(Node node) {
-		super();
-		this.node = node;
-	}
-
-	public void validate() {
-		this.node.validateBranch();
-	}
-
-	@Override
-	public String toString() {
-		return StringTools.buildToStringFor(this, this.node);
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.core.tests.extension.resource/.classpath b/jpa/tests/org.eclipse.jpt.core.tests.extension.resource/.classpath
index 751c8f2..304e861 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests.extension.resource/.classpath
+++ b/jpa/tests/org.eclipse.jpt.core.tests.extension.resource/.classpath
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/jpa/tests/org.eclipse.jpt.core.tests.extension.resource/META-INF/MANIFEST.MF b/jpa/tests/org.eclipse.jpt.core.tests.extension.resource/META-INF/MANIFEST.MF
index a519fdf..13e7e66 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests.extension.resource/META-INF/MANIFEST.MF
+++ b/jpa/tests/org.eclipse.jpt.core.tests.extension.resource/META-INF/MANIFEST.MF
@@ -5,7 +5,6 @@
 Bundle-SymbolicName: org.eclipse.jpt.core.tests.extension.resource;singleton:=true
 Bundle-Version: 1.0.0.qualifier
 Bundle-Activator: org.eclipse.jpt.core.tests.extension.resource.ExtensionTestPlugin
-Bundle-ClassPath: .
 Bundle-Localization: plugin
 Eclipse-LazyStart: true
 Require-Bundle: org.eclipse.core.runtime,
@@ -21,4 +20,4 @@
  org.eclipse.jpt.utility,
  org.eclipse.core.resources
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.jpt.core.tests.extension.resource
+Export-Package: org.eclipse.jpt.core.tests.extension.resource;x-friends:="org.eclipse.jpt.ui.tests"
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/.cvsignore b/jpa/tests/org.eclipse.jpt.core.tests/.cvsignore
index c4ba612..ba077a4 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/.cvsignore
+++ b/jpa/tests/org.eclipse.jpt.core.tests/.cvsignore
@@ -1,5 +1 @@
 bin
-@dot
-temp.folder
-build.xml
-javaCompiler...args
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/META-INF/MANIFEST.MF b/jpa/tests/org.eclipse.jpt.core.tests/META-INF/MANIFEST.MF
index 79512c4..be27b10 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/META-INF/MANIFEST.MF
+++ b/jpa/tests/org.eclipse.jpt.core.tests/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-SymbolicName: org.eclipse.jpt.core.tests
-Bundle-Version: 1.1.0
+Bundle-Version: 1.0.0
 Bundle-Localization: plugin
 Require-Bundle: org.eclipse.core.resources,
  org.eclipse.core.runtime,
@@ -12,7 +12,6 @@
  org.eclipse.jdt.core,
  org.eclipse.jem,
  org.eclipse.jpt.core,
- org.eclipse.jpt.core.tests.extension.resource,
  org.eclipse.jpt.utility,
  org.eclipse.wst.common.emf,
  org.eclipse.wst.common.project.facet.core,
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/JptAllCoreTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/JptAllCoreTests.java
deleted file mode 100644
index 59ef19a..0000000
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/JptAllCoreTests.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.core.tests.internal;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import org.eclipse.jpt.core.tests.internal.content.java.mappings.JptCoreContentJavaMappingsTests;
-import org.eclipse.jpt.core.tests.internal.jdtutility.JptCoreJdtUtilityTests;
-import org.eclipse.jpt.core.tests.internal.model.JptCoreModelTests;
-import org.eclipse.jpt.core.tests.internal.platform.JptCorePlatformTests;
-
-/**
- * Runs all JPT Core Tests.  Currently we do not have a jpa.jar checked in to cvs. 
- * As a result we cannot run any tests that depend on that jar during the build.  In
- * our dev environments we should run JptAllCoreTests until we have jpa.jar checked in.
- * In the build we should continue to run JptCoreTests.
- */
-public class JptAllCoreTests {
-
-	public static Test suite() {
-		return suite(true);
-	}
-	
-	public static Test suite(boolean all) {
-		String quantity = all ? "All" : "Most";
-		TestSuite suite = new TestSuite(quantity + " JPT Core Tests");
-		suite.addTest(JptCoreContentJavaMappingsTests.suite(all));
-		suite.addTest(JptCoreModelTests.suite(all));
-		suite.addTest(JptCoreJdtUtilityTests.suite(all));
-		suite.addTest(JptCorePlatformTests.suite(all));
-		return suite;
-	}
-	
-	private JptAllCoreTests() {
-		super();
-		throw new UnsupportedOperationException();
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/JptCoreTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/JptCoreTests.java
index e5fb618..baf5150 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/JptCoreTests.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/JptCoreTests.java
@@ -10,16 +10,24 @@
 package org.eclipse.jpt.core.tests.internal;
 
 import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.eclipse.jpt.core.tests.internal.content.java.mappings.JptCoreContentJavaMappingsTests;
+import org.eclipse.jpt.core.tests.internal.jdtutility.JptCoreJdtUtilityTests;
+import org.eclipse.jpt.core.tests.internal.model.JptCoreModelTests;
+import org.eclipse.jpt.core.tests.internal.platform.JptCorePlatformTests;
 
 /**
- * Runs most JPT Core Tests.  Currently we do not have a jpa.jar checked in to cvs. 
- * As a result we cannot run any tests that depend on that jar during the build.  In
- * our dev environments we should run JptAllCoreTests until we have jpa.jar checked in.
+ * Runs all JPT Core Tests
  */
 public class JptCoreTests {
 
 	public static Test suite() {
-		return JptAllCoreTests.suite(false);
+		TestSuite suite = new TestSuite(JptCoreTests.class.getName());
+		suite.addTest(JptCoreContentJavaMappingsTests.suite());
+		suite.addTest(JptCoreModelTests.suite());
+		suite.addTest(JptCoreJdtUtilityTests.suite());
+		suite.addTest(JptCorePlatformTests.suite());
+		return suite;
 	}
 	
 	private JptCoreTests() {
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/content/java/mappings/JavaEntityTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/content/java/mappings/JavaEntityTests.java
index 9cabce9..3716edf 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/content/java/mappings/JavaEntityTests.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/content/java/mappings/JavaEntityTests.java
@@ -10,8 +10,8 @@
 package org.eclipse.jpt.core.tests.internal.content.java.mappings;
 
 import java.util.Iterator;
+
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jpt.core.internal.IMappingKeys;
 import org.eclipse.jpt.core.internal.content.java.IJavaTypeMapping;
 import org.eclipse.jpt.core.internal.content.java.mappings.JPA;
 import org.eclipse.jpt.utility.internal.iterators.ArrayIterator;
@@ -94,10 +94,11 @@
 		assertEquals(TYPE_NAME, typeMapping.getName());
 	}
 
-	public void testGetKey() throws Exception {
-		this.createTestEntity1();
-		IJavaTypeMapping typeMapping = this.javaPersistentTypeNamed(FULLY_QUALIFIED_TYPE_NAME).getMapping();
-		assertEquals(IMappingKeys.ENTITY_TYPE_MAPPING_KEY, typeMapping.getKey());
-	}
-
+// TODO we can only execute 1 test for now...
+//	public void testGetKey() throws Exception {
+//		this.createTestEntity1();
+//		IJavaTypeMapping typeMapping = this.javaPersistentTypeNamed(FULLY_QUALIFIED_TYPE_NAME).getMapping();
+//		assertEquals(IMappingKeys.ENTITY_TYPE_MAPPING_KEY, typeMapping.getKey());
+//	}
+//
 }
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/content/java/mappings/JpaJavaTestCase.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/content/java/mappings/JpaJavaTestCase.java
index b2f08d0..d229964 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/content/java/mappings/JpaJavaTestCase.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/content/java/mappings/JpaJavaTestCase.java
@@ -21,7 +21,6 @@
 import org.eclipse.jpt.core.tests.internal.jdtutility.AnnotationTestCase;
 import org.eclipse.jpt.core.tests.internal.projects.TestJavaProject;
 import org.eclipse.jpt.core.tests.internal.projects.TestJpaProject;
-import org.eclipse.jpt.core.tests.internal.projects.TestPlatformProject;
 import org.eclipse.jpt.utility.internal.ClassTools;
 
 public abstract class JpaJavaTestCase extends AnnotationTestCase {
@@ -32,7 +31,7 @@
 
 	@Override
 	protected TestJavaProject buildJavaProject(String projectName, boolean autoBuild) throws Exception {
-		return new TestJpaProject(TestPlatformProject.uniqueProjectName(projectName), autoBuild);
+		return new TestJpaProject(projectName, autoBuild);
 	}
 
 	protected TestJpaProject jpaProject() {
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/content/java/mappings/JptCoreContentJavaMappingsTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/content/java/mappings/JptCoreContentJavaMappingsTests.java
index 044f390..ae58b6e 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/content/java/mappings/JptCoreContentJavaMappingsTests.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/content/java/mappings/JptCoreContentJavaMappingsTests.java
@@ -15,14 +15,8 @@
 public class JptCoreContentJavaMappingsTests {
 
 	public static Test suite() {
-		return suite(true);
-	}
-	
-	public static Test suite(boolean all) {
 		TestSuite suite = new TestSuite(JptCoreContentJavaMappingsTests.class.getName());
-		if (all) {
-			suite.addTestSuite(JavaEntityTests.class);
-		}
+		suite.addTestSuite(JavaEntityTests.class);
 		return suite;
 	}
 
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/jdtutility/JDTToolsTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/jdtutility/JDTToolsTests.java
index 706e606..5176595 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/jdtutility/JDTToolsTests.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/jdtutility/JDTToolsTests.java
@@ -9,7 +9,7 @@
  ******************************************************************************/
 package org.eclipse.jpt.core.tests.internal.jdtutility;
 
-import org.eclipse.jdt.core.dom.Name;
+import org.eclipse.jdt.core.Signature;
 import org.eclipse.jpt.core.internal.jdtutility.ConversionDeclarationAnnotationElementAdapter;
 import org.eclipse.jpt.core.internal.jdtutility.DeclarationAnnotationAdapter;
 import org.eclipse.jpt.core.internal.jdtutility.DeclarationAnnotationElementAdapter;
@@ -23,6 +23,84 @@
 		super(name);
 	}
 
+	public void testResolveSignature1() throws Exception {
+		this.verifyResolveSignature("String", "java.lang.String");
+	}
+
+	public void testResolveSignature2() throws Exception {
+		this.verifyResolveSignature("List", null);
+	}
+
+	public void testResolveSignature3() throws Exception {
+		this.verifyResolveSignature("int", "int");
+	}
+
+	public void testResolveSignature4() throws Exception {
+		this.verifyResolveSignature("void", "void");
+	}
+
+	public void testResolveSignature5() throws Exception {
+		this.verifyResolveSignature("int[]", "int[]");
+	}
+
+	public void testResolveSignature6() throws Exception {
+		this.verifyResolveSignature("String[]", "java.lang.String[]");
+	}
+
+	public void testResolveSignature7() throws Exception {
+		this.verifyResolveSignature("java.util.List[][][]", "java.util.List[][][]");
+	}
+
+	public void testResolveSignature8a() throws Exception {
+		// inner class
+		this.verifyResolveSignature("java.util.Map.Entry", "java.util.Map.Entry");
+	}
+
+	public void testResolveSignature8b() throws Exception {
+		// inner class
+		this.createTestType("java.util.Map", "");
+		this.verifyResolveSignature2("Map.Entry", "java.util.Map.Entry");
+	}
+
+	public void testResolveSignature8c() throws Exception {
+		// inner class
+		this.createTestType("java.util.Map.Entry", "");
+		this.verifyResolveSignature2("Entry", "java.util.Map.Entry");
+	}
+
+	public void testResolveSignature9() throws Exception {
+		// inner class
+		this.verifyResolveSignature("Character.Subset", "java.lang.Character.Subset");
+	}
+
+	public void testResolveSignature10() throws Exception {
+		// generic type
+		this.verifyResolveSignature("java.util.List<java.lang.String>", "java.util.List");  // ????
+	}
+
+	public void testResolveSignature11() throws Exception {
+		// annotation
+		this.createTestType("java.lang.annotation.Target", "");
+		this.verifyResolveSignature2("Target", "java.lang.annotation.Target");
+	}
+
+	public void testResolveSignature12() throws Exception {
+		this.createTestType("java.lang.annotation.ElementType", "");
+		this.verifyResolveSignature2("ElementType", "java.lang.annotation.ElementType");
+	}
+
+	private void verifyResolveSignature(String unresolvedTypeName, String expected) throws Exception {
+		this.createTestType();
+		this.verifyResolveSignature2(unresolvedTypeName, expected);
+	}
+
+	private void verifyResolveSignature2(String unresolvedTypeName, String expected) throws Exception {
+		String signature = Signature.createTypeSignature(unresolvedTypeName, false);
+		String actual = JDTTools.resolveSignature(signature, this.jdtType());
+		assertEquals(expected, actual);
+	}
+
+
 	private void createEnumAndMembers(String enumName, String enumBody) throws Exception {
 		this.javaProject.createType("enums", enumName + ".java", "public enum " + enumName + " { " + enumBody + " }");
 	}
@@ -40,7 +118,7 @@
 		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forStrings(daa, "foo");
 		FieldAttribute field = this.idField();
 
-		String actual = JDTTools.resolveEnum((Name) field.annotationElementExpression(daea));
+		String actual = JDTTools.resolveEnum(this.jdtType().getCompilationUnit(), field.annotationElementExpression(daea));
 		assertEquals("enums.TestEnum.BAZ", actual);
 	}
 
@@ -53,7 +131,7 @@
 		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forStrings(daa, "foo");
 		FieldAttribute field = this.idField();
 
-		String actual = JDTTools.resolveEnum((Name) field.annotationElementExpression(daea));
+		String actual = JDTTools.resolveEnum(this.jdtType().getCompilationUnit(), field.annotationElementExpression(daea));
 		assertEquals("enums.TestEnum.BAZ", actual);
 	}
 
@@ -66,7 +144,7 @@
 		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forStrings(daa, "foo");
 		FieldAttribute field = this.idField();
 
-		String actual = JDTTools.resolveEnum((Name) field.annotationElementExpression(daea));
+		String actual = JDTTools.resolveEnum(this.jdtType().getCompilationUnit(), field.annotationElementExpression(daea));
 		assertEquals("enums.TestEnum.BAZ", actual);
 	}
 
@@ -79,7 +157,7 @@
 		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forStrings(daa, "foo");
 		FieldAttribute field = this.idField();
 
-		String actual = JDTTools.resolveEnum((Name) field.annotationElementExpression(daea));
+		String actual = JDTTools.resolveEnum(this.jdtType().getCompilationUnit(), field.annotationElementExpression(daea));
 		assertEquals("enums.TestEnum.BAZ", actual);
 	}
 
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/jdtutility/JptCoreJdtUtilityTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/jdtutility/JptCoreJdtUtilityTests.java
index 717d512..6290451 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/jdtutility/JptCoreJdtUtilityTests.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/jdtutility/JptCoreJdtUtilityTests.java
@@ -15,10 +15,6 @@
 public class JptCoreJdtUtilityTests {
 
 	public static Test suite() {
-		return suite(true);
-	}
-	
-	public static Test suite(boolean all) {
 		TestSuite suite = new TestSuite(JptCoreJdtUtilityTests.class.getName());
 		suite.addTestSuite(CombinationIndexedDeclarationAnnotationAdapterTests.class);
 		suite.addTestSuite(DefaultAnnotationEditFormatterTests.class);
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/jdtutility/MemberAnnotationElementAdapterTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/jdtutility/MemberAnnotationElementAdapterTests.java
index b07c314..9f16dc1 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/jdtutility/MemberAnnotationElementAdapterTests.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/jdtutility/MemberAnnotationElementAdapterTests.java
@@ -11,6 +11,12 @@
 
 import java.util.Arrays;
 
+import org.eclipse.jdt.core.dom.BooleanLiteral;
+import org.eclipse.jdt.core.dom.CharacterLiteral;
+import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.NumberLiteral;
+import org.eclipse.jdt.core.dom.StringLiteral;
+import org.eclipse.jdt.core.dom.TypeLiteral;
 import org.eclipse.jpt.core.internal.ITextRange;
 import org.eclipse.jpt.core.internal.jdtutility.ASTNodeTextRange;
 import org.eclipse.jpt.core.internal.jdtutility.AnnotationElementAdapter;
@@ -59,7 +65,7 @@
 		this.createAnnotationAndMembers("Foo", "int bar();");
 		this.createTestType("@annot.Foo(bar=48)");
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa, "bar", NumberStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, NumberLiteral>(daa, "bar", NumberStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 		assertEquals("48", aea.getValue());
 	}
@@ -68,7 +74,7 @@
 		this.createAnnotationAndMembers("Foo", "char bar();");
 		this.createTestType("@annot.Foo(bar='c')");
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa, "bar", CharacterStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, CharacterLiteral>(daa, "bar", CharacterStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 		assertEquals("c", aea.getValue());
 	}
@@ -77,7 +83,7 @@
 		this.createAnnotationAndMembers("Foo", "boolean bar();");
 		this.createTestType("@annot.Foo(bar=false)");
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa, "bar", BooleanStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, BooleanLiteral>(daa, "bar", BooleanStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 		assertEquals("false", aea.getValue());
 	}
@@ -90,7 +96,7 @@
 		DeclarationAnnotationAdapter daa1 = new SimpleDeclarationAnnotationAdapter("annot.Foo");
 		DeclarationAnnotationAdapter daa2 = new NestedDeclarationAnnotationAdapter(daa1, "value", "annot.Bar");
 		DeclarationAnnotationAdapter daa3 = new NestedDeclarationAnnotationAdapter(daa2, "jimmy", "annot.Baz");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa3, "fred", BooleanStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, BooleanLiteral>(daa3, "fred", BooleanStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 		assertEquals("false", aea.getValue());
 	}
@@ -99,7 +105,7 @@
 		this.createAnnotationAndMembers("Foo", "boolean value();");
 		this.createTestType("@annot.Foo(false)");
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa, BooleanStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, BooleanLiteral>(daa, BooleanStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 		assertEquals("false", aea.getValue());
 	}
@@ -135,197 +141,6 @@
 		assertNull(aea.getValue());
 	}
 
-	public void testGetValueStringConcatenation() throws Exception {
-		this.createAnnotationAndMembers("Foo", "String bar();");
-		this.createTestType("@annot.Foo(bar=\"xxx\" + \"yyy\" + \"zzz\")");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forStrings(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertEquals("xxxyyyzzz", aea.getValue());
-	}
-
-	public void testGetValueStringConstant() throws Exception {
-		this.createAnnotationAndMembers("Foo", "String bar();");
-		// just a bit hacky:
-		this.createTestType("private static final String FOO_BAR = \"xxx\"; @annot.Foo(bar=FOO_BAR + \"yyy\" + \"zzz\")");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forStrings(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertEquals("xxxyyyzzz", aea.getValue());
-	}
-
-	public void testGetValueNumberArithmetic() throws Exception {
-		this.createAnnotationAndMembers("Foo", "int bar();");
-		this.createTestType("@annot.Foo(bar=47 - 7 + 2 * 1 / 1)");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forNumbers(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertEquals("42", aea.getValue());
-	}
-
-	public void testGetValueNumberShift() throws Exception {
-		this.createAnnotationAndMembers("Foo", "int bar();");
-		this.createTestType("@annot.Foo(bar=2 << 2)");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forNumbers(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertEquals("8", aea.getValue());
-	}
-
-	public void testGetValueNumberConstant() throws Exception {
-		this.createAnnotationAndMembers("Foo", "int bar();");
-		// just a bit hacky:
-		this.createTestType("private static final int FOO_BAR = 77; @annot.Foo(bar=FOO_BAR)");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forNumbers(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertEquals("77", aea.getValue());
-	}
-
-	public void testGetValueCharacterConstant() throws Exception {
-		this.createAnnotationAndMembers("Foo", "char bar();");
-		// just a bit hacky:
-		this.createTestType("private static final char FOO_BAR = 'Q'; @annot.Foo(bar=FOO_BAR)");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forCharacters(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertEquals("Q", aea.getValue());
-	}
-
-	public void testGetValueCharacterCast() throws Exception {
-		this.createAnnotationAndMembers("Foo", "char bar();");
-		this.createTestType("@annot.Foo(bar=(char) 0x41)");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forCharacters(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertEquals("A", aea.getValue());
-	}
-
-	public void testGetValueBooleanOperator1() throws Exception {
-		this.createAnnotationAndMembers("Foo", "boolean bar();");
-		this.createTestType("@annot.Foo(bar=7 > 2)");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forBooleans(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertEquals("true", aea.getValue());
-	}
-
-	public void testGetValueBooleanOperator2() throws Exception {
-		this.createAnnotationAndMembers("Foo", "boolean bar();");
-		this.createTestType("@annot.Foo(bar=7 == 2)");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forBooleans(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertEquals("false", aea.getValue());
-	}
-
-	public void testGetValueBooleanOperator3() throws Exception {
-		this.createAnnotationAndMembers("Foo", "boolean bar();");
-		this.createTestType("@annot.Foo(bar=(7 != 2) && false)");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forBooleans(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertEquals("false", aea.getValue());
-	}
-
-	public void testGetValueBooleanOperator4() throws Exception {
-		this.createAnnotationAndMembers("Foo", "boolean bar();");
-		this.createTestType("@annot.Foo(bar=(7 != 2) ? false : true)");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forBooleans(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertEquals("false", aea.getValue());
-	}
-
-	public void testGetValueInvalidValue1() throws Exception {
-		this.createAnnotationAndMembers("Foo", "String bar();");
-		this.createTestType("@annot.Foo(bar=77)");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forStrings(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertNull(aea.getValue());
-	}
-
-	public void testGetValueInvalidValue2() throws Exception {
-		this.createAnnotationAndMembers("Foo", "String bar();");
-		this.createTestType("@annot.Foo(bar=bazzzz)");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forStrings(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertNull(aea.getValue());
-	}
-
-	public void testGetValueInvalidValue3() throws Exception {
-		this.createAnnotationAndMembers("Foo", "boolean bar();");
-		this.createTestType("@annot.Foo(bar=bazzzz)");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forBooleans(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertNull(aea.getValue());
-	}
-
-	public void testGetValueInvalidValue4() throws Exception {
-		this.createAnnotationAndMembers("Foo", "char bar();");
-		this.createTestType("@annot.Foo(bar=\"bazzzz\")");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = ConversionDeclarationAnnotationElementAdapter.forCharacters(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertNull(aea.getValue());
-	}
-
-	public void testGetValueInvalidValue5() throws Exception {
-		this.createAnnotationAndMembers("Foo", "Class bar();");
-		this.createTestType("@annot.Foo(bar=\"java.lang.Object\")");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa, "bar", SimpleTypeStringExpressionConverter.instance());
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertNull(aea.getValue());
-	}
-
-	public void testGetValueInvalidValue6() throws Exception {
-		this.createEnum("TestEnum", "XXX, YYY, ZZZ");
-		this.createAnnotationAndMembers("Foo", "enums.TestEnum bar();");
-		this.createTestType("@annot.Foo(bar=enums.TestEnum.class)");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = new EnumDeclarationAnnotationElementAdapter(daa, "bar");
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertNull(aea.getValue());
-	}
-
-	public void testGetValueInvalidValue7() throws Exception {
-		this.createAnnotationAndMembers("Baz", "boolean fred();");
-		this.createAnnotationAndMembers("Bar", "annot.Baz jimmy();");
-		this.createAnnotationAndMembers("Foo", "annot.Bar value();");
-		String value = "\"false\"";
-		String element = "fred=" + value;
-		String annotation = "@annot.Foo(@annot.Bar(jimmy=@annot.Baz(" + element + ")))";
-		this.createTestType(annotation);
-		DeclarationAnnotationAdapter daa1 = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationAdapter daa2 = new NestedDeclarationAnnotationAdapter(daa1, "value", "annot.Bar");
-		DeclarationAnnotationAdapter daa3 = new NestedDeclarationAnnotationAdapter(daa2, "jimmy", "annot.Baz");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa3, "fred", BooleanStringExpressionConverter.instance());
-		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
-		assertNull(aea.getValue());
-	}
-
-	public void testGetValueInvalidValue8() throws Exception {
-		this.createAnnotationAndMembers("Foo", "String[] bar();");
-		this.createTestType("@annot.Foo(bar={true, false})");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[]>(daa, "bar", AnnotationStringArrayExpressionConverter.forStrings());
-		AnnotationElementAdapter<String[]> aea = new MemberAnnotationElementAdapter<String[]>(this.idField(), daea);
-		assertTrue(Arrays.equals(new String[] {null, null}, aea.getValue()));
-	}
-
-	public void testGetValueInvalidValue9() throws Exception {
-		this.createAnnotationAndMembers("Foo", "String[] bar();");
-		this.createTestType("@annot.Foo(bar=77)");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[]>(daa, "bar", AnnotationStringArrayExpressionConverter.forStrings());
-		AnnotationElementAdapter<String[]> aea = new MemberAnnotationElementAdapter<String[]>(this.idField(), daea);
-		assertTrue(Arrays.equals(new String[] {null}, aea.getValue()));
-	}
-
 	public void testASTNode1() throws Exception {
 		this.createAnnotationAndMembers("Foo", "String bar();");
 		String value = "\"xxx\"";
@@ -353,7 +168,7 @@
 		DeclarationAnnotationAdapter daa1 = new SimpleDeclarationAnnotationAdapter("annot.Foo");
 		DeclarationAnnotationAdapter daa2 = new NestedDeclarationAnnotationAdapter(daa1, "value", "annot.Bar");
 		DeclarationAnnotationAdapter daa3 = new NestedDeclarationAnnotationAdapter(daa2, "jimmy", "annot.Baz");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa3, "fred", BooleanStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, BooleanLiteral>(daa3, "fred", BooleanStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 		assertEquals("false", aea.getValue());
 		ITextRange textRange = new ASTNodeTextRange(aea.astNode());
@@ -424,7 +239,7 @@
 		DeclarationAnnotationAdapter daa1 = new SimpleDeclarationAnnotationAdapter("annot.Foo");
 		DeclarationAnnotationAdapter daa2 = new NestedDeclarationAnnotationAdapter(daa1, "value", "annot.Bar");
 		DeclarationAnnotationAdapter daa3 = new NestedDeclarationAnnotationAdapter(daa2, "jimmy", "annot.Baz");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa3, "fred", BooleanStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, BooleanLiteral>(daa3, "fred", BooleanStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 
 		aea.setValue(null);
@@ -443,7 +258,7 @@
 		DeclarationAnnotationAdapter daa1 = new SimpleDeclarationAnnotationAdapter("annot.Foo");
 		DeclarationAnnotationAdapter daa2 = new NestedDeclarationAnnotationAdapter(daa1, "value", "annot.Bar", false);
 		DeclarationAnnotationAdapter daa3 = new NestedDeclarationAnnotationAdapter(daa2, "jimmy", "annot.Baz", false);
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa3, "fred", BooleanStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, BooleanLiteral>(daa3, "fred", BooleanStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 
 		aea.setValue(null);
@@ -472,7 +287,7 @@
 		DeclarationAnnotationAdapter daa1 = new SimpleDeclarationAnnotationAdapter("annot.Foo");
 		DeclarationAnnotationAdapter daa2 = new NestedDeclarationAnnotationAdapter(daa1, "value", "annot.Bar");
 		DeclarationAnnotationAdapter daa3 = new NestedDeclarationAnnotationAdapter(daa2, "jimmy", "annot.Baz");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa3, "fred", BooleanStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, BooleanLiteral>(daa3, "fred", BooleanStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 
 		aea.setValue("true");
@@ -488,7 +303,7 @@
 		DeclarationAnnotationAdapter daa1 = new SimpleDeclarationAnnotationAdapter("annot.Foo");
 		DeclarationAnnotationAdapter daa2 = new NestedDeclarationAnnotationAdapter(daa1, "value", "annot.Bar");
 		DeclarationAnnotationAdapter daa3 = new NestedDeclarationAnnotationAdapter(daa2, "jimmy", "annot.Baz");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa3, "fred", BooleanStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, BooleanLiteral>(daa3, "fred", BooleanStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 
 		aea.setValue("true");
@@ -560,7 +375,7 @@
 		DeclarationAnnotationAdapter daa1 = new SimpleDeclarationAnnotationAdapter("annot.Foo");
 		DeclarationAnnotationAdapter daa2 = new NestedDeclarationAnnotationAdapter(daa1, "value", "annot.Bar");
 		DeclarationAnnotationAdapter daa3 = new NestedIndexedDeclarationAnnotationAdapter(daa2, "jimmy", 2, "annot.Baz");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa3, "fred", NumberStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, NumberLiteral>(daa3, "fred", NumberStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 
 		assertEquals("2", aea.getValue());
@@ -599,7 +414,7 @@
 		this.createAnnotationAndMembers("Foo", "Class bar();");
 		this.createTestType("@annot.Foo(bar=java.lang.Object.class)");
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa, "bar", SimpleTypeStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, TypeLiteral>(daa, "bar", SimpleTypeStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 		assertEquals("java.lang.Object", aea.getValue());
 	}
@@ -608,7 +423,7 @@
 		this.createAnnotationAndMembers("Foo", "Class bar();");
 		this.createTestType();
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa, "bar", SimpleTypeStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, TypeLiteral>(daa, "bar", SimpleTypeStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 		aea.setValue("java.lang.Object");
 		this.assertSourceContains("@Foo(bar=java.lang.Object.class)");
@@ -618,7 +433,7 @@
 		this.createAnnotationAndMembers("Foo", "Class bar();");
 		this.createTestType("@annot.Foo(bar=int.class)");
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa, "bar", SimpleTypeStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, TypeLiteral>(daa, "bar", SimpleTypeStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 		assertNull(aea.getValue());
 	}
@@ -627,7 +442,7 @@
 		this.createAnnotationAndMembers("Foo", "Class bar();");
 		this.createTestType("@annot.Foo(bar=java.util.Map.Entry.class)");
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa, "bar", SimpleTypeStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, TypeLiteral>(daa, "bar", SimpleTypeStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 		assertEquals("java.util.Map.Entry", aea.getValue());
 	}
@@ -636,7 +451,7 @@
 		this.createAnnotationAndMembers("Foo", "Class bar();");
 		this.createTestType("@annot.Foo(bar=int.class)");
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa, "bar", PrimitiveTypeStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, TypeLiteral>(daa, "bar", PrimitiveTypeStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 		assertEquals("int", aea.getValue());
 	}
@@ -645,7 +460,7 @@
 		this.createAnnotationAndMembers("Foo", "Class bar();");
 		this.createTestType();
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa, "bar", PrimitiveTypeStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, TypeLiteral>(daa, "bar", PrimitiveTypeStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 		aea.setValue("int");
 		this.assertSourceContains("@Foo(bar=int.class)");
@@ -655,7 +470,7 @@
 		this.createAnnotationAndMembers("Foo", "Class bar();");
 		this.createTestType("@annot.Foo(bar=java.lang.Object.class)");
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa, "bar", PrimitiveTypeStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, TypeLiteral>(daa, "bar", PrimitiveTypeStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 		assertNull(aea.getValue());
 	}
@@ -664,7 +479,7 @@
 		this.createAnnotationAndMembers("Foo", "Class bar();");
 		this.createTestType("@annot.Foo(bar=void.class)");
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String>(daa, "bar", PrimitiveTypeStringExpressionConverter.instance());
+		DeclarationAnnotationElementAdapter<String> daea = new ConversionDeclarationAnnotationElementAdapter<String, TypeLiteral>(daa, "bar", PrimitiveTypeStringExpressionConverter.instance());
 		AnnotationElementAdapter<String> aea = new MemberAnnotationElementAdapter<String>(this.idField(), daea);
 		assertEquals("void", aea.getValue());
 	}
@@ -740,16 +555,7 @@
 		this.createAnnotationAndMembers("Foo", "String[] bar();");
 		this.createTestType("@annot.Foo(bar={\"string0\", \"string1\"})");
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[]>(daa, "bar", AnnotationStringArrayExpressionConverter.forStrings());
-		AnnotationElementAdapter<String[]> aea = new MemberAnnotationElementAdapter<String[]>(this.idField(), daea);
-		assertTrue(Arrays.equals(new String[] {"string0", "string1"}, aea.getValue()));
-	}
-
-	public void testGetValueStringArrayConcatenation() throws Exception {
-		this.createAnnotationAndMembers("Foo", "String[] bar();");
-		this.createTestType("@annot.Foo(bar={\"stri\" + \"ng0\", \"s\" + \"tring1\"})");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[]>(daa, "bar", AnnotationStringArrayExpressionConverter.forStrings());
+		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[], Expression>(daa, "bar", AnnotationStringArrayExpressionConverter.forStringLiterals());
 		AnnotationElementAdapter<String[]> aea = new MemberAnnotationElementAdapter<String[]>(this.idField(), daea);
 		assertTrue(Arrays.equals(new String[] {"string0", "string1"}, aea.getValue()));
 	}
@@ -758,7 +564,7 @@
 		this.createAnnotationAndMembers("Foo", "String[] bar();");
 		this.createTestType("@annot.Foo(bar={})");
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[]>(daa, "bar", AnnotationStringArrayExpressionConverter.forStrings());
+		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[], Expression>(daa, "bar", AnnotationStringArrayExpressionConverter.forStringLiterals());
 		AnnotationElementAdapter<String[]> aea = new MemberAnnotationElementAdapter<String[]>(this.idField(), daea);
 		assertTrue(Arrays.equals(new String[0], aea.getValue()));
 	}
@@ -767,7 +573,7 @@
 		this.createAnnotationAndMembers("Foo", "String[] bar();");
 		this.createTestType("@annot.Foo(bar=\"string0\")");
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[]>(daa, "bar", AnnotationStringArrayExpressionConverter.forStrings());
+		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[], Expression>(daa, "bar", AnnotationStringArrayExpressionConverter.forStringLiterals());
 		AnnotationElementAdapter<String[]> aea = new MemberAnnotationElementAdapter<String[]>(this.idField(), daea);
 		assertTrue(Arrays.equals(new String[] {"string0"}, aea.getValue()));
 	}
@@ -776,7 +582,7 @@
 		this.createAnnotationAndMembers("Foo", "String[] bar();");
 		this.createTestType("@annot.Foo()");
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[]>(daa, "bar", AnnotationStringArrayExpressionConverter.forStrings());
+		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[], Expression>(daa, "bar", AnnotationStringArrayExpressionConverter.forStringLiterals());
 		AnnotationElementAdapter<String[]> aea = new MemberAnnotationElementAdapter<String[]>(this.idField(), daea);
 		assertTrue(Arrays.equals(new String[0], aea.getValue()));
 	}
@@ -787,7 +593,7 @@
 		this.createTestType();
 		this.assertSourceDoesNotContain(annotation);
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[]>(daa, "bar", AnnotationStringArrayExpressionConverter.forStrings());
+		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[], Expression>(daa, "bar", AnnotationStringArrayExpressionConverter.forStringLiterals());
 		AnnotationElementAdapter<String[]> aea = new MemberAnnotationElementAdapter<String[]>(this.idField(), daea);
 		aea.setValue(new String[] {"string0", "string1"});
 		this.assertSourceContains(annotation);
@@ -799,7 +605,7 @@
 		this.createTestType();
 		this.assertSourceDoesNotContain(annotation);
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[]>(daa, "bar", AnnotationStringArrayExpressionConverter.forStrings());
+		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[], Expression>(daa, "bar", AnnotationStringArrayExpressionConverter.forStringLiterals());
 		AnnotationElementAdapter<String[]> aea = new MemberAnnotationElementAdapter<String[]>(this.idField(), daea);
 		aea.setValue(new String[0]);
 		this.assertSourceDoesNotContain(annotation);
@@ -811,8 +617,8 @@
 		this.createTestType();
 		this.assertSourceDoesNotContain(annotation);
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		ExpressionConverter<String[]> expressionConverter = new AnnotationStringArrayExpressionConverter(StringExpressionConverter.instance(), false);
-		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[]>(daa, "bar", expressionConverter);
+		ExpressionConverter<String[], Expression> expressionConverter = new AnnotationStringArrayExpressionConverter<StringLiteral>(StringExpressionConverter.instance(), false);
+		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[], Expression>(daa, "bar", expressionConverter);
 		AnnotationElementAdapter<String[]> aea = new MemberAnnotationElementAdapter<String[]>(this.idField(), daea);
 		aea.setValue(new String[0]);
 		this.assertSourceContains(annotation);
@@ -824,7 +630,7 @@
 		this.createTestType();
 		this.assertSourceDoesNotContain(annotation);
 		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[]>(daa, "bar", AnnotationStringArrayExpressionConverter.forStrings());
+		DeclarationAnnotationElementAdapter<String[]> daea = new ConversionDeclarationAnnotationElementAdapter<String[], Expression>(daa, "bar", AnnotationStringArrayExpressionConverter.forStringLiterals());
 		AnnotationElementAdapter<String[]> aea = new MemberAnnotationElementAdapter<String[]>(this.idField(), daea);
 		aea.setValue(new String[] {"string0"});
 		this.assertSourceContains(annotation);
@@ -840,16 +646,6 @@
 		assertTrue(Arrays.equals(new String[] {"enums.TestEnum.XXX", "enums.TestEnum.YYY"}, aea.getValue()));
 	}
 
-	public void testGetValueEnumArrayInvalidEntry() throws Exception {
-		this.createEnum("TestEnum", "XXX, YYY, ZZZ");
-		this.createAnnotationAndMembers("Foo", "enums.TestEnum[] bar();");
-		this.createTestType("@annot.Foo(bar={enums.TestEnum.XXX, 88})");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String[]> daea = new EnumArrayDeclarationAnnotationElementAdapter(daa, "bar");
-		AnnotationElementAdapter<String[]> aea = new MemberAnnotationElementAdapter<String[]>(this.idField(), daea);
-		assertTrue(Arrays.equals(new String[] {"enums.TestEnum.XXX", null}, aea.getValue()));
-	}
-
 	public void testGetValueEnumArrayEmpty() throws Exception {
 		this.createEnum("TestEnum", "XXX, YYY, ZZZ");
 		this.createAnnotationAndMembers("Foo", "enums.TestEnum[] bar();");
@@ -870,16 +666,6 @@
 		assertTrue(Arrays.equals(new String[] {"enums.TestEnum.XXX"}, aea.getValue()));
 	}
 
-	public void testGetValueEnumArraySingleElementInvalid() throws Exception {
-		this.createEnum("TestEnum", "XXX, YYY, ZZZ");
-		this.createAnnotationAndMembers("Foo", "enums.TestEnum[] bar();");
-		this.createTestType("@annot.Foo(bar=\"\")");
-		DeclarationAnnotationAdapter daa = new SimpleDeclarationAnnotationAdapter("annot.Foo");
-		DeclarationAnnotationElementAdapter<String[]> daea = new EnumArrayDeclarationAnnotationElementAdapter(daa, "bar");
-		AnnotationElementAdapter<String[]> aea = new MemberAnnotationElementAdapter<String[]>(this.idField(), daea);
-		assertTrue(Arrays.equals(new String[] {null}, aea.getValue()));
-	}
-
 	public void testGetValueNullEnumArray() throws Exception {
 		this.createEnum("TestEnum", "XXX, YYY, ZZZ");
 		this.createAnnotationAndMembers("Foo", "enums.TestEnum[] bar();");
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/model/JptCoreModelTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/model/JptCoreModelTests.java
index fd28bf9..d7d2ffe 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/model/JptCoreModelTests.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/model/JptCoreModelTests.java
@@ -14,10 +14,6 @@
 public class JptCoreModelTests {
 
 	public static Test suite() {
-		return suite(true);
-	}
-	
-	public static Test suite(boolean all) {
 		TestSuite suite = new TestSuite(JptCoreModelTests.class.getPackage().getName());
 		suite.addTestSuite(ModelInitializationTests.class);
 		return suite;
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/model/ModelInitializationTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/model/ModelInitializationTests.java
index 175b922..620ec25 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/model/ModelInitializationTests.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/model/ModelInitializationTests.java
@@ -20,8 +20,7 @@
 import org.eclipse.jpt.utility.internal.ClassTools;
 import org.eclipse.jpt.utility.internal.CollectionTools;
 
-public class ModelInitializationTests extends TestCase 
-{
+public class ModelInitializationTests extends TestCase {
 	private IJpaModel jpaModel;
 	
 	
@@ -48,7 +47,7 @@
 	 * pre-existing entities added.
 	 */
 	private TestFacetedProject buildTestProject() throws CoreException {
-		TestFacetedProject testProject = TestFacetedProject.buildFacetedProject(ClassTools.shortClassNameForObject(this), true);
+		TestFacetedProject testProject = new TestFacetedProject(ClassTools.shortClassNameForObject(this), true);
 		testProject.installFacet("jst.java", "5.0");
 		testProject.installFacet("jst.utility", "1.0");
 		testProject.createFile(
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/platform/BaseJpaPlatformTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/platform/BaseJpaPlatformTests.java
index cf908dc..94c306e 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/platform/BaseJpaPlatformTests.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/platform/BaseJpaPlatformTests.java
@@ -13,7 +13,6 @@
 import org.eclipse.jpt.core.internal.content.persistence.Persistence;
 import org.eclipse.jpt.core.internal.content.persistence.PersistenceFactory;
 import org.eclipse.jpt.core.internal.content.persistence.PersistenceXmlRootContentNode;
-import org.eclipse.jpt.core.tests.internal.ProjectUtility;
 import org.eclipse.jpt.core.tests.internal.projects.TestJpaProject;
 import org.eclipse.jpt.utility.internal.CollectionTools;
 
@@ -34,7 +33,6 @@
 	@Override
 	protected void setUp() throws Exception {
 		super.setUp();
-		ProjectUtility.deleteAllProjects();
 		jpaProject = this.buildJpaProject(PROJECT_NAME, false);  // false = no auto-build
 	}
 
@@ -44,7 +42,7 @@
 
 	@Override
 	protected void tearDown() throws Exception {
-		ProjectUtility.deleteAllProjects();
+		jpaProject.dispose();
 		jpaProject = null;
 		super.tearDown();
 	}
@@ -66,6 +64,7 @@
 		xmlEntity.setSpecifiedName("XmlEntity");
 		entityMappings.getTypeMappings().add(xmlEntity);
 		entityMappings.eResource().save(null);
+		
 		assertEquals(1, CollectionTools.size(jpaProject.getJpaProject().getPlatform().persistentTypes(PROJECT_NAME)));
 		
 		// add java persistent type
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/platform/JpaPlatformExtensionTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/platform/JpaPlatformExtensionTests.java
deleted file mode 100644
index 1057c85..0000000
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/platform/JpaPlatformExtensionTests.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- *  Copyright (c) 2007 Oracle. 
- *  All rights reserved.  This program and the accompanying materials 
- *  are made available under the terms of the Eclipse Public License v1.0 
- *  which accompanies this distribution, and is available at 
- *  http://www.eclipse.org/legal/epl-v10.html
- *  
- *  Contributors: 
- *  	Oracle - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jpt.core.tests.internal.platform;
-
-import junit.framework.TestCase;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jpt.core.internal.JpaPlatformRegistry;
-import org.eclipse.jpt.core.internal.JptCorePlugin;
-import org.eclipse.jpt.core.tests.extension.resource.ExtensionTestPlugin;
-import org.eclipse.jpt.core.tests.extension.resource.TestJpaPlatform;
-import org.eclipse.jpt.utility.internal.CollectionTools;
-
-public class JpaPlatformExtensionTests extends TestCase
-{
-	public static final String TEST_PLATFORM_ID = TestJpaPlatform.PLATFORM_ID;
-	public static final String TEST_PLATFORM_LABEL = "Test Jpa Platform";
-	
-	public JpaPlatformExtensionTests(String name) {
-		super(name);
-	}
-
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-		verifyExtensionTestProjectExists();
-	}
-
-	public static void verifyExtensionTestProjectExists() {
-		IExtensionRegistry registry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = 
-			registry.getExtensionPoint(JptCorePlugin.PLUGIN_ID, "jpaPlatform");
-		IExtension[] extensions = extensionPoint.getExtensions();
-		boolean extensionFound = false;
-		for (IExtension extension : extensions) {
-			if (extension.getContributor().getName().equals(ExtensionTestPlugin.PLUGIN_ID)) {
-				extensionFound = true;
-			}
-		}
-		if (!extensionFound) {
-			throw new RuntimeException("Missing Extension " + TEST_PLATFORM_ID + ". The ExtensionTestProject plugin must be in your testing workspace.");
-		}
-	}
-	
-	@Override
-	protected void tearDown() throws Exception {
-		super.tearDown();
-	}
-	
-	public void testAllJpaPlatformIds() {
-		assertTrue(CollectionTools.size(JpaPlatformRegistry.instance().allJpaPlatformIds()) >= 2);
-	}
-	
-	public void testJpaPlatformLabel() {
-		assertEquals(TEST_PLATFORM_LABEL, JpaPlatformRegistry.instance().jpaPlatformLabel(TEST_PLATFORM_ID));	
-	}
-	
-	public void testJpaPlatform() {
-		assertNotNull(JpaPlatformRegistry.instance().jpaPlatform(TEST_PLATFORM_ID));		
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/platform/JpaPlatformTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/platform/JpaPlatformTests.java
deleted file mode 100644
index c5fb841..0000000
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/platform/JpaPlatformTests.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- *  Copyright (c) 2007 Oracle. 
- *  All rights reserved.  This program and the accompanying materials 
- *  are made available under the terms of the Eclipse Public License v1.0 
- *  which accompanies this distribution, and is available at 
- *  http://www.eclipse.org/legal/epl-v10.html
- *  
- *  Contributors: 
- *  	Oracle - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jpt.core.tests.internal.platform;
-
-import junit.framework.TestCase;
-import org.eclipse.jpt.core.internal.IJpaPlatform;
-import org.eclipse.jpt.core.internal.IJpaProject;
-import org.eclipse.jpt.core.internal.IMappingKeys;
-import org.eclipse.jpt.core.internal.content.java.IJavaAttributeMappingProvider;
-import org.eclipse.jpt.core.internal.content.java.IJavaTypeMappingProvider;
-import org.eclipse.jpt.core.internal.content.java.mappings.JavaBasicProvider;
-import org.eclipse.jpt.core.internal.content.java.mappings.JavaEntityProvider;
-import org.eclipse.jpt.core.internal.platform.generic.GenericJpaFactory;
-import org.eclipse.jpt.core.internal.platform.generic.GenericPlatform;
-import org.eclipse.jpt.core.tests.extension.resource.ExtensionTestPlugin;
-import org.eclipse.jpt.core.tests.extension.resource.TestAttributeMappingProvider;
-import org.eclipse.jpt.core.tests.extension.resource.TestJpaFactory;
-import org.eclipse.jpt.core.tests.extension.resource.TestJpaPlatform;
-import org.eclipse.jpt.core.tests.extension.resource.TestTypeMappingProvider;
-import org.eclipse.jpt.core.tests.internal.ProjectUtility;
-import org.eclipse.jpt.core.tests.internal.projects.TestJpaProject;
-import org.eclipse.jpt.core.tests.internal.projects.TestPlatformProject;
-
-public class JpaPlatformTests extends TestCase
-{
-	protected TestJpaProject testProject;
-
-	protected static final String PROJECT_NAME = "ExtensionTestProject";
-	protected static final String PACKAGE_NAME = "extension.test";
-	
-	public static final String TEST_PLUGIN_CLASS = ExtensionTestPlugin.class.getName();
-	public static final String TEST_PLUGIN_ID = "org.eclipse.jpt.core.tests.extension.resource";
-
-	public static final String TEST_PLATFORM_ID = TestJpaPlatform.PLATFORM_ID;
-	public static final String TEST_PLATFORM_CLASS = TestJpaPlatform.class.getName();
-	public static final String TEST_PLATFORM_LABEL = "Test Jpa Platform";
-	public static final String TEST_JPA_FACTORY = TestJpaFactory.class.getName();
-	public static final String TEST_TYPE_MAPPING_PROVIDER_CLASS = TestTypeMappingProvider.class.getName();
-	public static final String TEST_ATTRIBUTE_MAPPING_PROVIDER_CLASS = TestAttributeMappingProvider.class.getName();
-	
-	public JpaPlatformTests(String name) {
-		super(name);
-	}
-
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-		JpaPlatformExtensionTests.verifyExtensionTestProjectExists();
-		ProjectUtility.deleteAllProjects();
-		testProject = this.buildJpaProject(TestPlatformProject.uniqueProjectName(PROJECT_NAME), false);  // false = no auto-build
-	}
-
-	protected TestJpaProject buildJpaProject(String projectName, boolean autoBuild) throws Exception {
-		return new TestJpaProject(projectName, autoBuild);  // false = no auto-build
-	}
-
-	@Override
-	protected void tearDown() throws Exception {
-		testProject = null;
-		ProjectUtility.deleteAllProjects();
-//		testProject.dispose();
-		super.tearDown();
-	}
-	
-	protected IJpaProject jpaProject() {
-		return this.testProject.getJpaProject();
-	}
-	
-	public void testSetPlatform() {
-		assertTrue(jpaPlatform() instanceof GenericPlatform);
-		
-		jpaProject().setPlatform(TEST_PLATFORM_ID);
-
-		assertTrue(jpaPlatform().getClass().getName().equals(TEST_PLATFORM_CLASS));
-	}
-	
-	public void testGetJpaFactory() {
-		assertTrue(jpaPlatform().getJpaFactory() instanceof GenericJpaFactory);
-		jpaProject().setPlatform(TEST_PLATFORM_ID);
-		
-		assertTrue(jpaPlatform().getJpaFactory().getClass().getName().equals(TEST_JPA_FACTORY));
-	}
-	
-	public void testJavaTypeMappingProvider() {
-		IJavaTypeMappingProvider provider = jpaProject().getPlatform().javaTypeMappingProvider(IMappingKeys.ENTITY_TYPE_MAPPING_KEY);
-		assertTrue(provider instanceof JavaEntityProvider);
-		
-		provider = jpaProject().getPlatform().javaTypeMappingProvider("test");
-		assertNull(provider);
-		
-		jpaProject().setPlatform(TEST_PLATFORM_ID);
-		
-		provider = jpaProject().getPlatform().javaTypeMappingProvider(IMappingKeys.ENTITY_TYPE_MAPPING_KEY);
-		assertTrue(provider instanceof JavaEntityProvider);
-
-		provider = jpaProject().getPlatform().javaTypeMappingProvider("test");
-		assertTrue(provider.getClass().getName().equals(TEST_TYPE_MAPPING_PROVIDER_CLASS));
-	}
-	
-	public void testJavaAttributeMappingProvider() {
-		IJavaAttributeMappingProvider provider = jpaProject().getPlatform().javaAttributeMappingProvider(IMappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY);
-		assertTrue(provider instanceof JavaBasicProvider);
-		boolean exceptionCaught = false;
-		try {
-			provider = jpaProject().getPlatform().javaAttributeMappingProvider("test");
-		}
-		catch (IllegalArgumentException e) {
-			exceptionCaught = true;
-		}
-		assertTrue(exceptionCaught);
-		
-		jpaProject().setPlatform(TEST_PLATFORM_ID);
-		
-		provider = jpaProject().getPlatform().javaAttributeMappingProvider(IMappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY);
-		assertTrue(provider instanceof JavaBasicProvider);
-
-		provider = jpaProject().getPlatform().javaAttributeMappingProvider("test");
-		assertTrue(provider.getClass().getName().equals(TEST_ATTRIBUTE_MAPPING_PROVIDER_CLASS));
-	}
-	
-	private IJpaPlatform jpaPlatform() {
-		return jpaProject().jpaPlatform();
-	}
-}
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/platform/JptCorePlatformTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/platform/JptCorePlatformTests.java
index 564a187..589e631 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/platform/JptCorePlatformTests.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/platform/JptCorePlatformTests.java
@@ -16,16 +16,8 @@
 public class JptCorePlatformTests
 {
 	public static Test suite() {
-		return suite(true);
-	}
-
-	public static Test suite(boolean all) {
 		TestSuite suite = new TestSuite(JptCorePlatformTests.class.getName());
-		suite.addTestSuite(JpaPlatformExtensionTests.class);
-		if (all) {
-			suite.addTestSuite(BaseJpaPlatformTests.class);
-			suite.addTestSuite(JpaPlatformTests.class);
-		}
+//		suite.addTestSuite(BaseJpaPlatformTests.class);
 		return suite;
 	}
 
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestFacetedProject.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestFacetedProject.java
index b3a7577..6b638fa 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestFacetedProject.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestFacetedProject.java
@@ -14,25 +14,16 @@
 import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
 import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
 
-public class TestFacetedProject extends TestPlatformProject 
-{
+public class TestFacetedProject extends TestPlatformProject {
 	private IFacetedProject facetedProject;
 
 
-	// ********** builders *****************************
-	
-	public static TestFacetedProject buildFacetedProject(String baseProjectName, boolean autoBuild)
-			throws CoreException {
-		return new TestFacetedProject(uniqueProjectName(baseProjectName), autoBuild);
-	}
-	
-	
 	// ********** constructors/initialization **********
 
 	public TestFacetedProject(String projectName) throws CoreException {
 		this(projectName, true);
 	}
-	
+
 	public TestFacetedProject(String projectName, boolean autoBuild) throws CoreException {
 		super(projectName, autoBuild);
 		this.facetedProject = this.createFacetedProject();
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestJavaProject.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestJavaProject.java
index 03529be..a19529b 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestJavaProject.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestJavaProject.java
@@ -30,22 +30,18 @@
  * This builds and holds a "Java" project.
  * Support for adding packages and types.
  */
-public class TestJavaProject extends TestFacetedProject 
-{
+public class TestJavaProject extends TestFacetedProject {
+
 	private IJavaProject javaProject;
 	private IPackageFragmentRoot sourceFolder;
 
 
-	// ********** builders *****************************
-	
-	public static TestJavaProject buildJavaProject(String baseProjectName, boolean autoBuild)
-			throws CoreException {
-		return new TestJavaProject(uniqueProjectName(baseProjectName), autoBuild);
-	}
-	
-	
 	// ********** constructors/initialization **********
 
+	public TestJavaProject() throws CoreException {
+		this("TestJavaProject");
+	}
+
 	public TestJavaProject(String projectName) throws CoreException {
 		this(projectName, false);
 	}
@@ -87,7 +83,7 @@
 	public IType createType(String packageName, String compilationUnitName, SourceWriter sourceWriter) throws CoreException {
 		return this.createType(this.createPackage(packageName), compilationUnitName, sourceWriter);
 	}
-	
+
 	/**
 	 * The source should NOT contain a package declaration;
 	 * it will be added here.
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestJpaProject.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestJpaProject.java
index b5e33a1..ce4898b 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestJpaProject.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestJpaProject.java
@@ -13,8 +13,7 @@
 import org.eclipse.jpt.core.internal.IJpaProject;
 import org.eclipse.jpt.core.internal.JptCorePlugin;
 
-public class TestJpaProject extends TestJavaProject 
-{
+public class TestJpaProject extends TestJavaProject {
 	private IJpaProject jpaProject;
 
 	public static final String JAR_NAME_SYSTEM_PROPERTY = "org.eclipse.jpt.jpa.jar";
@@ -24,10 +23,10 @@
 	
 	public static TestJpaProject buildJpaProject(String baseProjectName, boolean autoBuild)
 			throws CoreException {
-		return new TestJpaProject(uniqueProjectName(baseProjectName), autoBuild);
+		String projectName = baseProjectName + String.valueOf(System.currentTimeMillis()).substring(7);
+		return new TestJpaProject(baseProjectName, autoBuild);
 	}
-	
-	
+
 	// ********** constructors/initialization **********
 
 	public TestJpaProject(String projectName) throws CoreException {
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestPlatformProject.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestPlatformProject.java
index b162971..7fbca79 100644
--- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestPlatformProject.java
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/projects/TestPlatformProject.java
@@ -28,29 +28,24 @@
  * This builds and holds a "general" project.
  * Support for adding natures, folders, and files.
  */
-public class TestPlatformProject 
-{
+public class TestPlatformProject {
+
+	private final IProject project;
+
 	/** carriage return */
 	public static final String CR = System.getProperty("line.separator");
-	
-	
-	private final IProject project;
-	
-	
-	// ********** builders *****************************
-	
-	public static TestPlatformProject buildPlatformProject(String baseProjectName, boolean autoBuild)
-			throws CoreException {
-		return new TestPlatformProject(uniqueProjectName(baseProjectName), autoBuild);
-	}
-	
-	public static String uniqueProjectName(String baseProjectName) {
-		return baseProjectName + String.valueOf(System.currentTimeMillis()).substring(7);
-	}
-	
-	
+
+
 	// ********** constructors/initialization **********
-	
+
+	public TestPlatformProject() throws CoreException {
+		this(false);
+	}
+
+	public TestPlatformProject(boolean autoBuild) throws CoreException {
+		this("TestProject", autoBuild);
+	}
+
 	public TestPlatformProject(String projectName, boolean autoBuild) throws CoreException {
 		super();
 		this.setAutoBuild(autoBuild);  // workspace-wide setting
@@ -79,13 +74,13 @@
 
 	public void addProjectNature(String natureID) throws CoreException {
 		IProjectDescription description = this.project.getDescription();
-		description.setNatureIds(CollectionTools.add(description.getNatureIds(), natureID));
+		description.setNatureIds((String[]) CollectionTools.add(description.getNatureIds(), natureID));
 		this.project.setDescription(description, null);
 	}
 
 	public void removeProjectNature(String natureID) throws CoreException {
 		IProjectDescription description = this.project.getDescription();
-		description.setNatureIds(CollectionTools.removeAllOccurrences(description.getNatureIds(), natureID));
+		description.setNatureIds((String[]) CollectionTools.removeAllOccurrences(description.getNatureIds(), natureID));
 		this.project.setDescription(description, null);
 	}
 
diff --git a/jpa/tests/org.eclipse.jpt.db.tests/config/derby101.properties b/jpa/tests/org.eclipse.jpt.db.tests/config/derby101.properties
index 1d97add..6101413 100644
--- a/jpa/tests/org.eclipse.jpt.db.tests/config/derby101.properties
+++ b/jpa/tests/org.eclipse.jpt.db.tests/config/derby101.properties
@@ -1,3 +1,13 @@
+###############################################################################
+#  Copyright (c) 2007 Oracle. 
+#  All rights reserved.  This program and the accompanying materials 
+#  are made available under the terms of the Eclipse Public License v1.0 
+#  which accompanies this distribution, and is available at 
+#  http://www.eclipse.org/legal/epl-v10.html
+#  
+#  Contributors: 
+#  	Oracle - initial API and implementation
+###############################################################################
 #  Platform Property names & Default
 #
 #  profileName  - jpatest
@@ -7,15 +17,14 @@
 #  databasedriverJarList  - (mandatory)
 #  databaseName  - testdb
 #  databaseUrl  - (mandatory)
-#  Driver class name - org.apache.derby.jdbc.EmbeddedDriver
 # 
 profileName = derby101
-profileDescription = Derby Embedded JDBC Profile for Testing
+profileDescription = Derby  Embedded JDBC Profile for Testing
 # set user name
-userName = 
+userName = jpatest
 userPassword =
 # set path to Derby driver here (example: databasedriverJarList = c:/derbydb/lib/derby.jar )
 databasedriverJarList = 
 databaseName = testdb
 # set database URL here (example: databaseUrl = jdbc:derby:c:/derbydb/testdb;create=true )  
-databaseUrl = 
+databaseUrl =
diff --git a/jpa/tests/org.eclipse.jpt.db.tests/config/mysql41.properties b/jpa/tests/org.eclipse.jpt.db.tests/config/mysql41.properties
deleted file mode 100644
index 4ac9478..0000000
--- a/jpa/tests/org.eclipse.jpt.db.tests/config/mysql41.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-#  Platform Property names & Default
-#
-#  profileName  - jpatest
-#  profileDescription  - JDBC Profile for JPA Testing
-#  userName  - jpatest
-#  userPassword  - (empty)
-#  databasedriverJarList  - (mandatory)
-#  databaseName  - testdb
-#  databaseUrl  - (mandatory)
-#
-#  Driver class (jconn3.jar) - com.mysql.jdbc.Driver
-# 
-profileName = mysq41
-profileDescription = MySql 4.1.16 JDBC Profile for Testing
-# set user name
-userName = 
-userPassword = 
-# set path to Derby driver here (example: databasedriverJarList = C:/jlib/mysql-connector-java-3.1.7-bin.jar )
-databasedriverJarList = 
-databaseName = testdb
-# set database URL here (example: databaseUrl = jdbc:sybase:Tds:localhost:5000/testdb )  
-databaseUrl = 
diff --git a/jpa/tests/org.eclipse.jpt.db.tests/config/oracle10g.properties b/jpa/tests/org.eclipse.jpt.db.tests/config/oracle10g.properties
index 603e56d..498fc7d 100644
--- a/jpa/tests/org.eclipse.jpt.db.tests/config/oracle10g.properties
+++ b/jpa/tests/org.eclipse.jpt.db.tests/config/oracle10g.properties
@@ -1,3 +1,13 @@
+###############################################################################
+#  Copyright (c) 2007 Oracle. 
+#  All rights reserved.  This program and the accompanying materials 
+#  are made available under the terms of the Eclipse Public License v1.0 
+#  which accompanies this distribution, and is available at 
+#  http://www.eclipse.org/legal/epl-v10.html
+#  
+#  Contributors: 
+#  	Oracle - initial API and implementation
+###############################################################################
 #  Platform Property names & Default
 #
 #  profileName  - jpatest
@@ -7,14 +17,13 @@
 #  databasedriverJarList  - jar list separate by comma (mandatory) 
 #  databaseName  - testdb
 #  databaseUrl  - (mandatory)
-#  Driver: oracle.jdbc.OracleDriver
 #
-profileName = Oracle10g_10_1_0_4
-profileDescription = Oracle10g (10.1.0.4) Thin JDBC Profile for Testing
-userName = 
-userPassword = 
+profileName = oracleXE10g
+profileDescription = XE 10g Release 2 (10.2) Thin JDBC Profile for Testing
+userName = scott
+userPassword = tiger
 # set path to Oracle driver here (example: databasedriverJarList = c:/oracle/jdbc/lib/ojdbc14.jar )
 databasedriverJarList = 
-databaseName = 
+databaseName = testdb
 # set database URL here (example: databaseUrl = jdbc:oracle:thin:@localhost:1521:testdb )  
 databaseUrl = 
diff --git a/jpa/tests/org.eclipse.jpt.db.tests/config/oracle10gXE.properties b/jpa/tests/org.eclipse.jpt.db.tests/config/oracle10gXE.properties
deleted file mode 100644
index 8d72946..0000000
--- a/jpa/tests/org.eclipse.jpt.db.tests/config/oracle10gXE.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#  Platform Property names & Default
-#
-#  profileName  - jpatest
-#  profileDescription  - JDBC Profile for JPA Testing
-#  userName  - jpatest
-#  userPassword  - (empty)
-#  databasedriverJarList  - jar list separate by comma (mandatory) 
-#  databaseName  - testdb
-#  databaseUrl  - (mandatory)
-#  Driver: oracle.jdbc.OracleDriver
-#
-profileName = oracleXE10g
-profileDescription = Oracle10g XE Release 2 (10.2) Thin JDBC Profile for Testing
-userName = scott
-userPassword = tiger
-# set path to Oracle driver here (example: databasedriverJarList = c:/oracle/jdbc/lib/ojdbc14.jar )
-databasedriverJarList = 
-databaseName = XE
-# set database URL here (example: databaseUrl = jdbc:oracle:thin:@localhost:1521:XE )  
-databaseUrl = 
diff --git a/jpa/tests/org.eclipse.jpt.db.tests/config/oracle9i.properties b/jpa/tests/org.eclipse.jpt.db.tests/config/oracle9i.properties
index 8357e15..3207919 100644
--- a/jpa/tests/org.eclipse.jpt.db.tests/config/oracle9i.properties
+++ b/jpa/tests/org.eclipse.jpt.db.tests/config/oracle9i.properties
@@ -1,3 +1,13 @@
+###############################################################################
+#  Copyright (c) 2007 Oracle. 
+#  All rights reserved.  This program and the accompanying materials 
+#  are made available under the terms of the Eclipse Public License v1.0 
+#  which accompanies this distribution, and is available at 
+#  http://www.eclipse.org/legal/epl-v10.html
+#  
+#  Contributors: 
+#  	Oracle - initial API and implementation
+###############################################################################
 #  Platform Property names & Default
 #
 #  profileName  - jpatest
@@ -7,14 +17,13 @@
 #  databasedriverJarList  - jar list separate by comma (mandatory) 
 #  databaseName  - testdb
 #  databaseUrl  - (mandatory)
-#  Driver: oracle.jdbc.OracleDriver
 #
 profileName = oracle9i
 profileDescription = Oracle Thin JDBC Profile for Testing
-userName = 
-userPassword = 
+userName = scott
+userPassword = tiger
 # set path to Oracle driver here (example: databasedriverJarList = c:/oracle/jdbc/lib/ojdbc14.jar )
-databasedriverJarList = 
+databasedriverJarList =
 databaseName = testdb
 # set database URL here (example: databaseUrl = jdbc:oracle:thin:@server:1521:testdb )  
-databaseUrl = 
+databaseUrl =
diff --git a/jpa/tests/org.eclipse.jpt.db.tests/config/postgresql824.properties b/jpa/tests/org.eclipse.jpt.db.tests/config/postgresql824.properties
deleted file mode 100644
index f529359..0000000
--- a/jpa/tests/org.eclipse.jpt.db.tests/config/postgresql824.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#  Platform Property names & Default
-#
-#  profileName  - jpatest
-#  profileDescription  - JDBC Profile for JPA Testing
-#  userName  - jpatest
-#  userPassword  - (empty)
-#  databasedriverJarList  - (mandatory)
-#  databaseName  - testdb
-#  databaseUrl  - (mandatory)
-#  Driver class (postgresql-8.2-505.jdbc2.jar) - org.postgresql.Driver
-# 
-profileName = postgresql
-profileDescription = PostgreSQL 8.2.4 JDBC Profile for Testing
-# set user name
-userName = 
-userPassword = 
-# set path to Derby driver here (example: databasedriverJarList = c:/jlib/postgresql-8.2-505.jdbc2.jar)
-databasedriverJarList = 
-databaseName = postgres
-# set database URL here (example: databaseUrl = jdbc:postgresql:postgres )  
-databaseUrl = jdbc:postgresql:postgres
diff --git a/jpa/tests/org.eclipse.jpt.db.tests/config/sybase12.properties b/jpa/tests/org.eclipse.jpt.db.tests/config/sybase12.properties
deleted file mode 100644
index 34aab25..0000000
--- a/jpa/tests/org.eclipse.jpt.db.tests/config/sybase12.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#  Platform Property names & Default
-#
-#  profileName  - jpatest
-#  profileDescription  - JDBC Profile for JPA Testing
-#  userName  - jpatest
-#  userPassword  - (empty)
-#  databasedriverJarList  - (mandatory)
-#  databaseName  - testdb
-#  databaseUrl  - (mandatory)
-#  Driver class (jconn3.jar) - com.sybase.jdbc3.jdbc.SybDriver
-# 
-profileName = jconnect6
-profileDescription = Sybase 12.x jConnect JDBC Profile for Testing
-# set user name
-userName = 
-userPassword = 
-# set path to Derby driver here (example: databasedriverJarList = c:/sybase/lib/jconn3.jar )
-databasedriverJarList = 
-databaseName = testdb
-# set database URL here (example: databaseUrl = jdbc:sybase:Tds:localhost:5000/testdb )  
-databaseUrl = 
diff --git a/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/AllPlatformTests.java b/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/AllPlatformTests.java
index b748816..af9c423 100644
--- a/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/AllPlatformTests.java
+++ b/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/AllPlatformTests.java
@@ -30,11 +30,7 @@
 //        suite.addTest( Derby101Tests.suite());
 //        suite.addTest( Oracle9iTests.suite());
 //        suite.addTest( Oracle10gTests.suite());
-//        suite.addTest( Oracle10gXETests.suite());
 //        suite.addTest( SQLServer2005Tests.suite());
-//        suite.addTest( MySQL41Tests.suite());
-//        suite.addTest( PostgreSQL824Tests.suite());
-//        suite.addTest( Sybase12Tests.suite());
 
         return suite;
     }
diff --git a/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/DTPPlatformTests.java b/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/DTPPlatformTests.java
index ae625c9..06a4f46 100644
--- a/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/DTPPlatformTests.java
+++ b/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/DTPPlatformTests.java
@@ -16,13 +16,10 @@
 import java.util.Collection;
 import java.util.NoSuchElementException;
 import java.util.Properties;
-
 import junit.framework.Assert;
 import junit.framework.TestCase;
-
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.datatools.connectivity.ConnectionProfileException;
 import org.eclipse.datatools.connectivity.IConnectionProfile;
@@ -33,6 +30,7 @@
 import org.eclipse.datatools.connectivity.drivers.PropertySetImpl;
 import org.eclipse.datatools.connectivity.drivers.XMLFileManager;
 import org.eclipse.datatools.connectivity.internal.ConnectivityPlugin;
+import org.eclipse.jpt.db.internal.Connection;
 import org.eclipse.jpt.db.internal.ConnectionProfile;
 import org.eclipse.jpt.db.internal.ConnectionProfileRepository;
 import org.eclipse.jpt.db.internal.DTPConnectionProfileWrapper;
@@ -127,7 +125,7 @@
 	
 	public void testGetProfileByName() {
 		// Get Profile By Name
-		IConnectionProfile dtpProfile = this.getDTPProfile();
+		IConnectionProfile dtpProfile = ProfileManager.getInstance().getProfileByName( this.profileName());
 		Assert.assertNotNull( dtpProfile);
 		Assert.assertTrue( dtpProfile.getName().equals( this.profileName()));
 	}
@@ -139,26 +137,6 @@
 		Assert.assertTrue( dtpProfile.getName().equals( this.profileName()));
 	}
 
-	public void testWorkingOffline() {
-		
-		if( this.getProfile().supportsWorkOfflineMode()) {
-
-			if( ! this.getProfile().canWorkOffline()) {
-				this.connect();
-				this.saveWorkOfflineData();
-				this.disconnect();
-				
-				Assert.assertTrue( this.getProfile().canWorkOffline());
-			}
-			this.workOffline();
-			
-			Assert.assertTrue( this.getProfile().isConnected());
-			Assert.assertTrue( this.getProfile().isWorkingOffline());
-
-			this.disconnect();
-		}
-	}
-		
 	// ********** internal tests **********
 
     private void verifyDatabaseVersionNumber() {
@@ -218,8 +196,7 @@
     protected void connect() {
 
         this.getProfile().connect();
-		Assert.assertTrue( "Could not connect.", this.getProfile().isConnected());
-		Assert.assertFalse( "Connection corrupted.", this.getProfile().isWorkingOffline());
+		Assert.assertTrue( "Connect failed.", this.getProfile().isConnected());
     }
     
     protected void disconnect() {
@@ -227,18 +204,6 @@
     	this.getProfile().disconnect();
         Assert.assertFalse( "Disconnect failed.", this.getProfile().isConnected());
     }
-
-	private void workOffline() {
-		IStatus status = this.getProfile().workOffline();
-
-		Assert.assertTrue( "Could not work offline.", status.isOK());
-	}
-
-	private void saveWorkOfflineData() {
-		IStatus status = this.getProfile().saveWorkOfflineData();
-
-		Assert.assertTrue( "Could not save offline data.", status.isOK());
-	}
     
 	// ********** queries **********
 
@@ -247,11 +212,11 @@
 	    return this.getProfile().getDatabase().schemaNamed( schemaName);
     }
 	
-    protected Collection<Table> getTables() {
+    protected Collection getTables() {
 		
         Schema schema = this.getSchemaNamed( this.getProfile().getUserName());
 		if( schema == null) {
-			return new ArrayList<Table>();
+			return new ArrayList();
 		}
 		return CollectionTools.collection( schema.tables());
     }
@@ -271,11 +236,6 @@
     protected String passwordIsSaved() {
         return "true";
     }
-
-
-    protected IConnectionProfile getDTPProfile() {
-		return ProfileManager.getInstance().getProfileByName( this.profileName());
-    }
 	
     protected String profileName() {
     	return this.platformProperties.getProperty( PROFILE_NAME_PROPERTY, PROFILE_NAME_DEFAULT);
@@ -313,7 +273,7 @@
     	return dbUrl;
     }
 
-    protected ConnectionProfile getProfile() {
+    private ConnectionProfile getProfile() {
 
     	return this.getProfileNamed( this.profileName());
     }
@@ -387,9 +347,8 @@
 		
 		ProfileManager profileManager = ProfileManager.getInstance();
 		Assert.assertNotNull( profileManager);
-		
-		IConnectionProfile dtpProfile = this.getDTPProfile();
-		if( dtpProfile == null) {
+		IConnectionProfile profile = profileManager.getProfileByName( profileName);
+		if( profile == null) {
 			Properties basicProperties = buildBasicProperties();
 			ProfileManager.getInstance().createProfile( profileName, this.profileDescription(), this.providerId(), basicProperties);
 		}
diff --git a/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/MySQL41Tests.java b/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/MySQL41Tests.java
deleted file mode 100644
index 8a57290..0000000
--- a/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/MySQL41Tests.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0, which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html.
- *
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.db.tests.internal.platforms;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import junit.swingui.TestRunner;
-
-/**
- *  SQL Server 2005 Driver Test
- */
-public class MySQL41Tests extends DTPPlatformTests {
-	
-    public static void main( String[] args) {
-        TestRunner.main( new String[] { "-c", MySQL41Tests.class.getName()});
-    }
-
-    public static Test suite() {
-        return new TestSuite( MySQL41Tests.class);
-    }
-    
-    public MySQL41Tests( String name) {
-        super( name);
-    }
-    
-    protected String databaseVendor() {
-        return "MySql";
-    }
-
-    protected String databaseVersion() {
-        return "4.1";
-    }
-
-	protected String driverClass() {
-		return "com.mysql.jdbc.Driver";
-	}
-
-	protected String driverDefinitionId() {
-		return "DriverDefn.MySQL JDBC Driver";
-	}
-
-	protected String driverDefinitionType() {
-		return "org.eclipse.datatools.enablement.mysql.4_1.driverTemplate";
-	}
-
-	protected String driverName() {
-		return "MySQL JDBC Driver";
-	}
-	
-    protected String getConfigName() {
-    	return "mysql41.properties";
-    }
-}
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/Oracle10gXETests.java b/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/Oracle10gXETests.java
deleted file mode 100644
index 8c8c1a0..0000000
--- a/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/Oracle10gXETests.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0, which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html.
- *
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.db.tests.internal.platforms;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import junit.swingui.TestRunner;
-
-/**
- *  Oracle 10g Thin Driver Test
- */
-public class Oracle10gXETests extends DTPPlatformTests {
-
-    public static void main( String[] args) {
-        TestRunner.main( new String[] { "-c", Oracle10gXETests.class.getName()});
-    }
-
-    public static Test suite() {
-        return new TestSuite( Oracle10gXETests.class);
-    }
-    
-    public Oracle10gXETests( String name) {
-        super( name);
-    }
-
-	protected String databaseVendor() {
-		return "Oracle";
-	}
-
-	protected String databaseVersion() {
-		return "10";
-	}
-
-	protected String driverClass() {
-		return "oracle.jdbc.OracleDriver";
-	}
-
-	protected String driverDefinitionId() {
-		return "DriverDefn.Oracle Thin Driver";
-	}
-
-	protected String driverDefinitionType() {
-		return "org.eclipse.datatools.enablement.oracle.10.driverTemplate";
-	}
-
-	protected String driverName() {
-		return "Oracle 10g Thin Driver";
-	}
-	
-    protected String getConfigName() {
-    	return "oracle10gXE.properties";
-    }
-}
diff --git a/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/PostgreSQL824Tests.java b/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/PostgreSQL824Tests.java
deleted file mode 100644
index 70c024f..0000000
--- a/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/PostgreSQL824Tests.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0, which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html.
- *
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.db.tests.internal.platforms;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import junit.swingui.TestRunner;
-
-/**
- *  Oracle 10g Thin Driver Test
- */
-public class PostgreSQL824Tests extends DTPPlatformTests {
-
-    public static void main( String[] args) {
-        TestRunner.main( new String[] { "-c", PostgreSQL824Tests.class.getName()});
-    }
-
-    public static Test suite() {
-        return new TestSuite( PostgreSQL824Tests.class);
-    }
-    
-    public PostgreSQL824Tests( String name) {
-        super( name);
-    }
-
-	protected String databaseVendor() {
-		return "postgres";
-	}
-
-	protected String databaseVersion() {
-		return "8.x";
-	}
-
-	protected String driverClass() {
-		return "org.postgresql.Driver";
-	}
-
-	protected String driverDefinitionId() {
-		return "DriverDefn.PostgreSQL JDBC Driver";
-	}
-
-	protected String driverDefinitionType() {
-		return "org.eclipse.datatools.enablement.postgresql.postgresqlDriverTemplate";
-	}
-
-	protected String driverName() {
-		return "PostgreSQL JDBC Driver";
-	}
-	
-    protected String getConfigName() {
-    	return "postgresql824.properties";
-    }
-}
diff --git a/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/Sybase12Tests.java b/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/Sybase12Tests.java
deleted file mode 100644
index c92fb68..0000000
--- a/jpa/tests/org.eclipse.jpt.db.tests/src/org/eclipse/jpt/db/tests/internal/platforms/Sybase12Tests.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0, which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html.
- *
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.db.tests.internal.platforms;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import junit.swingui.TestRunner;
-
-/**
- *  Oracle 10g Thin Driver Test
- */
-public class Sybase12Tests extends DTPPlatformTests {
-
-    public static void main( String[] args) {
-        TestRunner.main( new String[] { "-c", Sybase12Tests.class.getName()});
-    }
-
-    public static Test suite() {
-        return new TestSuite( Sybase12Tests.class);
-    }
-    
-    public Sybase12Tests( String name) {
-        super( name);
-    }
-
-	protected String databaseVendor() {
-		return "Sybase";
-	}
-
-	protected String databaseVersion() {
-		return "12.x";
-	}
-
-	protected String driverClass() {
-		return "com.sybase.jdbc3.jdbc.SybDriver";
-	}
-
-	protected String driverDefinitionId() {
-		return "DriverDefn.Sybase JDBC Driver";
-	}
-
-	protected String driverDefinitionType() {
-		return "org.eclipse.datatools.enablement.sybase.ase.12_x.driverTemplate";
-	}
-
-	protected String driverName() {
-		return "Sybase JDBC Driver";
-	}
-	
-    protected String getConfigName() {
-    	return "sybase12.properties";
-    }
-}
diff --git a/jpa/tests/org.eclipse.jpt.ui.tests/.classpath b/jpa/tests/org.eclipse.jpt.ui.tests/.classpath
index 751c8f2..370877b 100644
--- a/jpa/tests/org.eclipse.jpt.ui.tests/.classpath
+++ b/jpa/tests/org.eclipse.jpt.ui.tests/.classpath
@@ -2,6 +2,12 @@
 <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="con" path="org.eclipse.pde.core.requiredPlugins">
+		<accessrules>
+			<accessrule kind="accessible" pattern="org/eclipse/jpt/ui/**"/>
+			<accessrule kind="accessible" pattern="org/eclipse/jpt/core/**"/>
+			<accessrule kind="accessible" pattern="org/eclipse/jpt/utility/**"/>
+		</accessrules>
+	</classpathentry>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/jpa/tests/org.eclipse.jpt.ui.tests/META-INF/MANIFEST.MF b/jpa/tests/org.eclipse.jpt.ui.tests/META-INF/MANIFEST.MF
index 2c8a31a..89e2edb 100644
--- a/jpa/tests/org.eclipse.jpt.ui.tests/META-INF/MANIFEST.MF
+++ b/jpa/tests/org.eclipse.jpt.ui.tests/META-INF/MANIFEST.MF
@@ -1,14 +1,18 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
 Bundle-SymbolicName: org.eclipse.jpt.ui.tests
 Bundle-Version: 1.0.0
-Require-Bundle: org.eclipse.core.runtime,
+Require-Bundle: org.junit,
+ org.eclipse.core.runtime,
+ org.eclipse.jface,
  org.eclipse.jpt.core.tests,
  org.eclipse.jpt.core.tests.extension.resource,
- org.eclipse.jpt.core,
- org.junit,
  org.eclipse.jpt.utility,
+ org.eclipse.jpt.core,
  org.eclipse.jpt.ui
 Eclipse-LazyStart: true
-Bundle-Vendor: %providerName
+Export-Package: org.eclipse.jpt.ui.tests;x-internal:=true,
+ org.eclipse.jpt.ui.tests.internal.platform;x-internal:=true,
+ org.eclipse.jpt.ui.tests.internal.swt;x-internal:=true
diff --git a/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/JptUiTests.java b/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/JptUiTests.java
index a1a8746..98f8493 100644
--- a/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/JptUiTests.java
+++ b/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/JptUiTests.java
@@ -19,7 +19,7 @@
 public class JptUiTests {
 
 	public static Test suite() {
-		TestSuite suite = new TestSuite(JptUiTests.class.getName());
+		TestSuite suite = new TestSuite(JptUiTests.class.getPackage().getName());
 		suite.addTest(JptUiPlatformTests.suite());
 		return suite;
 	}
diff --git a/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/internal/platform/JpaPlatformUiExtensionTests.java b/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/internal/platform/JpaPlatformUiExtensionTests.java
index 2d32578..26690fd 100644
--- a/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/internal/platform/JpaPlatformUiExtensionTests.java
+++ b/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/internal/platform/JpaPlatformUiExtensionTests.java
@@ -1,15 +1,13 @@
 package org.eclipse.jpt.ui.tests.internal.platform;
 
-import junit.framework.TestCase;
 import org.eclipse.jpt.core.internal.IJpaProject;
 import org.eclipse.jpt.core.tests.extension.resource.ExtensionTestPlugin;
 import org.eclipse.jpt.core.tests.extension.resource.TestJpaPlatform;
 import org.eclipse.jpt.core.tests.extension.resource.TestJpaPlatformUi;
 import org.eclipse.jpt.core.tests.internal.ProjectUtility;
 import org.eclipse.jpt.core.tests.internal.projects.TestJpaProject;
-import org.eclipse.jpt.ui.internal.IJpaPlatformUi;
-import org.eclipse.jpt.ui.internal.PlatformRegistry;
-import org.eclipse.jpt.ui.internal.generic.GenericPlatformUi;
+
+import junit.framework.TestCase;
 
 public class JpaPlatformUiExtensionTests extends TestCase
 {
@@ -21,7 +19,7 @@
 	public static final String TEST_PLUGIN_CLASS = ExtensionTestPlugin.class.getName();
 	public static final String TEST_PLUGIN_ID = ExtensionTestPlugin.PLUGIN_ID;
 
-	public static final String TEST_PLATFORM_ID = TestJpaPlatform.PLATFORM_ID;
+	public static final String TEST_PLATFORM_ID = TestJpaPlatform.ID;
 	public static final String TEST_PLATFORM_CLASS = TestJpaPlatform.class.getName();
 	public static final String TEST_PLATFORM_LABEL = "Test Jpa Platform";
 
@@ -35,7 +33,7 @@
 	@Override
 	protected void setUp() throws Exception {
 		super.setUp();
-		testProject = this.buildJpaProject(PROJECT_NAME, false);  // false = no auto-build
+		this.testProject = this.buildJpaProject(PROJECT_NAME, false);  // false = no auto-build
 	}
 
 	protected TestJpaProject buildJpaProject(String projectName, boolean autoBuild) throws Exception {
@@ -46,7 +44,7 @@
 	protected void tearDown() throws Exception {
 		//testProject.dispose();
 		ProjectUtility.deleteAllProjects();
-		testProject = null;
+		this.testProject = null;
 		super.tearDown();
 	}
 	
@@ -55,17 +53,7 @@
 	}
 	
 	public void testJpaPlatform() {
-		assertNotNull(PlatformRegistry.instance().jpaPlatform(jpaProject().getPlatform().getId()));
+		assertNotNull(PlatformRegistry.instance().jpaPlatform(jpaProject().jpaPlatform().getId()));
 	}
 	
-	public void testSetPlatform() {
-		IJpaPlatformUi platformUi = PlatformRegistry.instance().jpaPlatform(jpaProject().getPlatform().getId());
-		assertTrue(platformUi instanceof GenericPlatformUi);
-		
-		jpaProject().setPlatform(TEST_PLATFORM_ID);
-		
-		platformUi = PlatformRegistry.instance().jpaPlatform(jpaProject().getPlatform().getId());
-
-		assertTrue(platformUi.getClass().getName().equals(TEST_UI_PLATFORM_CLASS));
-	}
 }
diff --git a/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/internal/platform/JptUiPlatformTests.java b/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/internal/platform/JptUiPlatformTests.java
index 2614c59..50bcc99 100644
--- a/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/internal/platform/JptUiPlatformTests.java
+++ b/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/internal/platform/JptUiPlatformTests.java
@@ -1,13 +1,12 @@
 /*******************************************************************************
- *  Copyright (c) 2007 Oracle. 
- *  All rights reserved.  This program and the accompanying materials 
- *  are made available under the terms of the Eclipse Public License v1.0 
- *  which accompanies this distribution, and is available at 
- *  http://www.eclipse.org/legal/epl-v10.html
- *  
- *  Contributors: 
- *  	Oracle - initial API and implementation
- *******************************************************************************/
+ * Copyright (c) 2007 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
 package org.eclipse.jpt.ui.tests.internal.platform;
 
 import junit.framework.Test;
@@ -16,7 +15,7 @@
 public class JptUiPlatformTests
 {
 	public static Test suite() {
-		TestSuite suite = new TestSuite(JptUiPlatformTests.class.getName());
+		TestSuite suite = new TestSuite(JptUiPlatformTests.class.getPackage().getName());
 		suite.addTestSuite(JpaPlatformUiExtensionTests.class);
 		return suite;
 	}
diff --git a/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/internal/swt/CheckBoxModelAdapterUITest.java b/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/internal/swt/CheckBoxModelAdapterUITest.java
new file mode 100644
index 0000000..048ccf1
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/internal/swt/CheckBoxModelAdapterUITest.java
@@ -0,0 +1,318 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.ui.tests.internal.swt;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.window.ApplicationWindow;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jpt.ui.internal.swt.BooleanButtonModelAdapter;
+import org.eclipse.jpt.utility.internal.ClassTools;
+import org.eclipse.jpt.utility.internal.model.AbstractModel;
+import org.eclipse.jpt.utility.internal.model.value.PropertyAspectAdapter;
+import org.eclipse.jpt.utility.internal.model.value.PropertyValueModel;
+import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.utility.internal.model.value.WritablePropertyValueModel;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Play around with a set of check boxes.
+ */
+public class CheckBoxModelAdapterUITest
+	extends ApplicationWindow
+{
+	private final TestModel testModel;
+	private final WritablePropertyValueModel<TestModel> testModelHolder;
+	private final WritablePropertyValueModel<Boolean> flag1Holder;
+	private final WritablePropertyValueModel<Boolean> flag2Holder;
+	private final WritablePropertyValueModel<Boolean> notFlag2Holder;
+
+	public static void main(String[] args) throws Exception {
+		Window window = new CheckBoxModelAdapterUITest(args);
+		window.setBlockOnOpen(true);
+		window.open();
+		Display.getCurrent().dispose();
+		System.exit(0);
+	}
+
+	private CheckBoxModelAdapterUITest(String[] args) {
+		super(null);
+		this.testModel = new TestModel(true, true);
+		this.testModelHolder = new SimplePropertyValueModel<TestModel>(this.testModel);
+		this.flag1Holder = this.buildFlag1Holder(this.testModelHolder);
+		this.flag2Holder = this.buildFlag2Holder(this.testModelHolder);
+		this.notFlag2Holder = this.buildNotFlag2Holder(this.testModelHolder);
+	}
+
+	private WritablePropertyValueModel<Boolean> buildFlag1Holder(PropertyValueModel<TestModel> subjectHolder) {
+		return new PropertyAspectAdapter<TestModel, Boolean>(subjectHolder, TestModel.FLAG1_PROPERTY) {
+			@Override
+			protected Boolean buildValue_() {
+				return Boolean.valueOf(this.subject.isFlag1());
+			}
+			@Override
+			protected void setValue_(Boolean value) {
+				this.subject.setFlag1(value.booleanValue());
+			}
+		};
+	}
+
+	private WritablePropertyValueModel<Boolean> buildFlag2Holder(PropertyValueModel<TestModel> subjectHolder) {
+		return new PropertyAspectAdapter<TestModel, Boolean>(subjectHolder, TestModel.FLAG2_PROPERTY) {
+			@Override
+			protected Boolean buildValue_() {
+				return Boolean.valueOf(this.subject.isFlag2());
+			}
+			@Override
+			protected void setValue_(Boolean value) {
+				this.subject.setFlag2(value.booleanValue());
+			}
+		};
+	}
+
+	private WritablePropertyValueModel<Boolean> buildNotFlag2Holder(PropertyValueModel<TestModel> subjectHolder) {
+		return new PropertyAspectAdapter<TestModel, Boolean>(subjectHolder, TestModel.NOT_FLAG2_PROPERTY) {
+			@Override
+			protected Boolean buildValue_() {
+				return Boolean.valueOf(this.subject.isNotFlag2());
+			}
+			@Override
+			protected void setValue_(Boolean value) {
+				this.subject.setNotFlag2(value.booleanValue());
+			}
+		};
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		((Shell) parent).setText(ClassTools.shortClassNameForObject(this));
+		parent.setSize(400, 100);
+		Composite mainPanel = new Composite(parent, SWT.NONE);
+		mainPanel.setLayout(new FormLayout());
+		Control checkBoxPanel = this.buildCheckBoxPanel(mainPanel);
+		this.buildControlPanel(mainPanel, checkBoxPanel);
+		return mainPanel;
+	}
+
+	private Control buildCheckBoxPanel(Composite parent) {
+		Composite panel = new Composite(parent, SWT.NONE);
+
+		FormData fd = new FormData();
+			fd.top = new FormAttachment(0);
+			fd.bottom = new FormAttachment(100, -35);
+			fd.left = new FormAttachment(0);
+			fd.right = new FormAttachment(100);
+		panel.setLayoutData(fd);
+
+		panel.setLayout(new FillLayout());
+		this.buildFlag1CheckBox(panel);
+		this.buildFlag2CheckBox(panel);
+		this.buildNotFlag2CheckBox(panel);
+		this.buildUnattachedCheckBox(panel);
+
+		return panel;
+	}
+
+	private void buildFlag1CheckBox(Composite parent) {
+		Button checkBox = new Button(parent, SWT.CHECK);
+		checkBox.setText("flag 1");
+		BooleanButtonModelAdapter.adapt(this.flag1Holder, checkBox);
+	}
+
+	private void buildFlag2CheckBox(Composite parent) {
+		Button checkBox = new Button(parent, SWT.CHECK);
+		checkBox.setText("flag 2");
+		BooleanButtonModelAdapter.adapt(this.flag2Holder, checkBox);
+	}
+
+	private void buildNotFlag2CheckBox(Composite parent) {
+		Button checkBox = new Button(parent, SWT.CHECK);
+		checkBox.setText("not flag 2");
+		BooleanButtonModelAdapter.adapt(this.notFlag2Holder, checkBox);
+	}
+
+	private void buildUnattachedCheckBox(Composite parent) {
+		Button checkBox = new Button(parent, SWT.CHECK);
+		checkBox.setText("unattached");
+		checkBox.addSelectionListener(this.buildUnattachedSelectionListener());
+	}
+
+	private SelectionListener buildUnattachedSelectionListener() {
+		return new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+				System.out.println("unattached default selected: " + e);
+			}
+			public void widgetSelected(SelectionEvent e) {
+				System.out.println("unattached selected: " + e);
+			}
+		};
+	}
+
+	private void buildControlPanel(Composite parent, Control checkBoxPanel) {
+		Composite panel = new Composite(parent, SWT.NONE);
+		FormData fd = new FormData();
+			fd.top = new FormAttachment(checkBoxPanel);
+			fd.bottom = new FormAttachment(100);
+			fd.left = new FormAttachment(0);
+			fd.right = new FormAttachment(100);
+		panel.setLayoutData(fd);
+
+		panel.setLayout(new FillLayout());
+		this.buildFlipFlag1Button(panel);
+		this.buildNotFlag2ToggleButton(panel);
+		this.buildClearModelButton(panel);
+		this.buildRestoreModelButton(panel);
+		this.buildPrintModelButton(panel);
+	}
+
+	private void buildFlipFlag1Button(Composite parent) {
+		this.buildFlipFlag1ACI().fill(parent);
+	}
+
+	private ActionContributionItem buildFlipFlag1ACI() {
+		Action action = new Action("flip flag 1", IAction.AS_PUSH_BUTTON) {
+			@Override
+			public void run() {
+				CheckBoxModelAdapterUITest.this.flipFlag1();
+			}
+		};
+		action.setToolTipText("flip flag 1");
+		return new ActionContributionItem(action);
+	}
+
+	void flipFlag1() {
+		this.testModel.setFlag1( ! this.testModel.isFlag1());
+	}
+
+	private void buildNotFlag2ToggleButton(Composite parent) {
+		Button checkBox = new Button(parent, SWT.TOGGLE);
+		checkBox.setText("not flag 2");
+		BooleanButtonModelAdapter.adapt(this.notFlag2Holder, checkBox);
+	}
+
+	private void buildClearModelButton(Composite parent) {
+		this.buildClearModelACI().fill(parent);
+	}
+
+	private ActionContributionItem buildClearModelACI() {
+		Action action = new Action("clear model", IAction.AS_PUSH_BUTTON) {
+			@Override
+			public void run() {
+				CheckBoxModelAdapterUITest.this.clearModel();
+			}
+		};
+		action.setToolTipText("clear model");
+		return new ActionContributionItem(action);
+	}
+
+	void clearModel() {
+		this.testModelHolder.setValue(null);
+	}
+
+	private void buildRestoreModelButton(Composite parent) {
+		this.buildRestoreModelACI().fill(parent);
+	}
+
+	private ActionContributionItem buildRestoreModelACI() {
+		Action action = new Action("restore model", IAction.AS_PUSH_BUTTON) {
+			@Override
+			public void run() {
+				CheckBoxModelAdapterUITest.this.restoreModel();
+			}
+		};
+		action.setToolTipText("restore model");
+		return new ActionContributionItem(action);
+	}
+
+	void restoreModel() {
+		this.testModelHolder.setValue(this.testModel);
+	}
+
+	private void buildPrintModelButton(Composite parent) {
+		this.buildPrintModelACI().fill(parent);
+	}
+
+	private ActionContributionItem buildPrintModelACI() {
+		Action action = new Action("print model", IAction.AS_PUSH_BUTTON) {
+			@Override
+			public void run() {
+				CheckBoxModelAdapterUITest.this.printModel();
+			}
+		};
+		action.setToolTipText("print model");
+		return new ActionContributionItem(action);
+	}
+
+	void printModel() {
+		System.out.println("flag 1: " + this.testModel.isFlag1());
+		System.out.println("flag 2: " + this.testModel.isFlag2());
+		System.out.println("not flag 2: " + this.testModel.isNotFlag2());
+		System.out.println("***");
+	}
+
+
+	private class TestModel extends AbstractModel {
+		private boolean flag1;
+			public static final String FLAG1_PROPERTY = "flag1";
+		private boolean flag2;
+			public static final String FLAG2_PROPERTY = "flag2";
+		private boolean notFlag2;
+			public static final String NOT_FLAG2_PROPERTY = "notFlag2";
+	
+		public TestModel(boolean flag1, boolean flag2) {
+			this.flag1 = flag1;
+			this.flag2 = flag2;
+			this.notFlag2 = ! flag2;
+		}
+		public boolean isFlag1() {
+			return this.flag1;
+		}
+		public void setFlag1(boolean flag1) {
+			boolean old = this.flag1;
+			this.flag1 = flag1;
+			this.firePropertyChanged(FLAG1_PROPERTY, old, flag1);
+		}
+		public boolean isFlag2() {
+			return this.flag2;
+		}
+		public void setFlag2(boolean flag2) {
+			boolean old = this.flag2;
+			this.flag2 = flag2;
+			this.firePropertyChanged(FLAG2_PROPERTY, old, flag2);
+	
+			old = this.notFlag2;
+			this.notFlag2 = ! flag2;
+			this.firePropertyChanged(NOT_FLAG2_PROPERTY, old, this.notFlag2);
+		}
+		public boolean isNotFlag2() {
+			return this.notFlag2;
+		}
+		public void setNotFlag2(boolean notFlag2) {
+			this.setFlag2( ! notFlag2);
+		}
+		@Override
+		public String toString() {
+			return "TestModel(" + this.isFlag1() + " - " + this.isFlag2() + ")";
+		}
+	}
+
+}
diff --git a/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/internal/swt/ListBoxModelAdapterUITest.java b/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/internal/swt/ListBoxModelAdapterUITest.java
new file mode 100644
index 0000000..1976428
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.ui.tests/src/org/eclipse/jpt/ui/tests/internal/swt/ListBoxModelAdapterUITest.java
@@ -0,0 +1,641 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.ui.tests.internal.swt;
+
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.window.ApplicationWindow;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jpt.ui.internal.swt.ListBoxModelAdapter;
+import org.eclipse.jpt.ui.internal.swt.ListBoxModelAdapter.SelectionChangeEvent;
+import org.eclipse.jpt.utility.internal.ClassTools;
+import org.eclipse.jpt.utility.internal.model.AbstractModel;
+import org.eclipse.jpt.utility.internal.model.Model;
+import org.eclipse.jpt.utility.internal.model.value.CollectionAspectAdapter;
+import org.eclipse.jpt.utility.internal.model.value.CollectionValueModel;
+import org.eclipse.jpt.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.utility.internal.model.value.ListValueModel;
+import org.eclipse.jpt.utility.internal.model.value.SimpleCollectionValueModel;
+import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.utility.internal.model.value.SortedListValueModelAdapter;
+import org.eclipse.jpt.utility.internal.model.value.WritablePropertyValueModel;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * an example UI for testing various permutations of the
+ * StructuredContentProviderAdapter
+ */
+public class ListBoxModelAdapterUITest
+	extends ApplicationWindow
+{
+	final TaskList taskList;
+	private final WritablePropertyValueModel<TaskList> taskListHolder;
+	private Text taskTextField;
+
+	public static void main(String[] args) throws Exception {
+		Window window = new ListBoxModelAdapterUITest(args);
+		window.setBlockOnOpen(true);
+		window.open();
+		Display.getCurrent().dispose();
+		System.exit(0);
+	}
+
+	private ListBoxModelAdapterUITest(String[] args) {
+		super(null);
+		this.taskList = new TaskList();
+		this.taskListHolder = new SimplePropertyValueModel<TaskList>(this.taskList);
+		this.taskList.addTask("swim");
+		this.taskList.addTask("bike");
+		this.taskList.addTask("run");
+		Task rest = this.taskList.addTask("rest");
+		this.taskList.addPriorityTask(rest);
+		Task repeat = this.taskList.addTask("repeat");
+		this.taskList.addPriorityTask(repeat);
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		((Shell) parent).setText(ClassTools.shortClassNameForObject(this));
+		parent.setSize(800, 400);
+		Composite mainPanel = new Composite(parent, SWT.NONE);
+		mainPanel.setLayout(new FormLayout());
+		Control taskListPanel = this.buildTaskListPanel(mainPanel);
+		this.buildControlPanel(mainPanel, taskListPanel);
+		return mainPanel;
+	}
+
+	private Control buildTaskListPanel(Composite parent) {
+		Composite panel = new Composite(parent, SWT.NONE);
+
+		FormData fd = new FormData();
+			fd.top = new FormAttachment(0);
+			fd.bottom = new FormAttachment(100, -30);
+			fd.left = new FormAttachment(0);
+			fd.right = new FormAttachment(100);
+		panel.setLayoutData(fd);
+
+		panel.setLayout(new FormLayout());
+		this.buildPrimitiveTaskListPanel(panel);
+		this.buildObjectTaskListPanel(panel);
+
+		return panel;
+	}
+
+	private void buildPrimitiveTaskListPanel(Composite parent) {
+		Composite panel = new Composite(parent, SWT.NONE);
+
+		FormData fd = new FormData();
+			fd.top = new FormAttachment(0);
+			fd.bottom = new FormAttachment(50);
+			fd.left = new FormAttachment(0);
+			fd.right = new FormAttachment(100);
+		panel.setLayoutData(fd);
+
+		panel.setLayout(new FillLayout());
+		this.buildUnsortedPrimitiveListPanel(panel);
+		this.buildStandardSortedPrimitiveListPanel(panel);
+		this.buildCustomSortedPrimitiveListPanel(panel);
+	}
+
+	private void buildObjectTaskListPanel(Composite parent) {
+		Composite panel = new Composite(parent, SWT.NONE);
+
+		FormData fd = new FormData();
+			fd.top = new FormAttachment(50);
+			fd.bottom = new FormAttachment(100);
+			fd.left = new FormAttachment(0);
+			fd.right = new FormAttachment(100);
+		panel.setLayoutData(fd);
+
+		panel.setLayout(new FillLayout());
+		this.buildUnsortedObjectListPanel(panel);
+		this.buildStandardSortedObjectListPanel(panel);
+		this.buildCustomSortedObjectListPanel(panel);
+	}
+
+	private void buildUnsortedPrimitiveListPanel(Composite parent) {
+		this.buildListPanel(parent, "primitive unsorted", this.buildUnsortedPrimitiveListModel(), new SimpleCollectionValueModel<String>());
+	}
+
+	private void buildStandardSortedPrimitiveListPanel(Composite parent) {
+		this.buildListPanel(parent, "primitive sorted", this.buildStandardSortedPrimitiveListModel(), new SimpleCollectionValueModel<String>());
+	}
+
+	private void buildCustomSortedPrimitiveListPanel(Composite parent) {
+		this.buildListPanel(parent, "primitive reverse sorted", this.buildCustomSortedPrimitiveListModel(), new SimpleCollectionValueModel<String>());
+	}
+
+	private void buildUnsortedObjectListPanel(Composite parent) {
+		this.buildListPanel2(parent, "object unsorted", this.buildUnsortedObjectListModel(), this.buildPriorityTaskListAdapter());
+	}
+
+	private void buildStandardSortedObjectListPanel(Composite parent) {
+		this.buildListPanel2(parent, "object sorted", this.buildStandardSortedObjectListModel(), this.buildPriorityTaskListAdapter());
+	}
+
+	private void buildCustomSortedObjectListPanel(Composite parent) {
+		this.buildListPanel2(parent, "object reverse sorted", this.buildCustomSortedObjectListModel(), this.buildPriorityTaskListAdapter());
+	}
+
+	private ListValueModel buildUnsortedPrimitiveListModel() {
+		return this.buildPrimitiveTaskListAdapter();
+	}
+
+	private ListValueModel buildStandardSortedPrimitiveListModel() {
+		return new SortedListValueModelAdapter(this.buildPrimitiveTaskListAdapter());
+	}
+
+	private ListValueModel buildCustomSortedPrimitiveListModel() {
+		return new SortedListValueModelAdapter(this.buildPrimitiveTaskListAdapter(), this.buildCustomStringComparator());
+	}
+
+	private ListValueModel buildUnsortedObjectListModel() {
+		return this.buildObjectTaskListAdapter();
+	}
+
+	private ListValueModel buildStandardSortedObjectListModel() {
+		return new SortedListValueModelAdapter(this.buildObjectTaskListAdapter());
+	}
+
+	private ListValueModel buildCustomSortedObjectListModel() {
+		return new SortedListValueModelAdapter(this.buildObjectTaskListAdapter(), this.buildCustomTaskComparator());
+	}
+
+	private ListBoxModelAdapter buildListPanel(Composite parent, String label, ListValueModel model, CollectionValueModel selectedItemsModel) {
+		Composite panel = new Composite(parent, SWT.NONE);
+		panel.setLayout(new FormLayout());
+
+		Label listLabel = new Label(panel, SWT.LEFT | SWT.VERTICAL);
+		listLabel.setText(label);
+		FormData fd = new FormData();
+			fd.top = new FormAttachment(0, 3);
+			fd.bottom = new FormAttachment(0, 20);
+			fd.left = new FormAttachment(0, 5);
+			fd.right = new FormAttachment(100);
+		listLabel.setLayoutData(fd);
+
+		org.eclipse.swt.widgets.List listBox = new org.eclipse.swt.widgets.List(panel, SWT.MULTI | SWT.BORDER);
+		fd = new FormData();
+			fd.top = new FormAttachment(listLabel);
+			fd.bottom = new FormAttachment(100);
+			fd.left = new FormAttachment(0);
+			fd.right = new FormAttachment(100);
+		listBox.setLayoutData(fd);
+		return ListBoxModelAdapter.adapt(model, selectedItemsModel, listBox);  // use #toString()
+	}
+
+	private void buildListPanel2(Composite parent, String label, ListValueModel model, CollectionValueModel selectedItemsModel) {
+		ListBoxModelAdapter<Task> adapter = this.buildListPanel(parent, label, model, selectedItemsModel);
+		adapter.addDoubleClickListener(this.buildDoubleClickListener());
+		adapter.addSelectionChangeListener(this.buildSelectionChangeListener());
+	}
+
+	private ListBoxModelAdapter.DoubleClickListener<Task> buildDoubleClickListener() {
+		return new ListBoxModelAdapter.DoubleClickListener<Task>() {
+			public void doubleClick(ListBoxModelAdapter.DoubleClickEvent<Task> event) {
+				System.out.println("double-click: " + event.selection());
+			}
+		};
+	}
+
+	private ListBoxModelAdapter.SelectionChangeListener<Task> buildSelectionChangeListener() {
+		return new ListBoxModelAdapter.SelectionChangeListener<Task>() {
+			public void selectionChanged(SelectionChangeEvent<Task> event) {
+				ListBoxModelAdapterUITest.this.taskList.setPriorityTasks(event.selection());
+			}
+		};
+	}
+
+	private Comparator<String> buildCustomStringComparator() {
+		return new Comparator<String>() {
+			public int compare(String s1, String s2) {
+				return s2.compareTo(s1);
+			}
+		};
+	}
+
+	private Comparator<Task> buildCustomTaskComparator() {
+		return new Comparator<Task>() {
+			public int compare(Task to1, Task to2) {
+				return to2.compareTo(to1);
+			}
+		};
+	}
+
+	private ListValueModel buildPrimitiveTaskListAdapter() {
+		return new ListAspectAdapter(this.taskListHolder, TaskList.TASK_NAMES_LIST) {
+			@Override
+			protected ListIterator<String> listIterator_() {
+				return ((TaskList) this.subject).taskNames();
+			}
+		};
+	}
+
+	private ListValueModel buildObjectTaskListAdapter() {
+		return new ListAspectAdapter(this.taskListHolder, TaskList.TASKS_LIST) {
+			@Override
+			protected ListIterator<Task> listIterator_() {
+				return ((TaskList) this.subject).tasks();
+			}
+		};
+	}
+
+	private CollectionValueModel buildPriorityTaskListAdapter() {
+		return new CollectionAspectAdapter(this.taskListHolder, TaskList.PRIORITY_TASKS_COLLECTION) {
+			@Override
+			protected Iterator<Task> iterator_() {
+				return ((TaskList) this.subject).priorityTasks();
+			}
+		};
+	}
+
+	private void buildControlPanel(Composite parent, Control taskListPanel) {
+		Composite panel = new Composite(parent, SWT.NONE);
+		FormData fd = new FormData();
+			fd.top = new FormAttachment(taskListPanel);
+			fd.bottom = new FormAttachment(100);
+			fd.left = new FormAttachment(0);
+			fd.right = new FormAttachment(100);
+		panel.setLayoutData(fd);
+
+		panel.setLayout(new FormLayout());
+		Control misc = this.buildMiscTaskPanel(panel);
+		this.buildAddRemoveTaskPanel(panel, misc);
+	}
+
+	// is there a better way to associate an ACI with form data?
+	private Control buildMiscTaskPanel(Composite parent) {
+		Composite panel = new Composite(parent, SWT.NONE);
+		FormData fd = new FormData();
+			fd.top = new FormAttachment(0);
+			fd.bottom = new FormAttachment(100);
+			fd.left = new FormAttachment(100, -400);
+			fd.right = new FormAttachment(100);
+		panel.setLayoutData(fd);
+
+		panel.setLayout(new FillLayout());
+		this.buildClearListACI().fill(panel);
+		this.buildClearModelACI().fill(panel);
+		this.buildRestoreModelACI().fill(panel);
+		this.buildAddPriorityTaskACI().fill(panel);
+		this.buildRemovePriorityTaskACI().fill(panel);
+		this.buildClearPriorityTasksACI().fill(panel);
+		return panel;
+	}
+
+	private ActionContributionItem buildClearListACI() {
+		Action action = new Action("clear list", IAction.AS_PUSH_BUTTON) {
+			@Override
+			public void run() {
+				ListBoxModelAdapterUITest.this.clearTasks();
+			}
+		};
+		action.setToolTipText("clear all the tasks");
+		return new ActionContributionItem(action);
+	}
+
+	private ActionContributionItem buildClearModelACI() {
+		Action action = new Action("clear model", IAction.AS_PUSH_BUTTON) {
+			@Override
+			public void run() {
+				ListBoxModelAdapterUITest.this.clearModel();
+			}
+		};
+		action.setToolTipText("clear the task list model");
+		return new ActionContributionItem(action);
+	}
+
+	private ActionContributionItem buildRestoreModelACI() {
+		Action action = new Action("restore model", IAction.AS_PUSH_BUTTON) {
+			@Override
+			public void run() {
+				ListBoxModelAdapterUITest.this.restoreModel();
+			}
+		};
+		action.setToolTipText("restore the task list model");
+		return new ActionContributionItem(action);
+	}
+
+	private ActionContributionItem buildAddPriorityTaskACI() {
+		Action action = new Action("add priority", IAction.AS_PUSH_BUTTON) {
+			@Override
+			public void run() {
+				ListBoxModelAdapterUITest.this.addPriorityTask();
+			}
+		};
+		action.setToolTipText("add a task to the priority tasks");
+		return new ActionContributionItem(action);
+	}
+
+	private ActionContributionItem buildRemovePriorityTaskACI() {
+		Action action = new Action("remove priority", IAction.AS_PUSH_BUTTON) {
+			@Override
+			public void run() {
+				ListBoxModelAdapterUITest.this.removePriorityTask();
+			}
+		};
+		action.setToolTipText("remove a task from the priority tasks");
+		return new ActionContributionItem(action);
+	}
+
+	private ActionContributionItem buildClearPriorityTasksACI() {
+		Action action = new Action("clear priority", IAction.AS_PUSH_BUTTON) {
+			@Override
+			public void run() {
+				ListBoxModelAdapterUITest.this.clearPriorityTasks();
+			}
+		};
+		action.setToolTipText("clear the priority tasks");
+		return new ActionContributionItem(action);
+	}
+
+	private void buildAddRemoveTaskPanel(Composite parent, Control clearButton) {
+		Composite panel = new Composite(parent, SWT.NONE);
+		FormData fd = new FormData();
+			fd.top = new FormAttachment(0);
+			fd.bottom = new FormAttachment(100);
+			fd.left = new FormAttachment(0);
+			fd.right = new FormAttachment(clearButton);
+		panel.setLayoutData(fd);
+
+		panel.setLayout(new FormLayout());
+		Control addButton = this.buildAddButton(panel);
+		Control removeButton = this.buildRemoveButton(panel);
+		this.buildTaskTextField(panel, addButton, removeButton);
+	}
+
+	// is there a better way to associate an ACI with form data?
+	private Control buildAddButton(Composite parent) {
+		Composite panel = new Composite(parent, SWT.NONE);
+		FormData fd = new FormData();
+			fd.top = new FormAttachment(0);
+			fd.bottom = new FormAttachment(100);
+			fd.left = new FormAttachment(0);
+			fd.right = new FormAttachment(0, 50);
+		panel.setLayoutData(fd);
+
+		panel.setLayout(new FillLayout());
+		this.buildAddACI().fill(panel);
+		return panel;
+	}
+
+	private ActionContributionItem buildAddACI() {
+		Action action = new Action("add", IAction.AS_PUSH_BUTTON) {
+			@Override
+			public void run() {
+				ListBoxModelAdapterUITest.this.addTask();
+			}
+		};
+		action.setToolTipText("add a task with the name in the entry field");
+		return new ActionContributionItem(action);
+	}
+
+	// is there a better way to associate an ACI with form data?
+	private Control buildRemoveButton(Composite parent) {
+		Composite panel = new Composite(parent, SWT.NONE);
+		FormData fd = new FormData();
+			fd.top = new FormAttachment(0);
+			fd.bottom = new FormAttachment(100);
+			fd.left = new FormAttachment(100, -50);
+			fd.right = new FormAttachment(100);
+		panel.setLayoutData(fd);
+
+		panel.setLayout(new FillLayout());
+		this.buildRemoveACI().fill(panel);
+		return panel;
+	}
+
+	private ActionContributionItem buildRemoveACI() {
+		Action action = new Action("remove", IAction.AS_PUSH_BUTTON) {
+			@Override
+			public void run() {
+				ListBoxModelAdapterUITest.this.removeTask();
+			}
+		};
+		action.setToolTipText("remove the task with the name in the entry field");
+		return new ActionContributionItem(action);
+	}
+
+	private void buildTaskTextField(Composite parent, Control addButton, Control removeButton) {
+		this.taskTextField = new Text(parent, SWT.SINGLE | SWT.BORDER);
+		FormData fd = new FormData();
+			fd.top = new FormAttachment(0);
+			fd.bottom = new FormAttachment(100);
+			fd.left = new FormAttachment(addButton);
+			fd.right = new FormAttachment(removeButton);
+		this.taskTextField.setLayoutData(fd);
+	}
+
+	private String taskTextFieldText() {
+		return this.taskTextField.getText();
+	}
+
+	void addTask() {
+		String taskText = this.taskTextFieldText();
+		if (taskText.length() != 0) {
+			this.taskList.addTask(taskText);
+		}
+	}
+
+	void removeTask() {
+		String task = this.taskTextFieldText();
+		if (task.length() != 0) {
+			this.taskList.removeTask(task);
+		}
+	}
+
+	void clearTasks() {
+		this.taskList.clearTasks();
+	}
+
+	void clearModel() {
+		this.taskListHolder.setValue(null);
+	}
+
+	void restoreModel() {
+		this.taskListHolder.setValue(this.taskList);
+	}
+
+	void addPriorityTask() {
+		Iterator<Task> tasks = this.taskList.tasks();
+		while (tasks.hasNext()) {
+			if (this.taskList.addPriorityTask(tasks.next())) {
+				return;
+			}
+		}
+	}
+
+	void removePriorityTask() {
+		Iterator<Task> pTasks = this.taskList.priorityTasks();
+		if (pTasks.hasNext()) {
+			this.taskList.removePriorityTask(pTasks.next());
+		}
+	}
+
+	void clearPriorityTasks() {
+		this.taskList.clearPriorityTasks();
+	}
+
+
+	// ********** TaskList **********
+
+	// note absence of validation...
+	private class TaskList extends AbstractModel {
+		private final List<String> taskNames = new ArrayList<String>();
+			public static final String TASK_NAMES_LIST = "taskNames";
+		private final List<Task> tasks = new ArrayList<Task>();
+			public static final String TASKS_LIST = "tasks";
+		private final Collection<Task> priorityTasks = new HashSet<Task>();
+			public static final String PRIORITY_TASKS_COLLECTION = "priorityTasks";
+		TaskList() {
+			super();
+		}
+		public ListIterator<String> taskNames() {
+			return this.taskNames.listIterator();
+		}
+		public ListIterator<Task> tasks() {
+			return this.tasks.listIterator();
+		}
+		public Iterator<Task> priorityTasks() {
+			return this.priorityTasks.iterator();
+		}
+		public Task addTask(String taskName) {
+			this.addItemToList(taskName, this.taskNames, TASK_NAMES_LIST);
+			Task task = new Task(taskName);
+			this.addItemToList(task, this.tasks, TASKS_LIST);
+			return task;
+		}		
+		public void removeTask(String taskName) {
+			int index = this.taskNames.indexOf(taskName);
+			if (index != -1) {
+				this.removeItemFromList(index, this.taskNames, TASK_NAMES_LIST);
+				// assume the indexes match...
+				Task removedTask = this.removeItemFromList(index, this.tasks, TASKS_LIST);
+				this.removeItemFromCollection(removedTask, this.priorityTasks, PRIORITY_TASKS_COLLECTION);
+			}
+		}
+		public void clearTasks() {
+			this.taskNames.clear();
+			this.fireListCleared(TASK_NAMES_LIST);
+			this.tasks.clear();
+			this.fireListCleared(TASKS_LIST);
+		}
+		public boolean addPriorityTask(Task task) {
+			return this.addItemToCollection(task, this.priorityTasks, PRIORITY_TASKS_COLLECTION);
+		}		
+		public void removePriorityTask(Task task) {
+			this.removeItemFromCollection(task, this.priorityTasks, PRIORITY_TASKS_COLLECTION);
+		}
+		public void clearPriorityTasks() {
+			this.clearCollection(this.priorityTasks, PRIORITY_TASKS_COLLECTION);
+		}
+		public void setPriorityTasks(Iterator<Task> tasks) {
+			this.priorityTasks.clear();
+			while (tasks.hasNext()) {
+				this.priorityTasks.add(tasks.next());
+			}
+			this.fireCollectionChanged(PRIORITY_TASKS_COLLECTION);
+		}
+	}
+
+
+	// ********** Task **********
+
+	private class Task extends AbstractModel implements Displayable {
+		private String name;
+		private Date creationTimeStamp;
+		public Task(String name) {
+			this.name = name;
+			this.creationTimeStamp = new Date();
+		}
+		public String displayString() {
+			return this.name + ": " + this.creationTimeStamp.getTime();
+		}
+		public int compareTo(Displayable o) {
+			return DEFAULT_COMPARATOR.compare(this, o);
+		}
+		public String getName() {
+			return this.name;
+		}
+		public void setName(String name) {
+			Object old = this.name;
+			this.name = name;
+			this.firePropertyChanged(DISPLAY_STRING_PROPERTY, old, name);
+		}
+		@Override
+		public String toString() {
+			return this.displayString();
+		}
+	}
+
+	public interface Displayable extends Model, Comparable<Displayable> {
+	
+		String displayString();
+			String DISPLAY_STRING_PROPERTY = "displayString";
+	
+	
+		// ********** helper implementations **********
+	
+		Collator DEFAULT_COLLATOR = Collator.getInstance();
+	
+		Comparator<Displayable> DEFAULT_COMPARATOR =
+			new Comparator<Displayable>() {
+				public int compare(Displayable d1, Displayable d2) {
+					// disallow duplicates based on object identity
+					if (d1 == d2) {
+						return 0;
+					}
+	
+					// first compare display strings using the default collator
+					int result = DEFAULT_COLLATOR.compare(d1.displayString(), d2.displayString());
+					if (result != 0) {
+						return result;
+					}
+	
+					// then compare using object-id
+					result = System.identityHashCode(d1) - System.identityHashCode(d2);
+					if (result != 0) {
+						return result;
+					}
+	
+					// It's unlikely that we get to this point; but, just in case, we will return -1.
+					// Unfortunately, this introduces some mild unpredictability to the sort order
+					// (unless the objects are always passed into this method in the same order).
+					return -1;		// if all else fails, indicate that o1 < o2
+				}
+				@Override
+				public String toString() {
+					return "Displayable.DEFAULT_COMPARATOR";
+				}
+			};
+	
+	}
+}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/.cvsignore b/jpa/tests/org.eclipse.jpt.utility.tests/.cvsignore
index c4ba612..ba077a4 100644
--- a/jpa/tests/org.eclipse.jpt.utility.tests/.cvsignore
+++ b/jpa/tests/org.eclipse.jpt.utility.tests/.cvsignore
@@ -1,5 +1 @@
 bin
-@dot
-temp.folder
-build.xml
-javaCompiler...args
\ No newline at end of file
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/META-INF/MANIFEST.MF b/jpa/tests/org.eclipse.jpt.utility.tests/META-INF/MANIFEST.MF
index 878f564..1870613 100644
--- a/jpa/tests/org.eclipse.jpt.utility.tests/META-INF/MANIFEST.MF
+++ b/jpa/tests/org.eclipse.jpt.utility.tests/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-SymbolicName: org.eclipse.jpt.utility.tests
-Bundle-Version: 1.1.0
+Bundle-Version: 1.0.0
 Bundle-Localization: plugin
 Require-Bundle: org.eclipse.jpt.utility,
  org.junit;bundle-version="[3.0.0,4.0.0)"
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/CollectionToolsTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/CollectionToolsTests.java
index 7bd0a7d..ad7980f 100644
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/CollectionToolsTests.java
+++ b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/CollectionToolsTests.java
@@ -1351,183 +1351,6 @@
 		assertEquals(0, CollectionTools.min(this.buildIntArray()));
 	}
 
-	public void testMoveObjectArrayIntInt() {
-		String[] array = new String[] { "0", "1", "2", "3", "4", "5" };
-
-		String[] result = CollectionTools.move(array, 4, 2);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "0", "1", "3", "4", "2", "5" }, result));
-
-		result = CollectionTools.move(array, 0, 5);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "5", "0", "1", "3", "4", "2" }, result));
-
-		result = CollectionTools.move(array, 2, 4);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "5", "0", "4", "1", "3", "2" }, result));
-	}
-
-	public void testMoveObjectArrayIntIntInt() {
-		String[] array = new String[] { "0", "1", "2", "3", "4", "5" };
-
-		String[] result = CollectionTools.move(array, 4, 2, 1);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "0", "1", "3", "4", "2", "5" }, result));
-
-		result = CollectionTools.move(array, 0, 5, 1);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "5", "0", "1", "3", "4", "2" }, result));
-
-		result = CollectionTools.move(array, 2, 4, 1);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "5", "0", "4", "1", "3", "2" }, result));
-
-		result = CollectionTools.move(array, 2, 4, 2);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "5", "0", "3", "2", "4", "1" }, result));
-
-		result = CollectionTools.move(array, 0, 1, 4);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "0", "3", "2", "4", "5", "1" }, result));
-
-		result = CollectionTools.move(array, 1, 0, 4);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "5", "0", "3", "2", "4", "1" }, result));
-	}
-
-	public void testMoveIntArrayIntInt() {
-		int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
-
-		int[] result = CollectionTools.move(array, 4, 2);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new int[] { 0, 1, 3, 4, 2, 5 }, result));
-
-		result = CollectionTools.move(array, 0, 5);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new int[] { 5, 0, 1, 3, 4, 2 }, result));
-
-		result = CollectionTools.move(array, 2, 4);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new int[] { 5, 0, 4, 1, 3, 2 }, result));
-	}
-
-	public void testMoveInttArrayIntIntInt() {
-		int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
-
-		int[] result = CollectionTools.move(array, 4, 2, 1);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new int[] { 0, 1, 3, 4, 2, 5 }, result));
-
-		result = CollectionTools.move(array, 0, 5, 1);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new int[] { 5, 0, 1, 3, 4, 2 }, result));
-
-		result = CollectionTools.move(array, 2, 4, 1);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new int[] { 5, 0, 4, 1, 3, 2 }, result));
-
-		result = CollectionTools.move(array, 2, 4, 2);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new int[] { 5, 0, 3, 2, 4, 1 }, result));
-
-		result = CollectionTools.move(array, 0, 1, 4);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new int[] { 0, 3, 2, 4, 5, 1 }, result));
-
-		result = CollectionTools.move(array, 1, 0, 4);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new int[] { 5, 0, 3, 2, 4, 1 }, result));
-	}
-
-	public void testMoveCharArrayIntInt() {
-		char[] array = new char[] { 'a', 'b', 'c', 'd', 'e', 'f' };
-
-		char[] result = CollectionTools.move(array, 4, 2);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new char[] { 'a', 'b', 'd', 'e', 'c', 'f' }, result));
-
-		result = CollectionTools.move(array, 0, 5);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new char[] { 'f', 'a', 'b', 'd', 'e', 'c' }, result));
-
-		result = CollectionTools.move(array, 2, 4);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new char[] { 'f', 'a', 'e', 'b', 'd', 'c' }, result));
-	}
-
-	public void testMoveCharArrayIntIntInt() {
-		char[] array = new char[] { 'a', 'b', 'b', 'c', 'd', 'e' };
-
-		char[] result = CollectionTools.move(array, 4, 2, 1);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new char[] { 'a', 'b', 'c', 'd', 'b', 'e' }, result));
-
-		result = CollectionTools.move(array, 0, 5, 1);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new char[] { 'e', 'a', 'b', 'c', 'd', 'b' }, result));
-
-		result = CollectionTools.move(array, 2, 4, 1);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new char[] { 'e', 'a', 'd', 'b', 'c', 'b' }, result));
-
-		result = CollectionTools.move(array, 2, 4, 2);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new char[] { 'e', 'a', 'c', 'b', 'd', 'b' }, result));
-
-		result = CollectionTools.move(array, 0, 1, 4);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new char[] { 'a', 'c', 'b', 'd', 'e', 'b' }, result));
-
-		result = CollectionTools.move(array, 1, 0, 4);
-		assertSame(array, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new char[] { 'e', 'a', 'c', 'b', 'd', 'b' }, result));
-	}
-
-	public void testMoveListIntInt() {
-		List<String> list = new ArrayList<String>();
-		CollectionTools.addAll(list, new String[] { "0", "1", "2", "3", "4", "5" });
-
-		List<String> result = CollectionTools.move(list, 4, 2);
-		assertSame(list, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "0", "1", "3", "4", "2", "5" }, result.toArray()));
-
-		result = CollectionTools.move(list, 0, 5);
-		assertSame(list, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "5", "0", "1", "3", "4", "2" }, result.toArray()));
-
-		result = CollectionTools.move(list, 2, 4);
-		assertSame(list, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "5", "0", "4", "1", "3", "2" }, result.toArray()));
-	}
-
-	public void testMoveListIntIntInt() {
-		List<String> list = new ArrayList<String>(Arrays.asList(new String[] { "0", "1", "2", "3", "4", "5" }));
-
-		List<String> result = CollectionTools.move(list, 4, 2, 1);
-		assertSame(list, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "0", "1", "3", "4", "2", "5" }, result.toArray()));
-
-		result = CollectionTools.move(list, 0, 5, 1);
-		assertSame(list, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "5", "0", "1", "3", "4", "2" }, result.toArray()));
-
-		result = CollectionTools.move(list, 2, 4, 1);
-		assertSame(list, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "5", "0", "4", "1", "3", "2" }, result.toArray()));
-
-		result = CollectionTools.move(list, 2, 4, 2);
-		assertSame(list, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "5", "0", "3", "2", "4", "1" }, result.toArray()));
-
-		result = CollectionTools.move(list, 0, 1, 4);
-		assertSame(list, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "0", "3", "2", "4", "5", "1" }, result.toArray()));
-
-		result = CollectionTools.move(list, 1, 0, 4);
-		assertSame(list, result);  // the array is modified in place and returned
-		assertTrue(Arrays.equals(new String[] { "5", "0", "3", "2", "4", "1" }, result.toArray()));
-	}
-
 	public void testRemoveAllObjectArrayObjectArray() {
 		String[] a1 = new String[] { "A", "A", "B", "B", "C", "C", "D", "D", "E", "E", "F", "F" };
 		String[] a2 = new String[] { "E", "B" };
@@ -1842,41 +1665,6 @@
 
 	public void testRemoveElementAtIndexIntArrayInt() {
 		int[] a = new int[] { 8, 6, 7, 33, 2, 11 };
-		a = CollectionTools.removeElementsAtIndex(a, 3, 3);
-		assertTrue(Arrays.equals(new int[] { 8, 6, 7 }, a));
-	}
-
-	public void testRemoveElementsAtIndexListIntInt() {
-		List<String> list = new ArrayList<String>(Arrays.asList(new String[] { "A", "B", "A", "C", "A", "D" }));
-		List<String> removed = CollectionTools.removeElementsAtIndex(list, 3, 2);
-		assertTrue(Arrays.equals(new String[] { "A", "B", "A", "D" }, list.toArray()));
-		assertTrue(Arrays.equals(new String[] { "C", "A" }, removed.toArray()));
-
-		list = new ArrayList<String>(Arrays.asList(new String[] { "A", "B", "C", "D", "E", "F" }));
-		removed = CollectionTools.removeElementsAtIndex(list, 3, 3);
-		assertTrue(Arrays.equals(new String[] { "A", "B", "C" }, list.toArray()));
-		assertTrue(Arrays.equals(new String[] { "D", "E", "F" }, removed.toArray()));
-
-		list = new ArrayList<String>(Arrays.asList(new String[] { "A", "B", "C", "D", "E", "F" }));
-		removed = CollectionTools.removeElementsAtIndex(list, 0, 3);
-		assertTrue(Arrays.equals(new String[] { "D", "E", "F" }, list.toArray()));
-		assertTrue(Arrays.equals(new String[] { "A", "B", "C" }, removed.toArray()));
-	}
-
-	public void testRemoveElementsAtIndexObjectArrayIntInt() {
-		String[] a = new String[] { "A", "B", "A", "C", "A", "D" };
-		a = CollectionTools.removeElementsAtIndex(a, 3, 2);
-		assertTrue(Arrays.equals(new String[] { "A", "B", "A", "D" }, a));
-	}
-
-	public void testRemoveElementsAtIndexCharArrayIntInt() {
-		char[] a = new char[] { 'A', 'B', 'A', 'C', 'A', 'D' };
-		a = CollectionTools.removeElementsAtIndex(a, 0, 5);
-		assertTrue(Arrays.equals(new char[] { 'D' }, a));
-	}
-
-	public void testRemoveElementsAtIndexIntArrayIntInt() {
-		int[] a = new int[] { 8, 6, 7, 33, 2, 11 };
 		a = CollectionTools.removeElementAtIndex(a, 3);
 		assertTrue(Arrays.equals(new int[] { 8, 6, 7, 2, 11 }, a));
 	}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/HashBagTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/HashBagTests.java
index 96df7b6..51120c9 100644
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/HashBagTests.java
+++ b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/HashBagTests.java
@@ -14,13 +14,11 @@
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
-
+import junit.framework.TestCase;
 import org.eclipse.jpt.utility.internal.Bag;
 import org.eclipse.jpt.utility.internal.CollectionTools;
 import org.eclipse.jpt.utility.internal.HashBag;
 
-import junit.framework.TestCase;
-
 public class HashBagTests extends TestCase {
 	private HashBag<String> bag;
 
@@ -70,7 +68,7 @@
 		Collection<String> c = this.buildCollection();
 		Bag<String> b = new HashBag<String>(c);
 		for (String s : c) {
-			assertTrue(b.contains(s));
+			assertTrue("missing element", b.contains(s));
 		}
 	}
 
@@ -83,7 +81,7 @@
 		} catch (IllegalArgumentException ex) {
 			exCaught = true;
 		}
-		assertTrue(exCaught);
+		assertTrue("IllegalArgumentException not thrown", exCaught);
 
 		exCaught = false;
 		try {
@@ -91,78 +89,60 @@
 		} catch (IllegalArgumentException ex) {
 			exCaught = true;
 		}
-		assertTrue(exCaught);
+		assertTrue("IllegalArgumentException not thrown", exCaught);
 	}
 
 	public void testAdd() {
 		// the other adds took place in setUp
-		assertTrue(this.bag.add("five"));
+		assertTrue("incorrect return value", this.bag.add("five"));
 
-		assertTrue(this.bag.contains("one"));
-		assertTrue(this.bag.contains("two"));
-		assertTrue(this.bag.contains("three"));
-		assertTrue(this.bag.contains("four"));
-		assertTrue(this.bag.contains("five"));
-	}
-
-	public void testAddCount() {
-		// the other adds took place in setUp
-		this.bag.add("minus3", -3);
-		this.bag.add("zero", 0);
-		this.bag.add("five", 5);
-
-		assertFalse(this.bag.contains("minus3"));
-		assertFalse(this.bag.contains("zero"));
-		assertEquals(1, this.bag.count("one"));
-		assertEquals(2, this.bag.count("two"));
-		assertEquals(3, this.bag.count("three"));
-		assertEquals(4, this.bag.count("four"));
-		assertEquals(5, this.bag.count("five"));
-
-		this.bag.add("three", 2);
-		assertEquals(5, this.bag.count("three"));
+		assertTrue("missing element", this.bag.contains("one"));
+		assertTrue("missing element", this.bag.contains("two"));
+		assertTrue("missing element", this.bag.contains("three"));
+		assertTrue("missing element", this.bag.contains("four"));
+		assertTrue("missing element", this.bag.contains("five"));
 	}
 
 	public void testAddAll() {
 		Collection<String> c = this.buildCollection();
-		assertTrue(this.bag.addAll(c));
+		assertTrue("incorrect return value", this.bag.addAll(c));
 		for (String s : c) {
-			assertTrue(this.bag.contains(s));
+			assertTrue("missing element", this.bag.contains(s));
 		}
 	}
 
 	public void testClear() {
-		assertTrue(this.bag.contains("one"));
-		assertTrue(this.bag.contains("two"));
-		assertTrue(this.bag.contains("three"));
-		assertTrue(this.bag.contains("four"));
-		assertTrue(this.bag.contains(null));
-		assertEquals(11, this.bag.size());
+		assertTrue("missing element", this.bag.contains("one"));
+		assertTrue("missing element", this.bag.contains("two"));
+		assertTrue("missing element", this.bag.contains("three"));
+		assertTrue("missing element", this.bag.contains("four"));
+		assertTrue("missing element", this.bag.contains(null));
+		assertEquals("invalid size", 11, this.bag.size());
 		this.bag.clear();
-		assertFalse(this.bag.contains("one"));
-		assertFalse(this.bag.contains("two"));
-		assertFalse(this.bag.contains("three"));
-		assertFalse(this.bag.contains("four"));
-		assertFalse(this.bag.contains(null));
-		assertEquals(0, this.bag.size());
+		assertFalse("malingering element", this.bag.contains("one"));
+		assertFalse("malingering element", this.bag.contains("two"));
+		assertFalse("malingering element", this.bag.contains("three"));
+		assertFalse("malingering element", this.bag.contains("four"));
+		assertFalse("malingering element", this.bag.contains(null));
+		assertEquals("invalid size", 0, this.bag.size());
 	}
 
 	public void testClone() {
 		Bag<String> bag2 = this.bag.clone();
-		assertTrue(this.bag != bag2);
-		assertEquals(this.bag, bag2);
-		assertTrue(this.bag.hashCode() == bag2.hashCode());
+		assertTrue("bad clone", this.bag != bag2);
+		assertEquals("bad clone", this.bag, bag2);
+		assertTrue("bad clone", this.bag.hashCode() == bag2.hashCode());
 	}
 
 	public void testContains() {
-		assertTrue(this.bag.contains(null));
-		assertTrue(this.bag.contains("one"));
-		assertTrue(this.bag.contains("two"));
-		assertTrue(this.bag.contains("three"));
-		assertTrue(this.bag.contains("four"));
-		assertTrue(this.bag.contains(new String("four")));
-		assertTrue(this.bag.contains("fo" + "ur"));
-		assertFalse(this.bag.contains("five"));
+		assertTrue("missing element", this.bag.contains(null));
+		assertTrue("missing element", this.bag.contains("one"));
+		assertTrue("missing element", this.bag.contains("two"));
+		assertTrue("missing element", this.bag.contains("three"));
+		assertTrue("missing element", this.bag.contains("four"));
+		assertTrue("missing element", this.bag.contains(new String("four")));
+		assertTrue("missing element", this.bag.contains("fo" + "ur"));
+		assertFalse("element found", this.bag.contains("five"));
 	}
 
 	public void testContainsAll() {
@@ -172,54 +152,53 @@
 		c.add(new String("two"));
 		c.add(new String("three"));
 		c.add(new String("four"));
-		assertTrue(this.bag.containsAll(c));
+		assertTrue("missing element(s)", this.bag.containsAll(c));
 	}
 
 	public void testCount() {
-		assertEquals(0, this.bag.count("zero"));
-		assertEquals(1, this.bag.count("one"));
-		assertEquals(2, this.bag.count("two"));
-		assertEquals(3, this.bag.count("three"));
-		assertEquals(4, this.bag.count("four"));
-		assertEquals(0, this.bag.count("five"));
+		assertEquals("bad count", 0, this.bag.count("zero"));
+		assertEquals("bad count", 1, this.bag.count("one"));
+		assertEquals("bad count", 2, this.bag.count("two"));
+		assertEquals("bad count", 3, this.bag.count("three"));
+		assertEquals("bad count", 4, this.bag.count("four"));
+		assertEquals("bad count", 0, this.bag.count("five"));
 	}
 
 	public void testEquals() {
 		Bag<String> bag2 = this.buildBag();
-		assertEquals(this.bag, bag2);
+		assertEquals("bags are not equal", this.bag, bag2);
 		bag2.add("five");
-		assertFalse(this.bag.equals(bag2));
+		assertFalse("bags are equal", this.bag.equals(bag2));
 		Collection<String> c = new ArrayList<String>(this.bag);
-		assertFalse(this.bag.equals(c));
+		assertFalse("bags are not equal to collections", this.bag.equals(c));
 	}
 
 	public void testHashCode() {
 		Bag<String> bag2 = this.buildBag();
-		assertEquals(this.bag.hashCode(), bag2.hashCode());
+		assertEquals("bad hash code", this.bag.hashCode(), bag2.hashCode());
 	}
 
 	public void testIsEmpty() {
-		assertFalse(this.bag.isEmpty());
+		assertFalse("bag is empty", this.bag.isEmpty());
 		this.bag.clear();
-		assertTrue(this.bag.isEmpty());
+		assertTrue("bag is not empty", this.bag.isEmpty());
 		this.bag.add("foo");
-		assertFalse(this.bag.isEmpty());
+		assertFalse("bag is empty", this.bag.isEmpty());
 	}
 
 	public void testEmptyIterator() {
 		this.bag.clear();
 		Iterator<String> iterator = this.bag.iterator();
-		assertFalse(iterator.hasNext());
+		assertFalse("iterator is not empty", iterator.hasNext());
 
 		boolean exCaught = false;
 		Object element = null;
 		try {
 			element = iterator.next();
-			fail(element.toString());
 		} catch (NoSuchElementException ex) {
 			exCaught = true;
 		}
-		assertTrue(exCaught);
+		assertTrue("NoSuchElementException not thrown: " + element, exCaught);
 
 		exCaught = false;
 		try {
@@ -227,32 +206,31 @@
 		} catch (IllegalStateException ex) {
 			exCaught = true;
 		}
-		assertTrue(exCaught);
+		assertTrue("IllegalStateException not thrown", exCaught);
 	}
 
 	public void testIterator() {
 		int i = 0;
 		Iterator<String> iterator = this.bag.iterator();
-		assertTrue(iterator.hasNext());
+		assertTrue("iterator is empty", iterator.hasNext());
 		while (iterator.hasNext()) {
 			iterator.next();
 			i++;
 		}
-		assertEquals(11, i);
-		assertFalse(iterator.hasNext());
+		assertEquals("invalid hasNext() loop", 11, i);
+		assertFalse("iterator should be empty now", iterator.hasNext());
 
 		boolean exCaught = false;
 		Object element = null;
 		try {
 			element = iterator.next();
-			fail(element.toString());
 		} catch (NoSuchElementException ex) {
 			exCaught = true;
 		}
-		assertTrue(exCaught);
+		assertTrue("NoSuchElementException not thrown: " + element, exCaught);
 
 		iterator.remove();
-		assertEquals(10, this.bag.size());
+		assertEquals("iterator did not remove element", 10, this.bag.size());
 
 		exCaught = false;
 		try {
@@ -260,7 +238,7 @@
 		} catch (IllegalStateException ex) {
 			exCaught = true;
 		}
-		assertTrue(exCaught);
+		assertTrue("IllegalStateException not thrown", exCaught);
 
 		// start over
 		iterator = this.bag.iterator();
@@ -271,29 +249,28 @@
 		} catch (ConcurrentModificationException ex) {
 			exCaught = true;
 		}
-		assertTrue(exCaught);
+		assertTrue("ConcurrentModificationException not thrown", exCaught);
 	}
 
 	public void testUniqueIterator() {
 		int i = 0;
 		Iterator<String> iterator = this.bag.uniqueIterator();
-		assertTrue(iterator.hasNext());
+		assertTrue("iterator is empty", iterator.hasNext());
 		while (iterator.hasNext()) {
 			iterator.next();
 			i++;
 		}
-		assertEquals(5, i);
-		assertFalse(iterator.hasNext());
+		assertEquals("invalid hasNext() loop", 5, i);
+		assertFalse("iterator should be empty now", iterator.hasNext());
 
 		boolean exCaught = false;
 		Object element = null;
 		try {
 			element = iterator.next();
-			fail(element.toString());
 		} catch (NoSuchElementException ex) {
 			exCaught = true;
 		}
-		assertTrue(exCaught);
+		assertTrue("NoSuchElementException not thrown: " + element, exCaught);
 
 		// start over
 		iterator = this.bag.uniqueIterator();
@@ -302,7 +279,7 @@
 			next = iterator.next();
 		}
 		iterator.remove();
-		assertEquals(7, this.bag.size());
+		assertEquals("iterator did not remove all copies of element", 7, this.bag.size());
 
 		exCaught = false;
 		try {
@@ -310,7 +287,7 @@
 		} catch (IllegalStateException ex) {
 			exCaught = true;
 		}
-		assertTrue(exCaught);
+		assertTrue("IllegalStateException not thrown", exCaught);
 
 		// start over
 		iterator = this.bag.uniqueIterator();
@@ -321,111 +298,89 @@
 		} catch (ConcurrentModificationException ex) {
 			exCaught = true;
 		}
-		assertTrue(exCaught);
+		assertTrue("ConcurrentModificationException not thrown", exCaught);
 	}
 
-//TODO - poor load factor is seen in the Eclipse build environment for some reason
-//	public void testHashingDistribution() throws Exception {
-//		Bag<String> bigBag = new HashBag<String>();
-//		for (int i = 0; i < 10000; i++) {
-//			bigBag.add("object" + i);
-//		}
-//
-//		java.lang.reflect.Field field = bigBag.getClass().getDeclaredField("table");
-//		field.setAccessible(true);
-//		Object[] table = (Object[]) field.get(bigBag);
-//		int bucketCount = table.length;
-//		int filledBucketCount = 0;
-//		for (Object o : table) {
-//			if (o != null) {
-//				filledBucketCount++;
-//			}
-//		}
-//		float loadFactor = ((float) filledBucketCount) / ((float) bucketCount);
-//		assertTrue("WARNING - poor load factor: " + loadFactor, loadFactor > 0.20);
-//		assertTrue("WARNING - poor load factor: " + loadFactor, loadFactor < 0.75);
-//	}
+	public void testHashingDistribution() throws Exception {
+		Bag<String> bigBag = new HashBag<String>();
+		for (int i = 0; i < 10000; i++) {
+			bigBag.add("object" + i);
+		}
+
+		java.lang.reflect.Field field = bigBag.getClass().getDeclaredField("table");
+		field.setAccessible(true);
+		Object[] table = (Object[]) field.get(bigBag);
+		int bucketCount = table.length;
+		int filledBucketCount = 0;
+		for (Object o : table) {
+			if (o != null) {
+				filledBucketCount++;
+			}
+		}
+		float loadFactor = ((float) filledBucketCount) / ((float) bucketCount);
+		assertTrue("WARNING - poor load factor: " + loadFactor, loadFactor > 0.20);
+		assertTrue("WARNING - poor load factor: " + loadFactor, loadFactor < 0.75);
+	}
 
 	public void testRemove() {
-		assertTrue(this.bag.remove("one"));
-		assertFalse(this.bag.contains("one"));
-		assertFalse(this.bag.remove("one"));
+		assertTrue("incorrect return value", this.bag.remove("one"));
+		assertFalse("element still present", this.bag.contains("one"));
+		assertFalse("incorrect return value", this.bag.remove("one"));
 
-		assertTrue(this.bag.remove("two"));
-		assertTrue(this.bag.remove("two"));
-		assertFalse(this.bag.contains("two"));
-		assertFalse(this.bag.remove("two"));
-	}
-
-	public void testRemoveCount() {
-		assertFalse(this.bag.remove("one", 0));
-		assertTrue(this.bag.contains("one"));
-
-		assertTrue(this.bag.remove("one", 1));
-		assertFalse(this.bag.contains("one"));
-		assertFalse(this.bag.remove("one"));
-
-		assertFalse(this.bag.remove("two", -3));
-		assertTrue(this.bag.remove("two", 1));
-		assertTrue(this.bag.contains("two"));
-
-		assertTrue(this.bag.remove("two", 1));
-		assertFalse(this.bag.contains("two"));
-		assertFalse(this.bag.remove("two"));
-
-		assertTrue(this.bag.remove("three", 3));
-		assertFalse(this.bag.contains("three"));
-		assertFalse(this.bag.remove("three"));
+		assertTrue("incorrect return value", this.bag.remove("two"));
+		assertTrue("incorrect return value", this.bag.remove("two"));
+		assertFalse("element still present", this.bag.contains("one"));
+		assertFalse("incorrect return value", this.bag.remove("one"));
 	}
 
 	public void testRemoveAll() {
 		Collection<String> c = new ArrayList<String>();
 		c.add("one");
 		c.add("three");
-		assertTrue(this.bag.removeAll(c));
-		assertFalse(this.bag.contains("one"));
-		assertFalse(this.bag.contains("three"));
-		assertFalse(this.bag.remove("one"));
-		assertFalse(this.bag.remove("three"));
-		assertFalse(this.bag.removeAll(c));
+		assertTrue("incorrect return value", this.bag.removeAll(c));
+		assertFalse("element still present", this.bag.contains("one"));
+		assertFalse("element still present", this.bag.contains("three"));
+		assertFalse("incorrect return value", this.bag.remove("one"));
+		assertFalse("incorrect return value", this.bag.remove("three"));
+		assertFalse("incorrect return value", this.bag.removeAll(c));
 	}
 
 	public void testRetainAll() {
 		Collection<String> c = new ArrayList<String>();
 		c.add("one");
 		c.add("three");
-		assertTrue(this.bag.retainAll(c));
-		assertTrue(this.bag.contains("one"));
-		assertTrue(this.bag.contains("three"));
-		assertFalse(this.bag.contains("two"));
-		assertFalse(this.bag.contains("four"));
-		assertFalse(this.bag.remove("two"));
-		assertFalse(this.bag.remove("four"));
-		assertFalse(this.bag.retainAll(c));
+		assertTrue("incorrect return value", this.bag.retainAll(c));
+		assertTrue("element removed", this.bag.contains("one"));
+		assertTrue("element removed", this.bag.contains("three"));
+		assertFalse("element still present", this.bag.contains("two"));
+		assertFalse("element still present", this.bag.contains("four"));
+		assertFalse("incorrect return value", this.bag.remove("two"));
+		assertFalse("incorrect return value", this.bag.remove("four"));
+		assertFalse("incorrect return value", this.bag.retainAll(c));
 	}
 
 	public void testSize() {
-		assertTrue(this.bag.size() == 11);
+		assertTrue("incorrect size", this.bag.size() == 11);
 		this.bag.add("five");
 		this.bag.add("five");
 		this.bag.add("five");
 		this.bag.add("five");
 		this.bag.add("five");
-		assertEquals(16, this.bag.size());
+		assertEquals("incorrect size", 16, this.bag.size());
 	}
 
 	public void testSerialization() throws Exception {
 		Bag<String> bag2 = TestTools.serialize(this.bag);
 
 		assertTrue("same object?", this.bag != bag2);
-		assertEquals(11, bag2.size());
-		assertEquals(this.bag, bag2);
+		assertEquals("incorrect size", 11, bag2.size());
+		assertEquals("unequal bag", this.bag, bag2);
 		// look for similar elements
-		assertTrue(bag2.contains(null));
-		assertTrue(bag2.contains("one"));
-		assertTrue(bag2.contains("two"));
-		assertTrue(bag2.contains("three"));
-		assertTrue(bag2.contains("four"));
+		assertTrue("missing element", bag2.contains(null));
+		assertTrue("missing element", bag2.contains("one"));
+		assertTrue("missing element", bag2.contains("two"));
+		assertTrue("missing element", bag2.contains("three"));
+		assertTrue("missing element", bag2.contains("four"));
 
 		int nullCount = 0, oneCount = 0, twoCount = 0, threeCount = 0, fourCount = 0;
 		for (String s : bag2) {
@@ -441,53 +396,53 @@
 				fourCount++;
 			}
 		}
-		assertEquals(1, nullCount);
-		assertEquals(1, oneCount);
-		assertEquals(2, twoCount);
-		assertEquals(3, threeCount);
-		assertEquals(4, fourCount);
+		assertEquals("bad element count", 1, nullCount);
+		assertEquals("bad element count", 1, oneCount);
+		assertEquals("bad element count", 2, twoCount);
+		assertEquals("bad element count", 3, threeCount);
+		assertEquals("bad element count", 4, fourCount);
 	}
 
 	public void testToArray() {
 		Object[] a = this.bag.toArray();
-		assertEquals(11, a.length);
-		assertTrue(CollectionTools.contains(a, null));
-		assertTrue(CollectionTools.contains(a, "one"));
-		assertTrue(CollectionTools.contains(a, "two"));
-		assertTrue(CollectionTools.contains(a, "three"));
-		assertTrue(CollectionTools.contains(a, "four"));
+		assertEquals("incorrect length", 11, a.length);
+		assertTrue("missing element", CollectionTools.contains(a, null));
+		assertTrue("missing element", CollectionTools.contains(a, "one"));
+		assertTrue("missing element", CollectionTools.contains(a, "two"));
+		assertTrue("missing element", CollectionTools.contains(a, "three"));
+		assertTrue("missing element", CollectionTools.contains(a, "four"));
 	}
 
 	public void testToArrayObjectArray() {
 		String[] a = new String[12];
 		a[11] = "not null";
 		String[] b = this.bag.toArray(a);
-		assertEquals(a, b);
-		assertEquals(12, a.length);
-		assertTrue(CollectionTools.contains(a, null));
-		assertTrue(CollectionTools.contains(a, "one"));
-		assertTrue(CollectionTools.contains(a, "two"));
-		assertTrue(CollectionTools.contains(a, "three"));
-		assertTrue(CollectionTools.contains(a, "four"));
-		assertTrue(a[11] == null);
+		assertEquals("different array", a, b);
+		assertEquals("incorrect length", 12, a.length);
+		assertTrue("missing element", CollectionTools.contains(a, null));
+		assertTrue("missing element", CollectionTools.contains(a, "one"));
+		assertTrue("missing element", CollectionTools.contains(a, "two"));
+		assertTrue("missing element", CollectionTools.contains(a, "three"));
+		assertTrue("missing element", CollectionTools.contains(a, "four"));
+		assertTrue("missing null element", a[11] == null);
 	}
 
 	public void testToString() {
 		String s = this.bag.toString();
-		assertTrue(s.startsWith("["));
-		assertTrue(s.endsWith("]"));
+		assertTrue("invalid string prefix", s.startsWith("["));
+		assertTrue("invalid string suffix", s.endsWith("]"));
 		int commaCount = 0;
 		for (int i = 0; i < s.length(); i++) {
 			if (s.charAt(i) == ',') {
 				commaCount++;
 			}
 		}
-		assertEquals(10, commaCount);
-		assertTrue(s.indexOf("one") != -1);
-		assertTrue(s.indexOf("two") != -1);
-		assertTrue(s.indexOf("three") != -1);
-		assertTrue(s.indexOf("four") != -1);
-		assertTrue(s.indexOf("null") != -1);
+		assertEquals("invalid number of commas", 10, commaCount);
+		assertTrue("missing element toString()", s.indexOf("one") != -1);
+		assertTrue("missing element toString()", s.indexOf("two") != -1);
+		assertTrue("missing element toString()", s.indexOf("three") != -1);
+		assertTrue("missing element toString()", s.indexOf("four") != -1);
+		assertTrue("missing element toString()", s.indexOf("null") != -1);
 	}
 
 }
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/IdentityHashBagTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/IdentityHashBagTests.java
deleted file mode 100644
index a6162f6..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/IdentityHashBagTests.java
+++ /dev/null
@@ -1,509 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.ConcurrentModificationException;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-import org.eclipse.jpt.utility.internal.CollectionTools;
-import org.eclipse.jpt.utility.internal.IdentityHashBag;
-
-import junit.framework.TestCase;
-
-public class IdentityHashBagTests extends TestCase {
-	private IdentityHashBag<String> bag;
-	private String one = "one";
-	private String two = "two";
-	private String three = "three";
-	private String four = "four";
-	private String foo = "foo";
-	private String bar = "bar";
-
-	public IdentityHashBagTests(String name) {
-		super(name);
-	}
-
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-		this.bag = this.buildBag();
-	}
-	
-	protected IdentityHashBag<String> buildBag() {
-		IdentityHashBag<String> result = new IdentityHashBag<String>();
-		result.add(null);
-		result.add(this.one);
-		result.add(this.two);
-		result.add(this.two);
-		result.add(this.three);
-		result.add(this.three);
-		result.add(this.three);
-		result.add(this.four);
-		result.add(this.four);
-		result.add(this.four);
-		result.add(this.four);
-		return result;
-	}
-	
-	@Override
-	protected void tearDown() throws Exception {
-		TestTools.clear(this);
-		super.tearDown();
-	}
-
-	private Collection<String> buildCollection() {
-		Collection<String> c = new ArrayList<String>();
-		c.add(this.foo);
-		c.add(this.foo);
-		c.add(this.bar);
-		c.add(this.bar);
-		c.add(this.bar);
-		return c;
-	}
-	
-	public void testCtorCollection() {
-		Collection<String> c = this.buildCollection();
-		IdentityHashBag<String> localBag = new IdentityHashBag<String>(c);
-		for (String s : c) {
-			assertTrue(localBag.contains(s));
-		}
-	}
-	
-	public void testCtorIntFloat() {
-		boolean exCaught;
-	
-		exCaught = false;
-		try {
-			this.bag = new IdentityHashBag<String>(-20, 0.66f);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue("IllegalArgumentException not thrown", exCaught);
-	
-		exCaught = false;
-		try {
-			this.bag = new IdentityHashBag<String>(20, -0.66f);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue("IllegalArgumentException not thrown", exCaught);
-	}
-	
-	public void testAdd() {
-		// the other adds took place in setUp
-		String five = "five";
-		assertTrue(this.bag.add(five));
-	
-		assertTrue(this.bag.contains(this.one));
-		assertTrue(this.bag.contains(this.two));
-		assertTrue(this.bag.contains(this.three));
-		assertTrue(this.bag.contains(this.four));
-		assertTrue(this.bag.contains(five));
-	}
-	
-	public void testAddCount() {
-		String minus3 = "minus3";
-		String zero = "zero";
-		String five = "five";
-		// the other adds took place in setUp
-		this.bag.add(minus3, -3);
-		this.bag.add(zero, 0);
-		this.bag.add(five, 5);
-
-		assertFalse(this.bag.contains(minus3));
-		assertFalse(this.bag.contains(zero));
-		assertEquals(1, this.bag.count(this.one));
-		assertEquals(2, this.bag.count(this.two));
-		assertEquals(3, this.bag.count(this.three));
-		assertEquals(4, this.bag.count(this.four));
-		assertEquals(5, this.bag.count(five));
-
-		this.bag.add(this.three, 2);
-		assertEquals(5, this.bag.count(this.three));
-	}
-
-	public void testAddAll() {
-		Collection<String> c = this.buildCollection();
-		assertTrue(this.bag.addAll(c));
-		for (String s : c) {
-			assertTrue(this.bag.contains(s));
-		}
-	}
-	
-	public void testClear() {
-		assertTrue(this.bag.contains(this.one));
-		assertTrue(this.bag.contains(this.two));
-		assertTrue(this.bag.contains(this.three));
-		assertTrue(this.bag.contains(this.four));
-		assertTrue(this.bag.contains(null));
-		assertEquals(11, this.bag.size());
-		this.bag.clear();
-		assertFalse(this.bag.contains(this.one));
-		assertFalse(this.bag.contains(this.two));
-		assertFalse(this.bag.contains(this.three));
-		assertFalse(this.bag.contains(this.four));
-		assertFalse(this.bag.contains(null));
-		assertEquals(0, this.bag.size());
-	}
-	
-	public void testClone() {
-		IdentityHashBag<String> bag2 = this.bag.clone();
-		assertTrue("bad clone", this.bag != bag2);
-		assertEquals("bad clone", this.bag, bag2);
-		assertTrue("bad clone", this.bag.hashCode() == bag2.hashCode());
-	}
-	
-	public void testContains() {
-		assertTrue(this.bag.contains(null));
-		assertTrue(this.bag.contains(this.one));
-		assertTrue(this.bag.contains(this.two));
-		assertTrue(this.bag.contains(this.three));
-		assertTrue(this.bag.contains(this.four));
-
-		assertFalse(this.bag.contains(new String("four")));
-		assertFalse(this.bag.contains("five"));
-	}
-	
-	public void testContainsAll() {
-		Collection<String> c = new ArrayList<String>();
-		c.add(null);
-		c.add(this.one);
-		c.add(this.two);
-		c.add(this.three);
-		c.add(this.four);
-		assertTrue(this.bag.containsAll(c));
-		c.add(new String(this.four));
-		assertFalse(this.bag.containsAll(c));
-	}
-	
-	public void testCount() {
-		assertEquals(0, this.bag.count("zero"));
-		assertEquals(1, this.bag.count("one"));
-		assertEquals(2, this.bag.count("two"));
-		assertEquals(3, this.bag.count("three"));
-		assertEquals(4, this.bag.count("four"));
-		assertEquals(0, this.bag.count("five"));
-	}
-	
-	public void testEquals() {
-		IdentityHashBag<String> bag2 = this.buildBag();
-		assertEquals(this.bag, bag2);
-		bag2.add("five");
-		assertFalse(this.bag.equals(bag2));
-		Collection<String> c = new ArrayList<String>(this.bag);
-		assertFalse(this.bag.equals(c));
-	}
-	
-	public void testHashCode() {
-		IdentityHashBag<String> bag2 = this.buildBag();
-		assertEquals(this.bag.hashCode(), bag2.hashCode());
-	}
-	
-	public void testIsEmpty() {
-		assertFalse(this.bag.isEmpty());
-		this.bag.clear();
-		assertTrue(this.bag.isEmpty());
-		this.bag.add("foo");
-		assertFalse(this.bag.isEmpty());
-	}
-	
-	public void testEmptyIterator() {
-		this.bag.clear();
-		Iterator<String> iterator = this.bag.iterator();
-		assertFalse(iterator.hasNext());
-	
-		boolean exCaught = false;
-		Object element = null;
-		try {
-			element = iterator.next();
-		} catch (NoSuchElementException ex) {
-			exCaught = true;
-		}
-		assertTrue("NoSuchElementException not thrown: " + element, exCaught);
-	
-		exCaught = false;
-		try {
-			iterator.remove();
-		} catch (IllegalStateException ex) {
-			exCaught = true;
-		}
-		assertTrue("IllegalStateException not thrown", exCaught);
-	}
-	
-	public void testIterator() {
-		int i = 0;
-		Iterator<String> iterator = this.bag.iterator();
-		assertTrue(iterator.hasNext());
-		while (iterator.hasNext()) {
-			iterator.next();
-			i++;
-		}
-		assertEquals(11, i);
-		assertFalse(iterator.hasNext());
-	
-		boolean exCaught = false;
-		Object element = null;
-		try {
-			element = iterator.next();
-		} catch (NoSuchElementException ex) {
-			exCaught = true;
-		}
-		assertTrue("NoSuchElementException not thrown: " + element, exCaught);
-	
-		iterator.remove();
-		assertEquals(10, this.bag.size());
-	
-		exCaught = false;
-		try {
-			iterator.remove();
-		} catch (IllegalStateException ex) {
-			exCaught = true;
-		}
-		assertTrue("IllegalStateException not thrown", exCaught);
-	
-		// start over
-		iterator = this.bag.iterator();
-		this.bag.add("five");
-		exCaught = false;
-		try {
-			iterator.next();
-		} catch (ConcurrentModificationException ex) {
-			exCaught = true;
-		}
-		assertTrue("ConcurrentModificationException not thrown", exCaught);
-	}
-	
-	public void testUniqueIterator() {
-		int i = 0;
-		Iterator<String> iterator = this.bag.uniqueIterator();
-		assertTrue(iterator.hasNext());
-		while (iterator.hasNext()) {
-			iterator.next();
-			i++;
-		}
-		assertEquals(5, i);
-		assertFalse(iterator.hasNext());
-
-		boolean exCaught = false;
-		Object element = null;
-		try {
-			element = iterator.next();
-			fail(element.toString());
-		} catch (NoSuchElementException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		// start over
-		iterator = this.bag.uniqueIterator();
-		Object next = null;
-		while (iterator.hasNext() && !this.four.equals(next)) {
-			next = iterator.next();
-		}
-		iterator.remove();
-		assertEquals(7, this.bag.size());
-
-		exCaught = false;
-		try {
-			iterator.remove();
-		} catch (IllegalStateException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		// start over
-		iterator = this.bag.uniqueIterator();
-		String five = "five";
-		this.bag.add(five);
-		exCaught = false;
-		try {
-			iterator.next();
-		} catch (ConcurrentModificationException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testHashingDistribution() throws Exception {
-		IdentityHashBag<String> bigBag = new IdentityHashBag<String>();
-		for (int i = 0; i < 10000; i++) {
-			bigBag.add("object" + i);
-		}
-	
-		java.lang.reflect.Field field = bigBag.getClass().getDeclaredField("table");
-		field.setAccessible(true);
-		Object[] table = (Object[]) field.get(bigBag);
-		int bucketCount = table.length;
-		int filledBucketCount = 0;
-		for (int i = 0; i < bucketCount; i++) {
-			if (table[i] != null) {
-				filledBucketCount++;
-			}
-		}
-		float loadFactor = ((float) filledBucketCount)/((float) bucketCount);
-		// System.out.println("load factor: " + loadFactor + " (" + filledBucketCount + "/" + bucketCount + ")");
-		assertTrue("WARNING - poor load factor: " + loadFactor, loadFactor > 0.20);
-		assertTrue("WARNING - poor load factor: " + loadFactor, loadFactor < 0.75);
-	}
-	
-	public void testRemove() {
-		assertTrue(this.bag.remove(this.one));
-		assertFalse(this.bag.contains(this.one));
-		assertFalse(this.bag.remove(this.one));
-	
-		assertTrue(this.bag.remove(this.two));
-		assertTrue(this.bag.remove(this.two));
-		assertFalse(this.bag.contains(this.two));
-		assertFalse(this.bag.remove(this.two));
-
-		assertFalse(this.bag.remove(new String(this.three)));
-	}
-	
-	public void testRemoveCount() {
-		assertFalse(this.bag.remove(this.one, 0));
-		assertTrue(this.bag.contains(this.one));
-
-		assertTrue(this.bag.remove(this.one, 1));
-		assertFalse(this.bag.contains(this.one));
-		assertFalse(this.bag.remove(this.one));
-
-		assertFalse(this.bag.remove(this.two, -3));
-		assertTrue(this.bag.remove(this.two, 1));
-		assertTrue(this.bag.contains(this.two));
-
-		assertTrue(this.bag.remove(this.two, 1));
-		assertFalse(this.bag.contains(this.two));
-		assertFalse(this.bag.remove(this.two));
-
-		assertTrue(this.bag.remove(this.three, 3));
-		assertFalse(this.bag.contains(this.three));
-		assertFalse(this.bag.remove(this.three));
-	}
-
-	public void testRemoveAll() {
-		Collection<String> c = new ArrayList<String>();
-		c.add(this.one);
-		c.add(new String(this.two));
-		c.add(this.three);
-		assertTrue(this.bag.removeAll(c));
-		assertFalse(this.bag.contains(this.one));
-		assertTrue(this.bag.contains(this.two));
-		assertFalse(this.bag.contains(this.three));
-		assertFalse(this.bag.remove(this.one));
-		assertTrue(this.bag.remove(this.two));
-		assertFalse(this.bag.remove(this.three));
-		assertFalse(this.bag.removeAll(c));
-	}
-	
-	public void testRetainAll() {
-		Collection<String> c = new ArrayList<String>();
-		c.add(this.one);
-		c.add(new String(this.two));
-		c.add(this.three);
-		assertTrue(this.bag.retainAll(c));
-		assertTrue(this.bag.contains(this.one));
-		assertFalse(this.bag.contains(this.two));
-		assertTrue(this.bag.contains(this.three));
-		assertFalse(this.bag.contains(this.four));
-		assertFalse(this.bag.remove(this.two));
-		assertFalse(this.bag.remove(this.four));
-		assertFalse(this.bag.retainAll(c));
-	}
-	
-	public void testSize() {
-		assertTrue(this.bag.size() == 11);
-		String five = "five";
-		this.bag.add(five);
-		this.bag.add(five);
-		this.bag.add(five);
-		this.bag.add(five);
-		this.bag.add(new String(five));
-		assertEquals(16, this.bag.size());
-	}
-	
-	public void testSerialization() throws Exception {
-		IdentityHashBag<String> bag2 = TestTools.serialize(this.bag);
-	
-		assertTrue("same object?", this.bag != bag2);
-		assertEquals(11, bag2.size());
-		assertEquals(CollectionTools.bag(this.bag.iterator()), CollectionTools.bag(bag2.iterator()));
-		// look for similar elements
-		assertTrue(CollectionTools.bag(bag2.iterator()).contains(null));
-		assertTrue(CollectionTools.bag(bag2.iterator()).contains("one"));
-		assertTrue(CollectionTools.bag(bag2.iterator()).contains("two"));
-		assertTrue(CollectionTools.bag(bag2.iterator()).contains("three"));
-		assertTrue(CollectionTools.bag(bag2.iterator()).contains("four"));
-	
-		int nullCount = 0, oneCount = 0, twoCount = 0, threeCount = 0, fourCount = 0;
-		for (String next : bag2) {
-			if (next == null)
-				nullCount++;
-			else if (next.equals("one"))
-				oneCount++;
-			else if (next.equals("two"))
-				twoCount++;
-			else if (next.equals("three"))
-				threeCount++;
-			else if (next.equals("four"))
-				fourCount++;
-		}
-		assertEquals(1, nullCount);
-		assertEquals(1, oneCount);
-		assertEquals(2, twoCount);
-		assertEquals(3, threeCount);
-		assertEquals(4, fourCount);
-	}
-	
-	public void testToArray() {
-		Object[] a = this.bag.toArray();
-		assertEquals(11, a.length);
-		assertTrue(CollectionTools.contains(a, null));
-		assertTrue(CollectionTools.contains(a, this.one));
-		assertTrue(CollectionTools.contains(a, this.two));
-		assertTrue(CollectionTools.contains(a, this.three));
-		assertTrue(CollectionTools.contains(a, this.four));
-	}
-	
-	public void testToArrayObjectArray() {
-		String[] a = new String[12];
-		a[11] = "not null";
-		String[] b = this.bag.toArray(a);
-		assertEquals(a, b);
-		assertEquals(12, a.length);
-		assertTrue(CollectionTools.contains(a, null));
-		assertTrue(CollectionTools.contains(a, this.one));
-		assertTrue(CollectionTools.contains(a, this.two));
-		assertTrue(CollectionTools.contains(a, this.three));
-		assertTrue(CollectionTools.contains(a, this.four));
-		assertTrue(a[11] == null);
-	}
-	
-	public void testToString() {
-		String s = this.bag.toString();
-		assertTrue(s.startsWith("["));
-		assertTrue(s.endsWith("]"));
-		int commaCount = 0;
-		for (int i = 0; i < s.length(); i++) {
-			if (s.charAt(i) == ',') {
-				commaCount++;
-			}
-		}
-		assertEquals("invalid number of commas", 10, commaCount);
-		assertTrue(s.indexOf("one") != -1);
-		assertTrue(s.indexOf("two") != -1);
-		assertTrue(s.indexOf("three") != -1);
-		assertTrue(s.indexOf("four") != -1);
-		assertTrue(s.indexOf("null") != -1);
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/JptUtilityTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/JptUtilityTests.java
index 7d7a7a0..82143f3 100644
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/JptUtilityTests.java
+++ b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/JptUtilityTests.java
@@ -9,13 +9,10 @@
  ******************************************************************************/
 package org.eclipse.jpt.utility.tests.internal;
 
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.tests.internal.iterators.JptUtilityIteratorsTests;
-import org.eclipse.jpt.utility.tests.internal.model.JptUtilityModelTests;
-import org.eclipse.jpt.utility.tests.internal.node.JptUtilityNodeTests;
-
 import junit.framework.Test;
 import junit.framework.TestSuite;
+import org.eclipse.jpt.utility.internal.ClassTools;
+import org.eclipse.jpt.utility.tests.internal.iterators.JptUtilityIteratorsTests;
 
 /**
  * decentralize test creation code
@@ -26,8 +23,6 @@
 		TestSuite suite = new TestSuite(ClassTools.packageNameFor(JptUtilityTests.class));
 
 		suite.addTest(JptUtilityIteratorsTests.suite());
-		suite.addTest(JptUtilityModelTests.suite());
-		suite.addTest(JptUtilityNodeTests.suite());
 
 		suite.addTestSuite(BitToolsTests.class);
 		suite.addTestSuite(ClasspathTests.class);
@@ -35,17 +30,12 @@
 		suite.addTestSuite(CollectionToolsTests.class);
 		suite.addTestSuite(FileToolsTests.class);
 		suite.addTestSuite(HashBagTests.class);
-		suite.addTestSuite(IdentityHashBagTests.class);
 		suite.addTestSuite(IndentingPrintWriterTests.class);
 		suite.addTestSuite(JavaTypeTests.class);
 		suite.addTestSuite(JDBCTypeTests.class);
 		suite.addTestSuite(NameToolsTests.class);
 		suite.addTestSuite(ReverseComparatorTests.class);
-		suite.addTestSuite(SimpleStackTests.class);
 		suite.addTestSuite(StringToolsTests.class);
-		suite.addTestSuite(SynchronizedBooleanTests.class);
-		suite.addTestSuite(SynchronizedObjectTests.class);
-		suite.addTestSuite(SynchronizedStackTests.class);
 		suite.addTestSuite(XMLStringEncoderTests.class);
 
 		return suite;
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/SimpleStackTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/SimpleStackTests.java
deleted file mode 100644
index f229797..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/SimpleStackTests.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal;
-
-import java.util.EmptyStackException;
-
-import org.eclipse.jpt.utility.internal.SimpleStack;
-import org.eclipse.jpt.utility.internal.Stack;
-
-import junit.framework.TestCase;
-
-public class SimpleStackTests extends TestCase {
-
-	public SimpleStackTests(String name) {
-		super(name);
-	}
-
-	public void testIsEmpty() {
-		Stack<String> stack = new SimpleStack<String>();
-		assertTrue(stack.isEmpty());
-		stack.push("first");
-		assertFalse(stack.isEmpty());
-		stack.push("second");
-		assertFalse(stack.isEmpty());
-		stack.pop();
-		assertFalse(stack.isEmpty());
-		stack.pop();
-		assertTrue(stack.isEmpty());
-	}
-
-	public void testPushAndPop() {
-		Stack<String> stack = new SimpleStack<String>();
-		String first = "first";
-		String second = "second";
-
-		stack.push(first);
-		stack.push(second);
-		assertEquals(second, stack.pop());
-		assertEquals(first, stack.pop());
-	}
-
-	public void testPushAndPeek() {
-		Stack<String> stack = new SimpleStack<String>();
-		String first = "first";
-		String second = "second";
-
-		stack.push(first);
-		stack.push(second);
-		assertEquals(second, stack.peek());
-		assertEquals(second, stack.peek());
-		assertEquals(second, stack.pop());
-		assertEquals(first, stack.peek());
-		assertEquals(first, stack.peek());
-		assertEquals(first, stack.pop());
-	}
-
-	public void testEmptyStackExceptionPeek() {
-		Stack<String> stack = new SimpleStack<String>();
-		String first = "first";
-		String second = "second";
-
-		stack.push(first);
-		stack.push(second);
-		assertEquals(second, stack.peek());
-		assertEquals(second, stack.pop());
-		assertEquals(first, stack.peek());
-		assertEquals(first, stack.pop());
-
-		boolean exCaught = false;
-		try {
-			stack.peek();
-		} catch (EmptyStackException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testEmptyStackExceptionPop() {
-		Stack<String> stack = new SimpleStack<String>();
-		String first = "first";
-		String second = "second";
-
-		stack.push(first);
-		stack.push(second);
-		assertEquals(second, stack.peek());
-		assertEquals(second, stack.pop());
-		assertEquals(first, stack.peek());
-		assertEquals(first, stack.pop());
-
-		boolean exCaught = false;
-		try {
-			stack.pop();
-		} catch (EmptyStackException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testClone() {
-		SimpleStack<String> stack = new SimpleStack<String>();
-		stack.push("first");
-		stack.push("second");
-		stack.push("third");
-
-		this.verifyClone(stack, stack.clone());
-	}
-
-	public void testSerialization() throws Exception {
-		SimpleStack<String> stack = new SimpleStack<String>();
-		stack.push("first");
-		stack.push("second");
-		stack.push("third");
-
-		this.verifyClone(stack, TestTools.serialize(stack));
-	}
-
-	private void verifyClone(Stack<String> original, Stack<String> clone) {
-		assertNotSame(original, clone);
-		assertEquals(original.peek(), clone.peek());
-		assertEquals(original.pop(), clone.pop());
-		assertEquals(original.peek(), clone.peek());
-		assertEquals(original.pop(), clone.pop());
-		assertEquals(original.isEmpty(), clone.isEmpty());
-		assertEquals(original.peek(), clone.peek());
-		assertEquals(original.pop(), clone.pop());
-		assertTrue(original.isEmpty());
-		assertEquals(original.isEmpty(), clone.isEmpty());
-
-		original.push("fourth");
-		assertFalse(original.isEmpty());
-		// clone should still be empty
-		assertTrue(clone.isEmpty());
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/SynchronizedBooleanTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/SynchronizedBooleanTests.java
deleted file mode 100644
index 4b42839..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/SynchronizedBooleanTests.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal;
-
-import org.eclipse.jpt.utility.internal.SynchronizedBoolean;
-
-import junit.framework.TestCase;
-
-public class SynchronizedBooleanTests extends TestCase {
-	private volatile SynchronizedBoolean sb;
-	private volatile boolean exCaught;
-	private volatile boolean timeoutOccurred;
-	private volatile long startTime;
-	private volatile long endTime;
-
-
-	public SynchronizedBooleanTests(String name) {
-		super(name);
-	}
-
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-		this.sb = new SynchronizedBoolean();
-		this.exCaught = false;
-		this.timeoutOccurred = false;
-		this.startTime = 0;
-		this.endTime = 0;
-	}
-
-	@Override
-	protected void tearDown() throws Exception {
-		TestTools.clear(this);
-		super.tearDown();
-	}
-
-	public void testAccessors() throws Exception {
-		this.sb.setValue(false);
-		assertFalse(this.sb.value());
-		assertFalse(this.sb.isTrue());
-		assertTrue(this.sb.isFalse());
-
-		this.sb.setValue(true);
-		assertTrue(this.sb.value());
-		assertTrue(this.sb.isTrue());
-		assertFalse(this.sb.isFalse());
-
-		this.sb.setFalse();
-		assertFalse(this.sb.value());
-		assertFalse(this.sb.isTrue());
-		assertTrue(this.sb.isFalse());
-
-		this.sb.setTrue();
-		assertTrue(this.sb.value());
-		assertTrue(this.sb.isTrue());
-		assertFalse(this.sb.isFalse());
-
-		assertSame(this.sb, this.sb.mutex());
-	}
-
-	public void testEquals() throws Exception {
-		this.sb.setValue(false);
-		SynchronizedBoolean sb2 = new SynchronizedBoolean(false);
-		assertEquals(this.sb, sb2);
-
-		this.sb.setValue(true);
-		assertFalse(this.sb.equals(sb2));
-
-		sb2.setValue(true);
-		assertEquals(this.sb, sb2);
-	}
-
-	public void testHashCode() {
-		this.sb.setValue(false);
-		assertEquals(0, this.sb.hashCode());
-
-		this.sb.setValue(true);
-		assertEquals(1, this.sb.hashCode());
-	}
-
-	public void testWaitUntilTrue() throws Exception {
-		this.verifyWaitUntilTrue(0);
-		// no timeout occurs...
-		assertFalse(this.timeoutOccurred);
-		// ...and the value should be set to true by t2
-		assertTrue(this.sb.value());
-		// make a reasonable guess about how long t2 took
-		assertTrue(this.elapsedTime() > 150);
-	}
-
-	public void testWaitUntilTrueTimeout() throws Exception {
-		this.verifyWaitUntilTrue(20);
-		// timeout occurs...
-		assertTrue(this.timeoutOccurred);
-		// ...and the value will eventually be set to true by t1
-		assertTrue(this.sb.value());
-		// make a reasonable guess about how long t2 took
-		assertTrue(this.elapsedTime() < 150);
-	}
-
-	private void verifyWaitUntilTrue(long timeout) throws Exception {
-		this.sb.setFalse();
-		Runnable r1 = this.buildRunnable(this.buildSetTrueCommand(), this.sb, 200);
-		Runnable r2 = this.buildRunnable(this.buildWaitUntilTrueCommand(timeout), this.sb, 0);
-		Thread t1 = new Thread(r1);
-		Thread t2 = new Thread(r2);
-		t1.start();
-		t2.start();
-		while (t1.isAlive() || t2.isAlive()) {
-			Thread.sleep(50);
-		}
-		assertFalse(this.exCaught);
-	}
-
-	public void testWaitToSetFalse() throws Exception {
-		this.verifyWaitToSetFalse(0);
-		// no timeout occurs...
-		assertFalse(this.timeoutOccurred);
-		// ...and the value should be set to false by t2
-		assertFalse(this.sb.value());
-		// make a reasonable guess about how long t2 took
-		assertTrue(this.elapsedTime() > 150);
-	}
-
-	public void testWaitToSetFalseTimeout() throws Exception {
-		this.verifyWaitToSetFalse(20);
-		// timeout occurs...
-		assertTrue(this.timeoutOccurred);
-		// ...and the value will eventually be set to true by t1
-		assertTrue(this.sb.value());
-		// make a reasonable guess about how long t2 took
-		assertTrue(this.elapsedTime() < 150);
-	}
-
-	private void verifyWaitToSetFalse(long timeout) throws Exception {
-		this.sb.setFalse();
-		Runnable r1 = this.buildRunnable(this.buildSetTrueCommand(), this.sb, 200);
-		Runnable r2 = this.buildRunnable(this.buildWaitToSetFalseCommand(timeout), this.sb, 0);
-		Thread t1 = new Thread(r1);
-		Thread t2 = new Thread(r2);
-		t1.start();
-		t2.start();
-		while (t1.isAlive() || t2.isAlive()) {
-			Thread.sleep(50);
-		}
-		assertFalse(this.exCaught);
-	}
-
-	private Command buildSetTrueCommand() {
-		return new Command() {
-			public void execute(SynchronizedBoolean syncBool) {
-				syncBool.setTrue();
-			}
-		};
-	}
-
-	private Command buildWaitUntilTrueCommand(final long timeout) {
-		return new Command() {
-			public void execute(SynchronizedBoolean syncBool) throws Exception {
-				SynchronizedBooleanTests.this.setStartTime(System.currentTimeMillis());
-				SynchronizedBooleanTests.this.setTimeoutOccurred( ! syncBool.waitUntilTrue(timeout));
-				SynchronizedBooleanTests.this.setEndTime(System.currentTimeMillis());
-			}
-		};
-	}
-
-	private Command buildWaitToSetFalseCommand(final long timeout) {
-		return new Command() {
-			public void execute(SynchronizedBoolean syncBool) throws Exception {
-				SynchronizedBooleanTests.this.setStartTime(System.currentTimeMillis());
-				SynchronizedBooleanTests.this.setTimeoutOccurred( ! syncBool.waitToSetFalse(timeout));
-				SynchronizedBooleanTests.this.setEndTime(System.currentTimeMillis());
-			}
-		};
-	}
-
-	private Runnable buildRunnable(final Command command, final SynchronizedBoolean syncBool, final long sleep) {
-		return new Runnable() {
-			public void run() {
-				try {
-					if (sleep != 0) {
-						Thread.sleep(sleep);
-					}
-					command.execute(syncBool);
-				} catch (Exception ex) {
-					SynchronizedBooleanTests.this.setExCaught(true);
-				}
-			}
-		};
-	}
-
-	void setExCaught(boolean exCaught) {
-		this.exCaught = exCaught;
-	}
-
-	void setTimeoutOccurred(boolean timeoutOccurred) {
-		this.timeoutOccurred = timeoutOccurred;
-	}
-
-	void setStartTime(long startTime) {
-		this.startTime = startTime;
-	}
-
-	void setEndTime(long endTime) {
-		this.endTime = endTime;
-	}
-
-	long elapsedTime() {
-		return this.endTime - this.startTime;
-	}
-
-
-	// ********** Command interface **********
-
-	private interface Command {
-		void execute(SynchronizedBoolean syncBool) throws Exception;
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/SynchronizedObjectTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/SynchronizedObjectTests.java
deleted file mode 100644
index 1eba5ba..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/SynchronizedObjectTests.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal;
-
-import org.eclipse.jpt.utility.internal.SynchronizedObject;
-
-import junit.framework.TestCase;
-
-public class SynchronizedObjectTests extends TestCase {
-	private volatile SynchronizedObject<Object> so;
-	private volatile boolean exCaught;
-	private volatile boolean timeoutOccurred;
-	volatile Object value = new Object();
-	private volatile long startTime;
-	private volatile long endTime;
-	private volatile Object soValue;
-
-
-	public SynchronizedObjectTests(String name) {
-		super(name);
-	}
-
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-		this.so = new SynchronizedObject<Object>();
-		this.exCaught = false;
-		this.timeoutOccurred = false;
-		this.startTime = 0;
-		this.endTime = 0;
-		this.soValue = null;
-	}
-
-	@Override
-	protected void tearDown() throws Exception {
-		TestTools.clear(this);
-		super.tearDown();
-	}
-
-	public void testAccessors() throws Exception {
-		this.so.setValue(null);
-		assertNull(this.so.value());
-		assertFalse(this.so.isNotNull());
-		assertTrue(this.so.isNull());
-
-		this.so.setValue(this.value);
-		assertEquals(this.value, this.so.value());
-		assertTrue(this.so.isNotNull());
-		assertFalse(this.so.isNull());
-
-		this.so.setNull();
-		assertNull(this.so.value());
-		assertFalse(this.so.isNotNull());
-		assertTrue(this.so.isNull());
-
-		assertSame(this.so, this.so.mutex());
-	}
-
-	public void testEquals() throws Exception {
-		this.so.setValue(null);
-		SynchronizedObject<Object> so2 = new SynchronizedObject<Object>(null);
-		assertEquals(this.so, so2);
-
-		this.so.setValue(this.value);
-		assertFalse(this.so.equals(so2));
-
-		so2.setValue(this.value);
-		assertEquals(this.so, so2);
-	}
-
-	public void testHashCode() {
-		this.so.setValue(this.value);
-		assertEquals(this.value.hashCode(), this.so.hashCode());
-
-		this.so.setValue(null);
-		assertEquals(0, this.so.hashCode());
-	}
-
-	/**
-	 * t2 will wait indefinitely until t1 sets the value to null
-	 */
-	public void testWaitUntilNull() throws Exception {
-		this.verifyWaitUntilNull(0);
-		// no timeout occurs...
-		assertFalse(this.timeoutOccurred);
-		// ...and the value should be set to null by t2
-		assertNull(this.so.value());
-		// make a reasonable guess about how long t2 took
-		long time = this.elapsedTime();
-		assertTrue("t2 finished a bit early (expected value should be > 150): " + time, time > 150);
-	}
-
-	/**
-	 * t2 will time out waiting for t1 to set the value to null
-	 */
-	public void testWaitUntilNullTimeout() throws Exception {
-		this.verifyWaitUntilNull(20);
-		// timeout occurs...
-		assertTrue(this.timeoutOccurred);
-		// ...and the value will eventually be set to null by t1
-		assertNull(this.so.value());
-		// make a reasonable guess about how long t2 took
-		long time = this.elapsedTime();
-		assertTrue("t2 finished a bit late (expected value should be < 150): " + time, time < 150);
-	}
-
-	private void verifyWaitUntilNull(long t2Timeout) throws Exception {
-		this.executeThreads(this.buildSetNullCommand(), this.buildWaitUntilNullCommand(t2Timeout));
-	}
-
-	/**
-	 * t2 will wait indefinitely until t1 sets the value to null;
-	 * then t2 will set the value to an object
-	 */
-	public void testWaitToSetValue() throws Exception {
-		this.verifyWaitToSetValue(0);
-		// no timeout occurs...
-		assertFalse(this.timeoutOccurred);
-		// ...and the value should be set to an object by t2
-		assertTrue(this.so.isNotNull());
-		// make a reasonable guess about how long t2 took
-		long time = this.elapsedTime();
-		assertTrue("t2 finished a bit early (expected value should be > 150): " + time, time > 150);
-	}
-
-	/**
-	 * t2 will time out waiting for t1 to set the value to null
-	 */
-	public void testWaitToSetValueTimeout() throws Exception {
-		this.verifyWaitToSetValue(20);
-		// timeout occurs...
-		assertTrue(this.timeoutOccurred);
-		// ...and the value will eventually be set to null by t1
-		assertTrue(this.so.isNull());
-		// make a reasonable guess about how long t2 took
-		long time = this.elapsedTime();
-		assertTrue("t2 finished a bit late (expected value should be < 150): " + time, time < 150);
-	}
-
-	private void verifyWaitToSetValue(long t2Timeout) throws Exception {
-		this.executeThreads(this.buildSetNullCommand(), this.buildWaitToSetValueCommand(t2Timeout));
-	}
-
-	/**
-	 * t2 will wait until t1 is finished "initializing" the value;
-	 * then t2 will get the newly-initialized value ("foo")
-	 */
-	public void testExecute() throws Exception {
-		this.so.setValue(null);
-		Runnable r1 = this.buildRunnable(this.buildInitializeValueCommand(), this.so, 0);
-		// give t1 a head start of 100 ms
-		Runnable r2 = this.buildRunnable(this.buildGetValueCommand(), this.so, 100);
-		Thread t1 = new Thread(r1);
-		Thread t2 = new Thread(r2);
-		t1.start();
-		t2.start();
-		while (t1.isAlive() || t2.isAlive()) {
-			Thread.sleep(50);
-		}
-		assertFalse(this.exCaught);
-		assertEquals("foo", this.so.value());
-		assertEquals("foo", this.soValue);
-		// make a reasonable guess about how long t2 took
-		long time = this.elapsedTime();
-		assertTrue("t2 finished a bit early (expected value should be > 100): " + time, time > 300);
-	}
-
-	private void executeThreads(Command t1Command, Command t2Command) throws Exception {
-		this.so.setValue(this.value);
-		Runnable r1 = this.buildRunnable(t1Command, this.so, 200);
-		Runnable r2 = this.buildRunnable(t2Command, this.so, 0);
-		Thread t1 = new Thread(r1);
-		Thread t2 = new Thread(r2);
-		t1.start();
-		t2.start();
-		while (t1.isAlive() || t2.isAlive()) {
-			Thread.sleep(50);
-		}
-		assertFalse(this.exCaught);
-	}
-
-	private Command buildSetNullCommand() {
-		return new Command() {
-			public void execute(SynchronizedObject<Object> sObject) {
-				sObject.setNull();
-			}
-		};
-	}
-
-	private Command buildWaitUntilNullCommand(final long timeout) {
-		return new Command() {
-			public void execute(SynchronizedObject<Object> sObject) throws Exception {
-				SynchronizedObjectTests.this.setStartTime(System.currentTimeMillis());
-				SynchronizedObjectTests.this.setTimeoutOccurred( ! sObject.waitUntilNull(timeout));
-				SynchronizedObjectTests.this.setEndTime(System.currentTimeMillis());
-			}
-		};
-	}
-
-	private Command buildWaitToSetValueCommand(final long timeout) {
-		return new Command() {
-			public void execute(SynchronizedObject<Object> sObject) throws Exception {
-				SynchronizedObjectTests.this.setStartTime(System.currentTimeMillis());
-				SynchronizedObjectTests.this.setTimeoutOccurred( ! sObject.waitToSetValue(SynchronizedObjectTests.this.value, timeout));
-				SynchronizedObjectTests.this.setEndTime(System.currentTimeMillis());
-			}
-		};
-	}
-
-	private Command buildInitializeValueCommand() {
-		return new Command() {
-			public void execute(final SynchronizedObject<Object> sObject) throws Exception {
-				sObject.execute(
-					new org.eclipse.jpt.utility.internal.Command() {
-						public void execute() {
-							// pretend to perform some long initialization process
-							try {
-								Thread.sleep(500);
-							} catch (Exception ex) {
-								SynchronizedObjectTests.this.setExCaught(true);
-							}
-							sObject.setValue("foo");
-						}
-					}
-				);
-			}
-		};
-	}
-
-	private Command buildGetValueCommand() {
-		return new Command() {
-			public void execute(SynchronizedObject<Object> sObject) throws Exception {
-				SynchronizedObjectTests.this.setStartTime(System.currentTimeMillis());
-				SynchronizedObjectTests.this.setSOValue(sObject.value());
-				SynchronizedObjectTests.this.setEndTime(System.currentTimeMillis());
-			}
-		};
-	}
-
-	private Runnable buildRunnable(final Command command, final SynchronizedObject<Object> sObject, final long sleep) {
-		return new Runnable() {
-			public void run() {
-				try {
-					if (sleep != 0) {
-						Thread.sleep(sleep);
-					}
-					command.execute(sObject);
-				} catch (Exception ex) {
-					SynchronizedObjectTests.this.setExCaught(true);
-				}
-			}
-		};
-	}
-
-	void setExCaught(boolean exCaught) {
-		this.exCaught = exCaught;
-	}
-
-	void setTimeoutOccurred(boolean timeoutOccurred) {
-		this.timeoutOccurred = timeoutOccurred;
-	}
-
-	void setStartTime(long startTime) {
-		this.startTime = startTime;
-	}
-
-	void setEndTime(long endTime) {
-		this.endTime = endTime;
-	}
-
-	private long elapsedTime() {
-		return this.endTime - this.startTime;
-	}
-
-	void setSOValue(Object soValue) {
-		this.soValue = soValue;
-	}
-
-
-	// ********** Command interface **********
-
-	private interface Command {
-		void execute(SynchronizedObject<Object> so) throws Exception;
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/SynchronizedStackTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/SynchronizedStackTests.java
deleted file mode 100644
index adb83d9..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/SynchronizedStackTests.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal;
-
-import java.util.EmptyStackException;
-
-import org.eclipse.jpt.utility.internal.SimpleStack;
-import org.eclipse.jpt.utility.internal.Stack;
-import org.eclipse.jpt.utility.internal.SynchronizedStack;
-
-public class SynchronizedStackTests extends SimpleStackTests {
-	private volatile SynchronizedStack<String> ss;
-	private volatile boolean exCaught;
-	private volatile boolean timeoutOccurred;
-	private volatile long startTime;
-	private volatile long endTime;
-	private volatile Object poppedObject;
-
-	static final String ITEM_1 = new String();
-	static final String ITEM_2 = new String();
-
-	public SynchronizedStackTests(String name) {
-		super(name);
-	}
-
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-		this.ss = new SynchronizedStack<String>();
-		this.exCaught = false;
-		this.timeoutOccurred = false;
-		this.startTime = 0;
-		this.endTime = 0;
-		this.poppedObject = null;
-	}
-
-	/**
-	 * test first with an unsynchronized stack,
-	 * then with a synchronized stack
-	 */
-	public void testConcurrentAccess() throws Exception {
-		this.verifyConcurrentAccess(new SlowSimpleStack<String>(), "second");
-		this.verifyConcurrentAccess(new SlowSynchronizedStack<String>(), "first");
-	}
-
-	private void verifyConcurrentAccess(SlowStack<String> slowStack, String expected) throws Exception {
-		slowStack.push("first");
-		slowStack.push("second");
-
-		new Thread(this.buildRunnable(slowStack)).start();
-		Thread.sleep(200);
-
-		assertEquals(expected, slowStack.pop());
-	}
-
-	private Runnable buildRunnable(final SlowStack<String> slowStack) {
-		return new Runnable() {
-			public void run() {
-				slowStack.slowPop();
-			}
-		};
-	}
-
-
-	private interface SlowStack<E> extends Stack<E> {
-		Object slowPop();
-	}
-
-	private class SlowSimpleStack<E> extends SimpleStack<E> implements SlowStack<E> {
-		SlowSimpleStack() {
-			super();
-		}
-		public Object slowPop() {
-			try {
-				Thread.sleep(500);
-			} catch (InterruptedException ex) {
-				throw new RuntimeException(ex);
-			}
-			return this.pop();
-		}
-
-	}
-
-	private class SlowSynchronizedStack<E> extends SynchronizedStack<E> implements SlowStack<E> {
-		SlowSynchronizedStack() {
-			super();
-		}
-		public synchronized Object slowPop() {
-			try {
-				Thread.sleep(100);
-			} catch (InterruptedException ex) {
-				throw new RuntimeException(ex);
-			}
-			return this.pop();
-		}
-
-	}
-
-
-	// ********** waits **********
-
-	public void testWaitToPop() throws Exception {
-		this.verifyWaitToPop(0);
-		// no timeout occurs...
-		assertFalse(this.timeoutOccurred);
-		// ...and an item should have been popped by t2...
-		assertSame(ITEM_1, this.poppedObject);
-		// ...and the stack should be empty
-		assertTrue(this.ss.isEmpty());
-		// make a reasonable guess about how long t2 took
-		assertTrue(this.elapsedTime() > 150);
-	}
-
-	public void testWaitToPopTimeout() throws Exception {
-		this.verifyWaitToPop(20);
-		// timeout occurs...
-		assertTrue(this.timeoutOccurred);
-		// ...and the stack was never popped...
-		assertNull(this.poppedObject);
-		// ...and it still holds the item
-		assertSame(ITEM_1, this.ss.peek());
-		// make a reasonable guess about how long t2 took
-		assertTrue(this.elapsedTime() < 150);
-	}
-
-	private void verifyWaitToPop(long timeout) throws Exception {
-		Runnable r1 = this.buildRunnable(this.buildPushCommand(), this.ss, 200);
-		Runnable r2 = this.buildRunnable(this.buildWaitToPopCommand(timeout), this.ss, 0);
-		Thread t1 = new Thread(r1);
-		Thread t2 = new Thread(r2);
-		t1.start();
-		t2.start();
-		while (t1.isAlive() || t2.isAlive()) {
-			Thread.sleep(50);
-		}
-		assertFalse(this.exCaught);
-	}
-
-	public void testWaitToPush() throws Exception {
-		this.verifyWaitToPush(0);
-		// no timeout occurs...
-		assertFalse(this.timeoutOccurred);
-		// ...and the stack gets popped by t1...
-		assertSame(ITEM_1, this.poppedObject);
-		// ...and an item is pushed on to the stack by t2
-		assertFalse(this.ss.isEmpty());
-		assertSame(ITEM_2, this.ss.peek());
-		// make a reasonable guess about how long t2 took
-		assertTrue(this.elapsedTime() > 150);
-	}
-
-	public void testWaitToPushTimeout() throws Exception {
-		this.verifyWaitToPush(20);
-		// timeout occurs...
-		assertTrue(this.timeoutOccurred);
-		// ...and the stack is eventually popped by t1...
-		assertSame(ITEM_1, this.poppedObject);
-		// ...but nothing is pushed on to the stack by t2
-		assertTrue(this.ss.isEmpty());
-		// make a reasonable guess about how long t2 took
-		assertTrue(this.elapsedTime() < 150);
-	}
-
-	private void verifyWaitToPush(long timeout) throws Exception {
-		this.ss.push(ITEM_1);
-		Runnable r1 = this.buildRunnable(this.buildPopCommand(), this.ss, 200);
-		Runnable r2 = this.buildRunnable(this.buildWaitToPushCommand(timeout), this.ss, 0);
-		Thread t1 = new Thread(r1);
-		Thread t2 = new Thread(r2);
-		t1.start();
-		t2.start();
-		while (t1.isAlive() || t2.isAlive()) {
-			Thread.sleep(50);
-		}
-		assertFalse(this.exCaught);
-	}
-
-	private Command buildPushCommand() {
-		return new Command() {
-			public void execute(SynchronizedStack<String> synchronizedStack) {
-				synchronizedStack.push(ITEM_1);
-			}
-		};
-	}
-
-	private Command buildWaitToPopCommand(final long timeout) {
-		return new Command() {
-			public void execute(SynchronizedStack<String> synchronizedStack) throws Exception {
-				SynchronizedStackTests.this.setStartTime(System.currentTimeMillis());
-				try {
-					SynchronizedStackTests.this.setPoppedObject(synchronizedStack.waitToPop(timeout));
-				} catch (EmptyStackException ex) {
-					SynchronizedStackTests.this.setTimeoutOccurred(true);
-				}
-				SynchronizedStackTests.this.setEndTime(System.currentTimeMillis());
-			}
-		};
-	}
-
-	private Command buildPopCommand() {
-		return new Command() {
-			public void execute(SynchronizedStack<String> synchronizedStack) {
-				SynchronizedStackTests.this.setPoppedObject(synchronizedStack.pop());
-			}
-		};
-	}
-
-	private Command buildWaitToPushCommand(final long timeout) {
-		return new Command() {
-			public void execute(SynchronizedStack<String> synchronizedStack) throws Exception {
-				SynchronizedStackTests.this.setStartTime(System.currentTimeMillis());
-				SynchronizedStackTests.this.setTimeoutOccurred( ! synchronizedStack.waitToPush(ITEM_2, timeout));
-				SynchronizedStackTests.this.setEndTime(System.currentTimeMillis());
-			}
-		};
-	}
-
-	private Runnable buildRunnable(final Command command, final SynchronizedStack<String> synchronizedStack, final long sleep) {
-		return new Runnable() {
-			public void run() {
-				try {
-					if (sleep != 0) {
-						Thread.sleep(sleep);
-					}
-					command.execute(synchronizedStack);
-				} catch (Exception ex) {
-					SynchronizedStackTests.this.setExCaught(true);
-				}
-			}
-		};
-	}
-
-	void setExCaught(boolean exCaught) {
-		this.exCaught = exCaught;
-	}
-
-	void setTimeoutOccurred(boolean timeoutOccurred) {
-		this.timeoutOccurred = timeoutOccurred;
-	}
-
-	void setStartTime(long startTime) {
-		this.startTime = startTime;
-	}
-
-	void setEndTime(long endTime) {
-		this.endTime = endTime;
-	}
-
-	void setPoppedObject(Object poppedObject) {
-		this.poppedObject = poppedObject;
-	}
-
-	long elapsedTime() {
-		return this.endTime - this.startTime;
-	}
-
-
-	// ********** Command interface **********
-
-	private interface Command {
-		void execute(SynchronizedStack<String> synchronizedStack) throws Exception;
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/iterators/JptUtilityIteratorsTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/iterators/JptUtilityIteratorsTests.java
index 2978766..76e6717 100644
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/iterators/JptUtilityIteratorsTests.java
+++ b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/iterators/JptUtilityIteratorsTests.java
@@ -48,7 +48,6 @@
 
 	private JptUtilityIteratorsTests() {
 		super();
-		throw new UnsupportedOperationException();
 	}
 
 }
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/AbstractModelTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/AbstractModelTests.java
deleted file mode 100644
index 81c19cd..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/AbstractModelTests.java
+++ /dev/null
@@ -1,1685 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal.model;
-
-import java.io.Serializable;
-import java.util.Arrays;
-import junit.framework.TestCase;
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.internal.model.AbstractModel;
-import org.eclipse.jpt.utility.internal.model.ChangeSupport;
-import org.eclipse.jpt.utility.internal.model.event.CollectionChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.ListChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.PropertyChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.StateChangeEvent;
-import org.eclipse.jpt.utility.internal.model.event.TreeChangeEvent;
-import org.eclipse.jpt.utility.internal.model.listener.ChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.CollectionChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ListChangeAdapter;
-import org.eclipse.jpt.utility.internal.model.listener.ListChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.PropertyChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.StateChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.TreeChangeListener;
-import org.eclipse.jpt.utility.tests.internal.TestTools;
-
-public class AbstractModelTests
-	extends TestCase
-	implements StateChangeListener, PropertyChangeListener, CollectionChangeListener, ListChangeListener, TreeChangeListener
-{
-	private TestModel testModel;
-	private static final String TEST_TO_STRING = "this is a test";
-
-	private StateChangeEvent stateChangeEvent;
-	private boolean stateChangedCalled = false;
-
-	private PropertyChangeEvent propertyChangeEvent;
-	private boolean propertyChangeCalled = false;
-	private static final String PROPERTY_NAME = "propertyName";
-	static final Object OLD_OBJECT_VALUE = new Object();
-	static final Object NEW_OBJECT_VALUE = new Object();
-	static final Integer OLD_INT_VALUE = new Integer(27);
-	static final Integer NEW_INT_VALUE = new Integer(42);
-	static final Boolean OLD_BOOLEAN_VALUE = Boolean.TRUE;
-	static final Boolean NEW_BOOLEAN_VALUE = Boolean.FALSE;
-
-	private CollectionChangeEvent collectionChangeEvent;
-	private boolean itemsAddedCollectionCalled = false;
-	private boolean itemsRemovedCollectionCalled = false;
-	private boolean collectionChangedCalled = false;
-	private boolean collectionClearedCalled = false;
-	private static final String COLLECTION_NAME = "collectionName";
-	static final Object ADDED_OBJECT_VALUE = new Object();
-	static final Object REMOVED_OBJECT_VALUE = new Object();
-	static final int TARGET_INDEX = 7;
-	static final int SOURCE_INDEX = 22;
-
-	private ListChangeEvent listChangeEvent;
-	private boolean itemsAddedListCalled = false;
-	private boolean itemsRemovedListCalled = false;
-	private boolean itemsReplacedListCalled = false;
-	private boolean itemsMovedListCalled = false;
-	private boolean listChangedCalled = false;
-	private boolean listClearedCalled = false;
-	private static final String LIST_NAME = "listName";
-	private static final int ADD_INDEX = 3;
-	private static final int REMOVE_INDEX = 5;
-	private static final int REPLACE_INDEX = 2;
-
-	private TreeChangeEvent treeChangeEvent;
-	private boolean nodeAddedCalled = false;
-	private boolean nodeRemovedCalled = false;
-	private boolean treeChangedCalled = false;
-	private boolean treeClearedCalled = false;
-	private static final String TREE_NAME = "treeName";
-	static final Object[] OBJECT_ARRAY_PATH = {new Object(), new Object(), new String()};
-	static final Object[] EMPTY_PATH = {};
-
-	public AbstractModelTests(String name) {
-		super(name);
-	}
-	
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-		this.testModel = new TestModel();
-	}
-
-	@Override
-	protected void tearDown() throws Exception {
-		TestTools.clear(this);
-		super.tearDown();
-	}
-
-	public void testFireStateChange() {
-		this.stateChangeEvent = null;
-		this.stateChangedCalled = false;
-		this.testModel.addStateChangeListener(this);
-		this.testModel.testFireStateChange();
-		assertNotNull(this.stateChangeEvent);
-		assertEquals(this.testModel, this.stateChangeEvent.getSource());
-		assertTrue(this.stateChangedCalled);
-	}
-
-	public void testFirePropertyChangeObjectObject() {
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.addPropertyChangeListener(this);
-		this.testModel.testFirePropertyChangeObjectObject();
-		this.verifyPropertyChangeEvent(OLD_OBJECT_VALUE, NEW_OBJECT_VALUE);
-		assertTrue(this.propertyChangeCalled);
-
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.removePropertyChangeListener(this);
-		this.testModel.testFirePropertyChangeObjectObject();
-		assertNull(this.propertyChangeEvent);
-		assertFalse(this.propertyChangeCalled);
-
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this);
-		this.testModel.testFirePropertyChangeObjectObject();
-		this.verifyPropertyChangeEvent(OLD_OBJECT_VALUE, NEW_OBJECT_VALUE);
-		assertTrue(this.propertyChangeCalled);
-
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this);
-		this.testModel.testFirePropertyChangeObjectObject();
-		assertNull(this.propertyChangeEvent);
-		assertFalse(this.propertyChangeCalled);
-	}
-
-	public void testFirePropertyChangeObject() {
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.addPropertyChangeListener(this);
-		this.testModel.testFirePropertyChangeObject();
-		this.verifyPropertyChangeEvent(null, NEW_OBJECT_VALUE);
-		assertTrue(this.propertyChangeCalled);
-
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.removePropertyChangeListener(this);
-		this.testModel.testFirePropertyChangeObject();
-		assertNull(this.propertyChangeEvent);
-		assertFalse(this.propertyChangeCalled);
-
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this);
-		this.testModel.testFirePropertyChangeObject();
-		this.verifyPropertyChangeEvent(null, NEW_OBJECT_VALUE);
-		assertTrue(this.propertyChangeCalled);
-
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this);
-		this.testModel.testFirePropertyChangeObject();
-		assertNull(this.propertyChangeEvent);
-		assertFalse(this.propertyChangeCalled);
-	}
-
-	public void testFirePropertyChangeIntInt() {
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.addPropertyChangeListener(this);
-		this.testModel.testFirePropertyChangeIntInt();
-		this.verifyPropertyChangeEvent(OLD_INT_VALUE, NEW_INT_VALUE);
-		assertTrue(this.propertyChangeCalled);
-
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.removePropertyChangeListener(this);
-		this.testModel.testFirePropertyChangeIntInt();
-		assertNull(this.propertyChangeEvent);
-		assertFalse(this.propertyChangeCalled);
-
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this);
-		this.testModel.testFirePropertyChangeIntInt();
-		this.verifyPropertyChangeEvent(OLD_INT_VALUE, NEW_INT_VALUE);
-		assertTrue(this.propertyChangeCalled);
-
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this);
-		this.testModel.testFirePropertyChangeIntInt();
-		assertNull(this.propertyChangeEvent);
-		assertFalse(this.propertyChangeCalled);
-	}
-
-	public void testFirePropertyChangeBooleanBoolean() {
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.addPropertyChangeListener(this);
-		this.testModel.testFirePropertyChangeBooleanBoolean();
-		this.verifyPropertyChangeEvent(OLD_BOOLEAN_VALUE, NEW_BOOLEAN_VALUE);
-		assertTrue(this.propertyChangeCalled);
-
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.removePropertyChangeListener(this);
-		this.testModel.testFirePropertyChangeBooleanBoolean();
-		assertNull(this.propertyChangeEvent);
-		assertFalse(this.propertyChangeCalled);
-
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this);
-		this.testModel.testFirePropertyChangeBooleanBoolean();
-		this.verifyPropertyChangeEvent(OLD_BOOLEAN_VALUE, NEW_BOOLEAN_VALUE);
-		assertTrue(this.propertyChangeCalled);
-
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this);
-		this.testModel.testFirePropertyChangeBooleanBoolean();
-		assertNull(this.propertyChangeEvent);
-		assertFalse(this.propertyChangeCalled);
-	}
-
-	public void testFireItemAddedCollection() {
-		this.collectionChangeEvent = null;
-		this.itemsAddedCollectionCalled = false;
-		this.testModel.addCollectionChangeListener(this);
-		this.testModel.testFireItemAddedCollection();
-		this.verifyCollectionChangeEvent(ADDED_OBJECT_VALUE);
-		assertTrue(this.itemsAddedCollectionCalled);
-
-		this.collectionChangeEvent = null;
-		this.itemsAddedCollectionCalled = false;
-		this.testModel.removeCollectionChangeListener(this);
-		this.testModel.testFireItemAddedCollection();
-		assertNull(this.collectionChangeEvent);
-		assertFalse(this.itemsAddedCollectionCalled);
-
-		this.collectionChangeEvent = null;
-		this.itemsAddedCollectionCalled = false;
-		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this);
-		this.testModel.testFireItemAddedCollection();
-		this.verifyCollectionChangeEvent(ADDED_OBJECT_VALUE);
-		assertTrue(this.itemsAddedCollectionCalled);
-
-		this.collectionChangeEvent = null;
-		this.itemsAddedCollectionCalled = false;
-		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this);
-		this.testModel.testFireItemAddedCollection();
-		assertNull(this.collectionChangeEvent);
-		assertFalse(this.itemsAddedCollectionCalled);
-	}
-
-	public void testFireItemRemovedCollection() {
-		this.collectionChangeEvent = null;
-		this.itemsRemovedCollectionCalled = false;
-		this.testModel.addCollectionChangeListener(this);
-		this.testModel.testFireItemRemovedCollection();
-		this.verifyCollectionChangeEvent(REMOVED_OBJECT_VALUE);
-		assertTrue(this.itemsRemovedCollectionCalled);
-
-		this.collectionChangeEvent = null;
-		this.itemsRemovedCollectionCalled = false;
-		this.testModel.removeCollectionChangeListener(this);
-		this.testModel.testFireItemRemovedCollection();
-		assertNull(this.collectionChangeEvent);
-		assertFalse(this.itemsRemovedCollectionCalled);
-
-		this.collectionChangeEvent = null;
-		this.itemsRemovedCollectionCalled = false;
-		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this);
-		this.testModel.testFireItemRemovedCollection();
-		this.verifyCollectionChangeEvent(REMOVED_OBJECT_VALUE);
-		assertTrue(this.itemsRemovedCollectionCalled);
-
-		this.collectionChangeEvent = null;
-		this.itemsRemovedCollectionCalled = false;
-		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this);
-		this.testModel.testFireItemRemovedCollection();
-		assertNull(this.collectionChangeEvent);
-		assertFalse(this.itemsRemovedCollectionCalled);
-	}
-
-	public void testFireCollectionCleared() {
-		this.collectionChangeEvent = null;
-		this.collectionClearedCalled = false;
-		this.testModel.addCollectionChangeListener(this);
-		this.testModel.testFireCollectionCleared();
-		this.verifyCollectionChangeEvent(null);
-		assertTrue(this.collectionClearedCalled);
-
-		this.collectionChangeEvent = null;
-		this.collectionClearedCalled = false;
-		this.testModel.removeCollectionChangeListener(this);
-		this.testModel.testFireCollectionCleared();
-		assertNull(this.collectionChangeEvent);
-		assertFalse(this.collectionClearedCalled);
-
-		this.collectionChangeEvent = null;
-		this.collectionClearedCalled = false;
-		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this);
-		this.testModel.testFireCollectionCleared();
-		this.verifyCollectionChangeEvent(null);
-		assertTrue(this.collectionClearedCalled);
-
-		this.collectionChangeEvent = null;
-		this.collectionClearedCalled = false;
-		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this);
-		this.testModel.testFireCollectionCleared();
-		assertNull(this.collectionChangeEvent);
-		assertFalse(this.collectionClearedCalled);
-	}
-
-	public void testFireCollectionChanged() {
-		this.collectionChangeEvent = null;
-		this.collectionChangedCalled = false;
-		this.testModel.addCollectionChangeListener(this);
-		this.testModel.testFireCollectionChanged();
-		this.verifyCollectionChangeEvent(null);
-		assertTrue(this.collectionChangedCalled);
-
-		this.collectionChangeEvent = null;
-		this.collectionChangedCalled = false;
-		this.testModel.removeCollectionChangeListener(this);
-		this.testModel.testFireCollectionChanged();
-		assertNull(this.collectionChangeEvent);
-		assertFalse(this.collectionChangedCalled);
-
-		this.collectionChangeEvent = null;
-		this.collectionChangedCalled = false;
-		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this);
-		this.testModel.testFireCollectionChanged();
-		this.verifyCollectionChangeEvent(null);
-		assertTrue(this.collectionChangedCalled);
-
-		this.collectionChangeEvent = null;
-		this.collectionChangedCalled = false;
-		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this);
-		this.testModel.testFireCollectionChanged();
-		assertNull(this.collectionChangeEvent);
-		assertFalse(this.collectionChangedCalled);
-	}
-
-	public void testFireItemAddedList() {
-		this.listChangeEvent = null;
-		this.itemsAddedListCalled = false;
-		this.testModel.addListChangeListener(this);
-		this.testModel.testFireItemAddedList();
-		this.verifyListChangeEvent(ADD_INDEX, ADDED_OBJECT_VALUE);
-		assertTrue(this.itemsAddedListCalled);
-
-		this.listChangeEvent = null;
-		this.itemsAddedListCalled = false;
-		this.testModel.removeListChangeListener(this);
-		this.testModel.testFireItemAddedList();
-		assertNull(this.listChangeEvent);
-		assertFalse(this.itemsAddedListCalled);
-
-		this.listChangeEvent = null;
-		this.itemsAddedListCalled = false;
-		this.testModel.addListChangeListener(LIST_NAME, this);
-		this.testModel.testFireItemAddedList();
-		this.verifyListChangeEvent(ADD_INDEX, ADDED_OBJECT_VALUE);
-		assertTrue(this.itemsAddedListCalled);
-
-		this.listChangeEvent = null;
-		this.itemsAddedListCalled = false;
-		this.testModel.removeListChangeListener(LIST_NAME, this);
-		this.testModel.testFireItemAddedList();
-		assertNull(this.listChangeEvent);
-		assertFalse(this.itemsAddedListCalled);
-	}
-
-	public void testFireItemRemovedList() {
-		this.listChangeEvent = null;
-		this.itemsRemovedListCalled = false;
-		this.testModel.addListChangeListener(this);
-		this.testModel.testFireItemRemovedList();
-		this.verifyListChangeEvent(REMOVE_INDEX, REMOVED_OBJECT_VALUE);
-		assertTrue(this.itemsRemovedListCalled);
-
-		this.listChangeEvent = null;
-		this.itemsRemovedListCalled = false;
-		this.testModel.removeListChangeListener(this);
-		this.testModel.testFireItemRemovedList();
-		assertNull(this.listChangeEvent);
-		assertFalse(this.itemsRemovedListCalled);
-
-		this.listChangeEvent = null;
-		this.itemsRemovedListCalled = false;
-		this.testModel.addListChangeListener(LIST_NAME, this);
-		this.testModel.testFireItemRemovedList();
-		this.verifyListChangeEvent(REMOVE_INDEX, REMOVED_OBJECT_VALUE);
-		assertTrue(this.itemsRemovedListCalled);
-
-		this.listChangeEvent = null;
-		this.itemsRemovedListCalled = false;
-		this.testModel.removeListChangeListener(LIST_NAME, this);
-		this.testModel.testFireItemRemovedList();
-		assertNull(this.listChangeEvent);
-		assertFalse(this.itemsRemovedListCalled);
-	}
-
-	public void testFireItemReplacedList() {
-		this.listChangeEvent = null;
-		this.itemsReplacedListCalled = false;
-		this.testModel.addListChangeListener(this);
-		this.testModel.testFireItemReplacedList();
-		this.verifyListChangeEvent(REPLACE_INDEX, ADDED_OBJECT_VALUE, REMOVED_OBJECT_VALUE);
-		assertTrue(this.itemsReplacedListCalled);
-
-		this.listChangeEvent = null;
-		this.itemsReplacedListCalled = false;
-		this.testModel.removeListChangeListener(this);
-		this.testModel.testFireItemReplacedList();
-		assertNull(this.listChangeEvent);
-		assertFalse(this.itemsReplacedListCalled);
-
-		this.listChangeEvent = null;
-		this.itemsReplacedListCalled = false;
-		this.testModel.addListChangeListener(LIST_NAME, this);
-		this.testModel.testFireItemReplacedList();
-		this.verifyListChangeEvent(REPLACE_INDEX, ADDED_OBJECT_VALUE, REMOVED_OBJECT_VALUE);
-		assertTrue(this.itemsReplacedListCalled);
-
-		this.listChangeEvent = null;
-		this.itemsReplacedListCalled = false;
-		this.testModel.removeListChangeListener(LIST_NAME, this);
-		this.testModel.testFireItemReplacedList();
-		assertNull(this.listChangeEvent);
-		assertFalse(this.itemsReplacedListCalled);
-	}
-
-	public void testFireItemMovedList() {
-		this.listChangeEvent = null;
-		this.itemsMovedListCalled = false;
-		this.testModel.addListChangeListener(this);
-		this.testModel.testFireItemMovedList();
-		this.verifyListChangeEvent(TARGET_INDEX, SOURCE_INDEX);
-		assertTrue(this.itemsMovedListCalled);
-
-		this.listChangeEvent = null;
-		this.itemsMovedListCalled = false;
-		this.testModel.removeListChangeListener(this);
-		this.testModel.testFireItemMovedList();
-		assertNull(this.listChangeEvent);
-		assertFalse(this.itemsMovedListCalled);
-
-		this.listChangeEvent = null;
-		this.itemsMovedListCalled = false;
-		this.testModel.addListChangeListener(LIST_NAME, this);
-		this.testModel.testFireItemMovedList();
-		this.verifyListChangeEvent(TARGET_INDEX, SOURCE_INDEX);
-		assertTrue(this.itemsMovedListCalled);
-
-		this.listChangeEvent = null;
-		this.itemsMovedListCalled = false;
-		this.testModel.removeListChangeListener(LIST_NAME, this);
-		this.testModel.testFireItemMovedList();
-		assertNull(this.listChangeEvent);
-		assertFalse(this.itemsMovedListCalled);
-	}
-
-	public void testFireListCleared() {
-		this.listChangeEvent = null;
-		this.listClearedCalled = false;
-		this.testModel.addListChangeListener(this);
-		this.testModel.testFireListCleared();
-		this.verifyListChangeEvent(-1, null);
-		assertTrue(this.listClearedCalled);
-
-		this.listChangeEvent = null;
-		this.listClearedCalled = false;
-		this.testModel.removeListChangeListener(this);
-		this.testModel.testFireListCleared();
-		assertNull(this.listChangeEvent);
-		assertFalse(this.listClearedCalled);
-
-		this.listChangeEvent = null;
-		this.listClearedCalled = false;
-		this.testModel.addListChangeListener(LIST_NAME, this);
-		this.testModel.testFireListCleared();
-		this.verifyListChangeEvent(-1, null);
-		assertTrue(this.listClearedCalled);
-
-		this.listChangeEvent = null;
-		this.listClearedCalled = false;
-		this.testModel.removeListChangeListener(LIST_NAME, this);
-		this.testModel.testFireListCleared();
-		assertNull(this.listChangeEvent);
-		assertFalse(this.listClearedCalled);
-	}
-
-	public void testFireListChanged() {
-		this.listChangeEvent = null;
-		this.listChangedCalled = false;
-		this.testModel.addListChangeListener(this);
-		this.testModel.testFireListChanged();
-		this.verifyListChangeEvent(-1, null);
-		assertTrue(this.listChangedCalled);
-
-		this.listChangeEvent = null;
-		this.listChangedCalled = false;
-		this.testModel.removeListChangeListener(this);
-		this.testModel.testFireListChanged();
-		assertNull(this.listChangeEvent);
-		assertFalse(this.listChangedCalled);
-
-		this.listChangeEvent = null;
-		this.listChangedCalled = false;
-		this.testModel.addListChangeListener(LIST_NAME, this);
-		this.testModel.testFireListChanged();
-		this.verifyListChangeEvent(-1, null);
-		assertTrue(this.listChangedCalled);
-
-		this.listChangeEvent = null;
-		this.listChangedCalled = false;
-		this.testModel.removeListChangeListener(LIST_NAME, this);
-		this.testModel.testFireListChanged();
-		assertNull(this.listChangeEvent);
-		assertFalse(this.listChangedCalled);
-	}
-
-	public void testFireNodeAddedObjectArrayPath() {
-		this.treeChangeEvent = null;
-		this.nodeAddedCalled = false;
-		this.testModel.addTreeChangeListener(this);
-		this.testModel.testFireNodeAddedObjectArrayPath();
-		this.verifyTreeChangeEvent(OBJECT_ARRAY_PATH);
-		assertTrue(this.nodeAddedCalled);
-
-		this.treeChangeEvent = null;
-		this.nodeAddedCalled = false;
-		this.testModel.removeTreeChangeListener(this);
-		this.testModel.testFireNodeAddedObjectArrayPath();
-		assertNull(this.treeChangeEvent);
-		assertFalse(this.nodeAddedCalled);
-
-		this.treeChangeEvent = null;
-		this.nodeAddedCalled = false;
-		this.testModel.addTreeChangeListener(TREE_NAME, this);
-		this.testModel.testFireNodeAddedObjectArrayPath();
-		this.verifyTreeChangeEvent(OBJECT_ARRAY_PATH);
-		assertTrue(this.nodeAddedCalled);
-
-		this.treeChangeEvent = null;
-		this.nodeAddedCalled = false;
-		this.testModel.removeTreeChangeListener(TREE_NAME, this);
-		this.testModel.testFireNodeAddedObjectArrayPath();
-		assertNull(this.treeChangeEvent);
-		assertFalse(this.nodeAddedCalled);
-	}
-
-	public void testFireNodeRemovedObjectArrayPath() {
-		this.treeChangeEvent = null;
-		this.nodeRemovedCalled = false;
-		this.testModel.addTreeChangeListener(this);
-		this.testModel.testFireNodeRemovedObjectArrayPath();
-		this.verifyTreeChangeEvent(OBJECT_ARRAY_PATH);
-		assertTrue(this.nodeRemovedCalled);
-
-		this.treeChangeEvent = null;
-		this.nodeRemovedCalled = false;
-		this.testModel.removeTreeChangeListener(this);
-		this.testModel.testFireNodeRemovedObjectArrayPath();
-		assertNull(this.treeChangeEvent);
-		assertFalse(this.nodeRemovedCalled);
-
-		this.treeChangeEvent = null;
-		this.nodeRemovedCalled = false;
-		this.testModel.addTreeChangeListener(TREE_NAME, this);
-		this.testModel.testFireNodeRemovedObjectArrayPath();
-		this.verifyTreeChangeEvent(OBJECT_ARRAY_PATH);
-		assertTrue(this.nodeRemovedCalled);
-
-		this.treeChangeEvent = null;
-		this.nodeRemovedCalled = false;
-		this.testModel.removeTreeChangeListener(TREE_NAME, this);
-		this.testModel.testFireNodeRemovedObjectArrayPath();
-		assertNull(this.treeChangeEvent);
-		assertFalse(this.nodeRemovedCalled);
-	}
-
-	public void testFireTreeCleared() {
-		this.treeChangeEvent = null;
-		this.treeClearedCalled = false;
-		this.testModel.addTreeChangeListener(this);
-		this.testModel.testFireTreeCleared();
-		this.verifyTreeChangeEvent(EMPTY_PATH);
-		assertTrue(this.treeClearedCalled);
-
-		this.treeChangeEvent = null;
-		this.treeClearedCalled = false;
-		this.testModel.removeTreeChangeListener(this);
-		this.testModel.testFireTreeCleared();
-		assertNull(this.treeChangeEvent);
-		assertFalse(this.treeClearedCalled);
-
-		this.treeChangeEvent = null;
-		this.treeClearedCalled = false;
-		this.testModel.addTreeChangeListener(TREE_NAME, this);
-		this.testModel.testFireTreeCleared();
-		this.verifyTreeChangeEvent(EMPTY_PATH);
-		assertTrue(this.treeClearedCalled);
-
-		this.treeChangeEvent = null;
-		this.treeClearedCalled = false;
-		this.testModel.removeTreeChangeListener(TREE_NAME, this);
-		this.testModel.testFireTreeCleared();
-		assertNull(this.treeChangeEvent);
-		assertFalse(this.treeClearedCalled);
-	}
-
-	public void testFireTreeChangedObjectArrayPath() {
-		this.treeChangeEvent = null;
-		this.treeChangedCalled = false;
-		this.testModel.addTreeChangeListener(this);
-		this.testModel.testFireTreeChangedObjectArrayPath();
-		this.verifyTreeChangeEvent(OBJECT_ARRAY_PATH);
-		assertTrue(this.treeChangedCalled);
-
-		this.treeChangeEvent = null;
-		this.treeChangedCalled = false;
-		this.testModel.removeTreeChangeListener(this);
-		this.testModel.testFireTreeChangedObjectArrayPath();
-		assertNull(this.treeChangeEvent);
-		assertFalse(this.treeChangedCalled);
-
-		this.treeChangeEvent = null;
-		this.treeChangedCalled = false;
-		this.testModel.addTreeChangeListener(TREE_NAME, this);
-		this.testModel.testFireTreeChangedObjectArrayPath();
-		this.verifyTreeChangeEvent(OBJECT_ARRAY_PATH);
-		assertTrue(this.treeChangedCalled);
-
-		this.treeChangeEvent = null;
-		this.treeChangedCalled = false;
-		this.testModel.removeTreeChangeListener(TREE_NAME, this);
-		this.testModel.testFireTreeChangedObjectArrayPath();
-		assertNull(this.treeChangeEvent);
-		assertFalse(this.treeChangedCalled);
-	}
-
-	public void testHasAnyChangeListeners() {
-		assertFalse(this.testModel.hasAnyPropertyChangeListeners(PROPERTY_NAME));
-		this.testModel.addPropertyChangeListener(this);
-		assertTrue(this.testModel.hasAnyPropertyChangeListeners(PROPERTY_NAME));
-		this.testModel.removePropertyChangeListener(this);
-
-		assertFalse(this.testModel.hasAnyPropertyChangeListeners(PROPERTY_NAME));
-		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this);
-		assertTrue(this.testModel.hasAnyPropertyChangeListeners(PROPERTY_NAME));
-		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this);
-
-		assertFalse(this.testModel.hasAnyCollectionChangeListeners(COLLECTION_NAME));
-		this.testModel.addCollectionChangeListener(this);
-		assertTrue(this.testModel.hasAnyCollectionChangeListeners(COLLECTION_NAME));
-		this.testModel.removeCollectionChangeListener(this);
-
-		assertFalse(this.testModel.hasAnyCollectionChangeListeners(COLLECTION_NAME));
-		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this);
-		assertTrue(this.testModel.hasAnyCollectionChangeListeners(COLLECTION_NAME));
-		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this);
-
-		assertFalse(this.testModel.hasAnyListChangeListeners(LIST_NAME));
-		this.testModel.addListChangeListener(this);
-		assertTrue(this.testModel.hasAnyListChangeListeners(LIST_NAME));
-		this.testModel.removeListChangeListener(this);
-
-		assertFalse(this.testModel.hasAnyListChangeListeners(LIST_NAME));
-		this.testModel.addListChangeListener(LIST_NAME, this);
-		assertTrue(this.testModel.hasAnyListChangeListeners(LIST_NAME));
-		this.testModel.removeListChangeListener(LIST_NAME, this);
-
-		assertFalse(this.testModel.hasAnyTreeChangeListeners(TREE_NAME));
-		this.testModel.addTreeChangeListener(this);
-		assertTrue(this.testModel.hasAnyTreeChangeListeners(TREE_NAME));
-		this.testModel.removeTreeChangeListener(this);
-
-		assertFalse(this.testModel.hasAnyTreeChangeListeners(TREE_NAME));
-		this.testModel.addTreeChangeListener(TREE_NAME, this);
-		assertTrue(this.testModel.hasAnyTreeChangeListeners(TREE_NAME));
-		this.testModel.removeTreeChangeListener(TREE_NAME, this);
-	}
-
-	public void testAttributeValueHasChanged() {
-		this.testModel.testAttributeValueHasChanged();
-	}
-
-	public void testClone() {
-		assertFalse(this.testModel.hasAnyPropertyChangeListeners(PROPERTY_NAME));
-		this.testModel.addPropertyChangeListener(this);
-		assertTrue(this.testModel.hasAnyPropertyChangeListeners(PROPERTY_NAME));
-
-		// verify that the clone does not have any listeners
-		TestModel clone = this.testModel.clone();
-		assertFalse(clone.hasAnyPropertyChangeListeners(PROPERTY_NAME));
-		clone.addPropertyChangeListener(this);
-		assertTrue(clone.hasAnyPropertyChangeListeners(PROPERTY_NAME));
-		// check original
-		assertTrue(this.testModel.hasAnyPropertyChangeListeners(PROPERTY_NAME));
-
-		// now test events fired by original
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		this.testModel.testFirePropertyChangeObjectObject();
-		this.verifyPropertyChangeEvent(OLD_OBJECT_VALUE, NEW_OBJECT_VALUE);
-		assertTrue(this.propertyChangeCalled);
-
-		// now test events fired by clone
-		this.propertyChangeEvent = null;
-		this.propertyChangeCalled = false;
-		clone.testFirePropertyChangeObjectObject();
-		this.verifyPropertyChangeEvent(clone, OLD_OBJECT_VALUE, NEW_OBJECT_VALUE);
-		assertTrue(this.propertyChangeCalled);
-	}
-
-	public void testAddNullStateListener() {
-		boolean exCaught = false;
-		try {
-			this.testModel.addStateChangeListener(null);
-		} catch (NullPointerException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testAddNullPropertyListener() {
-		boolean exCaught = false;
-		try {
-			this.testModel.addPropertyChangeListener(null);
-		} catch (NullPointerException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testAddNullCollectionListener() {
-		boolean exCaught = false;
-		try {
-			this.testModel.addCollectionChangeListener(null);
-		} catch (NullPointerException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testAddNullListListener() {
-		boolean exCaught = false;
-		try {
-			this.testModel.addListChangeListener(null);
-		} catch (NullPointerException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testAddNullTreeListener() {
-		boolean exCaught = false;
-		try {
-			this.testModel.addTreeChangeListener(null);
-		} catch (NullPointerException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testAddNullPropertyListenerName() {
-		boolean exCaught = false;
-		try {
-			this.testModel.addPropertyChangeListener("foo", null);
-		} catch (NullPointerException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testAddNullCollectionListenerName() {
-		boolean exCaught = false;
-		try {
-			this.testModel.addCollectionChangeListener("foo", null);
-		} catch (NullPointerException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testAddNullListListenerName() {
-		boolean exCaught = false;
-		try {
-			this.testModel.addListChangeListener("foo", null);
-		} catch (NullPointerException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testAddNullTreeListenerName() {
-		boolean exCaught = false;
-		try {
-			this.testModel.addTreeChangeListener("foo", null);
-		} catch (NullPointerException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testRemoveBogusStateListener() {
-		boolean exCaught = false;
-		try {
-			this.testModel.removeStateChangeListener(this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addPropertyChangeListener(this);
-		exCaught = false;
-		try {
-			this.testModel.removeStateChangeListener(this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addStateChangeListener(this);
-		exCaught = false;
-		try {
-			this.testModel.removeStateChangeListener(new AbstractModelTests("dummy"));
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testRemoveBogusPropertyListener() {
-		boolean exCaught = false;
-		try {
-			this.testModel.removePropertyChangeListener(this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addCollectionChangeListener(this);
-		exCaught = false;
-		try {
-			this.testModel.removePropertyChangeListener(this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addPropertyChangeListener(this);
-		exCaught = false;
-		try {
-			this.testModel.removePropertyChangeListener(new AbstractModelTests("dummy"));
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testRemoveBogusCollectionListener() {
-		boolean exCaught = false;
-		try {
-			this.testModel.removeCollectionChangeListener(this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addPropertyChangeListener(this);
-		exCaught = false;
-		try {
-			this.testModel.removeCollectionChangeListener(this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addCollectionChangeListener(this);
-		exCaught = false;
-		try {
-			this.testModel.removeCollectionChangeListener(new AbstractModelTests("dummy"));
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testRemoveBogusListListener() {
-		boolean exCaught = false;
-		try {
-			this.testModel.removeListChangeListener(this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addPropertyChangeListener(this);
-		exCaught = false;
-		try {
-			this.testModel.removeListChangeListener(this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addListChangeListener(this);
-		exCaught = false;
-		try {
-			this.testModel.removeListChangeListener(new AbstractModelTests("dummy"));
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testRemoveBogusTreeListener() {
-		boolean exCaught = false;
-		try {
-			this.testModel.removeTreeChangeListener(this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addPropertyChangeListener(this);
-		exCaught = false;
-		try {
-			this.testModel.removeTreeChangeListener(this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addTreeChangeListener(this);
-		exCaught = false;
-		try {
-			this.testModel.removeTreeChangeListener(new AbstractModelTests("dummy"));
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testRemoveBogusPropertyListenerName() {
-		boolean exCaught = false;
-		try {
-			this.testModel.removePropertyChangeListener("foo", this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addCollectionChangeListener("foo", this);
-		exCaught = false;
-		try {
-			this.testModel.removePropertyChangeListener("foo", this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addPropertyChangeListener("foo", this);
-		exCaught = false;
-		try {
-			this.testModel.removePropertyChangeListener("foo", new AbstractModelTests("dummy"));
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testRemoveBogusCollectionListenerName() {
-		boolean exCaught = false;
-		try {
-			this.testModel.removeCollectionChangeListener("foo", this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addPropertyChangeListener("foo", this);
-		exCaught = false;
-		try {
-			this.testModel.removeCollectionChangeListener("foo", this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addCollectionChangeListener("foo", this);
-		exCaught = false;
-		try {
-			this.testModel.removeCollectionChangeListener("foo", new AbstractModelTests("dummy"));
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testRemoveBogusListListenerName() {
-		boolean exCaught = false;
-		try {
-			this.testModel.removeListChangeListener("foo", this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addPropertyChangeListener("foo", this);
-		exCaught = false;
-		try {
-			this.testModel.removeListChangeListener("foo", this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addListChangeListener("foo", this);
-		exCaught = false;
-		try {
-			this.testModel.removeListChangeListener("foo", new AbstractModelTests("dummy"));
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testRemoveBogusTreeListenerName() {
-		boolean exCaught = false;
-		try {
-			this.testModel.removeTreeChangeListener("foo", this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addPropertyChangeListener("foo", this);
-		exCaught = false;
-		try {
-			this.testModel.removeTreeChangeListener("foo", this);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-
-		this.testModel.addTreeChangeListener("foo", this);
-		exCaught = false;
-		try {
-			this.testModel.removeTreeChangeListener("foo", new AbstractModelTests("dummy"));
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testToString() {
-		assertTrue(this.testModel.toString().indexOf(TEST_TO_STRING) != -1);
-	}
-
-// ********** internal methods **********
-
-	private void verifyPropertyChangeEvent(Object oldValue, Object newValue) {
-		this.verifyPropertyChangeEvent(this.testModel, oldValue, newValue);
-	}
-
-	private void verifyPropertyChangeEvent(Object source, Object oldValue, Object newValue) {
-		assertNotNull(this.propertyChangeEvent);
-		assertEquals(source, this.propertyChangeEvent.getSource());
-		assertEquals(PROPERTY_NAME, this.propertyChangeEvent.propertyName());
-		assertEquals(oldValue, this.propertyChangeEvent.oldValue());
-		assertEquals(newValue, this.propertyChangeEvent.newValue());
-	}
-
-	private void verifyCollectionChangeEvent(Object item) {
-		assertNotNull(this.collectionChangeEvent);
-		assertEquals(this.testModel, this.collectionChangeEvent.getSource());
-		assertEquals(COLLECTION_NAME, this.collectionChangeEvent.collectionName());
-		if (item == null) {
-			assertFalse(this.collectionChangeEvent.items().hasNext());
-		} else {
-			assertEquals(item, this.collectionChangeEvent.items().next());
-		}
-	}
-
-	private void verifyListChangeEvent(int index, Object item) {
-		this.verifyListChangeEvent(index, item, null);
-	}
-
-	private void verifyListChangeEvent(int targetIndex, int sourceIndex) {
-		assertNotNull(this.listChangeEvent);
-		assertEquals(this.testModel, this.listChangeEvent.getSource());
-		assertEquals(LIST_NAME, this.listChangeEvent.listName());
-		assertEquals(targetIndex, this.listChangeEvent.targetIndex());
-		assertEquals(sourceIndex, this.listChangeEvent.sourceIndex());
-	}
-
-	private void verifyListChangeEvent(int index, Object item, Object replacedItem) {
-		assertNotNull(this.listChangeEvent);
-		assertEquals(this.testModel, this.listChangeEvent.getSource());
-		assertEquals(LIST_NAME, this.listChangeEvent.listName());
-		assertEquals(index, this.listChangeEvent.index());
-		if (item == null) {
-			assertFalse(this.listChangeEvent.items().hasNext());
-		} else {
-			assertEquals(item, this.listChangeEvent.items().next());
-		}
-		if (replacedItem == null) {
-			assertFalse(this.listChangeEvent.replacedItems().hasNext());
-		} else {
-			assertEquals(replacedItem, this.listChangeEvent.replacedItems().next());
-		}
-	}
-
-	private void verifyTreeChangeEvent(Object[] path) {
-		assertNotNull(this.treeChangeEvent);
-		assertEquals(this.testModel, this.treeChangeEvent.getSource());
-		assertEquals(TREE_NAME, this.treeChangeEvent.treeName());
-		assertTrue(Arrays.equals(path, this.treeChangeEvent.path()));
-	}
-
-// ********** listener implementations **********
-
-	public void stateChanged(StateChangeEvent e) {
-		this.stateChangedCalled = true;
-		this.stateChangeEvent = e;
-	}
-
-	public void propertyChanged(PropertyChangeEvent e) {
-		this.propertyChangeCalled = true;
-		this.propertyChangeEvent = e;
-	}
-
-	public void itemsAdded(CollectionChangeEvent e) {
-		this.itemsAddedCollectionCalled = true;
-		this.collectionChangeEvent = e;
-	}
-	public void itemsRemoved(CollectionChangeEvent e) {
-		this.itemsRemovedCollectionCalled = true;
-		this.collectionChangeEvent = e;
-	}
-	public void collectionCleared(CollectionChangeEvent e) {
-		this.collectionClearedCalled = true;
-		this.collectionChangeEvent = e;
-	}
-	public void collectionChanged(CollectionChangeEvent e) {
-		this.collectionChangedCalled = true;
-		this.collectionChangeEvent = e;
-	}
-
-	public void itemsAdded(ListChangeEvent e) {
-		this.itemsAddedListCalled = true;
-		this.listChangeEvent = e;
-	}
-	public void itemsRemoved(ListChangeEvent e) {
-		this.itemsRemovedListCalled = true;
-		this.listChangeEvent = e;
-	}
-	public void itemsReplaced(ListChangeEvent e) {
-		this.itemsReplacedListCalled = true;
-		this.listChangeEvent = e;
-	}
-	public void itemsMoved(ListChangeEvent e) {
-		this.itemsMovedListCalled = true;
-		this.listChangeEvent = e;
-	}
-	public void listCleared(ListChangeEvent e) {
-		this.listClearedCalled = true;
-		this.listChangeEvent = e;
-	}
-	public void listChanged(ListChangeEvent e) {
-		this.listChangedCalled = true;
-		this.listChangeEvent = e;
-	}
-
-	public void nodeAdded(TreeChangeEvent e) {
-		this.nodeAddedCalled = true;
-		this.treeChangeEvent = e;
-	}
-	public void nodeRemoved(TreeChangeEvent e) {
-		this.nodeRemovedCalled = true;
-		this.treeChangeEvent = e;
-	}
-	public void treeCleared(TreeChangeEvent e) {
-		this.treeClearedCalled = true;
-		this.treeChangeEvent = e;
-	}
-	public void treeChanged(TreeChangeEvent e) {
-		this.treeChangedCalled = true;
-		this.treeChangeEvent = e;
-	}
-
-	// ********** inner class **********
-	
-	private static class TestModel extends AbstractModel implements Cloneable {
-		TestModel() {
-			super();
-		}
-	
-		public void testFireStateChange() {
-			this.fireStateChanged();
-		}
-	
-		public void testFirePropertyChangeObjectObject() {
-			this.firePropertyChanged(PROPERTY_NAME, OLD_OBJECT_VALUE, NEW_OBJECT_VALUE);
-		}
-	
-		public void testFirePropertyChangeObject() {
-			this.firePropertyChanged(PROPERTY_NAME, NEW_OBJECT_VALUE);
-		}
-	
-		public void testFirePropertyChangeIntInt() {
-			this.firePropertyChanged(PROPERTY_NAME, OLD_INT_VALUE.intValue(), NEW_INT_VALUE.intValue());
-		}
-	
-		public void testFirePropertyChangeBooleanBoolean() {
-			this.firePropertyChanged(PROPERTY_NAME, OLD_BOOLEAN_VALUE.booleanValue(), NEW_BOOLEAN_VALUE.booleanValue());
-		}
-	
-		public void testFireItemAddedCollection() {
-			this.fireItemAdded(COLLECTION_NAME, ADDED_OBJECT_VALUE);
-		}
-	
-		public void testFireItemRemovedCollection() {
-			this.fireItemRemoved(COLLECTION_NAME, REMOVED_OBJECT_VALUE);
-		}
-	
-		public void testFireCollectionCleared() {
-			this.fireCollectionCleared(COLLECTION_NAME);
-		}
-	
-		public void testFireCollectionChanged() {
-			this.fireCollectionChanged(COLLECTION_NAME);
-		}
-	
-		public void testFireItemAddedList() {
-			this.fireItemAdded(LIST_NAME, ADD_INDEX, ADDED_OBJECT_VALUE);
-		}
-	
-		public void testFireItemRemovedList() {
-			this.fireItemRemoved(LIST_NAME, REMOVE_INDEX, REMOVED_OBJECT_VALUE);
-		}
-	
-		public void testFireItemReplacedList() {
-			this.fireItemReplaced(LIST_NAME, REPLACE_INDEX, ADDED_OBJECT_VALUE, REMOVED_OBJECT_VALUE);
-		}
-	
-		public void testFireItemMovedList() {
-			this.fireItemMoved(LIST_NAME, TARGET_INDEX, SOURCE_INDEX);
-		}
-	
-		public void testFireListCleared() {
-			this.fireListCleared(LIST_NAME);
-		}
-	
-		public void testFireListChanged() {
-			this.fireListChanged(LIST_NAME);
-		}
-	
-		public void testFireNodeAddedObjectArrayPath() {
-			this.fireNodeAdded(TREE_NAME, OBJECT_ARRAY_PATH);
-		}
-	
-		public void testFireNodeRemovedObjectArrayPath() {
-			this.fireNodeRemoved(TREE_NAME, OBJECT_ARRAY_PATH);
-		}
-	
-		public void testFireTreeCleared() {
-			this.fireTreeCleared(TREE_NAME);
-		}
-	
-		public void testFireTreeChangedObjectArrayPath() {
-			this.fireTreeChanged(TREE_NAME, OBJECT_ARRAY_PATH);
-		}
-	
-		public void testAttributeValueHasChanged() {
-			assertTrue(this.attributeValueHasChanged(null, new Object()));
-			assertTrue(this.attributeValueHasChanged(new Object(), null));
-			assertTrue(this.attributeValueHasChanged(new Object(), new Object()));
-	
-			Object same = new Object();
-			assertFalse(this.attributeValueHasChanged(same, same));
-			assertFalse(this.attributeValueHasChanged(null, null));
-		}
-	
-		@Override
-		public TestModel clone() {
-			try {
-				return (TestModel) super.clone();
-			} catch (CloneNotSupportedException ex) {
-				throw new InternalError();
-			}
-		}
-	
-		@Override
-		public void toString(StringBuffer sb) {
-			sb.append(TEST_TO_STRING);
-		}
-	
-	}
-
-
-	// ********** serialization test **********	
-
-//TODO - This test doesn't pass in the Eclipse build environment for some reason
-//	public void testSerialization() throws IOException, ClassNotFoundException {
-//		LocalModel model1 = new LocalModel();
-//		Foo foo1 = new Foo();
-//		Bar bar1 = new Bar();
-//		Joo joo1 = new Joo();
-//		Jar jar1 = new Jar();
-//		model1.addStateChangeListener(foo1);
-//		model1.addStateChangeListener(bar1);
-//		model1.addListChangeListener(joo1);
-//		model1.addListChangeListener(jar1);
-//
-//		ChangeListener[] listeners1 = this.listeners(model1, StateChangeListener.class);
-//		assertEquals(2, listeners1.length);
-//		// the order of these could change...
-//		assertEquals(Foo.class, listeners1[0].getClass());
-//		assertEquals(Bar.class, listeners1[1].getClass());
-//
-//		listeners1 = this.listeners(model1, ListChangeListener.class);
-//		assertEquals(2, listeners1.length);
-//		// the order of these could change...
-//		assertEquals(Joo.class, listeners1[0].getClass());
-//		assertEquals(Jar.class, listeners1[1].getClass());
-//
-//		LocalModel model2 = TestTools.serialize(model1);
-//
-//		ChangeListener[] listeners2 = this.listeners(model2, StateChangeListener.class);
-//		assertEquals(1, listeners2.length);
-//		assertEquals(Foo.class, listeners2[0].getClass());
-//
-//		listeners2 = this.listeners(model2, ListChangeListener.class);
-//		assertEquals(1, listeners2.length);
-//		assertEquals(Joo.class, listeners2[0].getClass());
-//	}
-
-	private ChangeListener[] listeners(LocalModel model, Class<? extends ChangeListener> listenerClass) {
-		ChangeSupport changeSupport = (ChangeSupport) ClassTools.getFieldValue(model, "changeSupport");
-		return (ChangeListener[]) ClassTools.executeMethod(changeSupport, "listeners", Class.class, listenerClass);
-	}
-
-	private static class LocalModel extends AbstractModel implements Serializable {
-		LocalModel() {
-			super();
-		}
-	}
-
-	private static class Foo implements Serializable, StateChangeListener {
-		Foo() {
-			super();
-		}
-		public void stateChanged(StateChangeEvent event) {
-			// do nothing
-		}
-	}
-
-	private static class Bar implements StateChangeListener {
-		Bar() {
-			super();
-		}
-		public void stateChanged(StateChangeEvent event) {
-			// do nothing
-		}
-	}
-
-	private static class Joo extends ListChangeAdapter implements Serializable {
-//		private static final ObjectStreamField[] serialPersistentFields = {new ObjectStreamField("changeSupport", ChangeSupport.class)};
-		Joo() {
-			super();
-		}
-	}
-
-	private static class Jar extends ListChangeAdapter {
-		Jar() {
-			super();
-		}
-	}
-
-
-	// ********** bug(?) test **********	
-
-	private static final String ISE_MESSAGE = "this object is no longer listening to localA";
-
-	/**
-	 * Test the following situation:
-	 * 	- both B and C are listening to A
-	 * 	- C is also listening to B
-	 * 	- when B receives an event from A, it will fire an event to C
-	 * 	- when C receives an event from B, it will STOP listening to A
-	 * 	- the event from B to C may be preceded or followed (depending on
-	 * 		the hash positions of listeners) by an event from A to C:
-	 * 		- if the A to C event comes first, no problem
-	 * 		- but if the A to B event comes first, the A to C event should NOT happen
-	 */
-	public void testIndirectRemoveStateListener() {
-		this.verifyIndirectRemoveListener(
-			new NotifyCommand() {
-				public void notifyListeners(LocalA localA) {
-					localA.notifyStateListeners();
-				}
-			}
-		);
-	}
-
-	public void testIndirectRemovePropertyListener() {
-		this.verifyIndirectRemoveListener(
-			new NotifyCommand() {
-				public void notifyListeners(LocalA localA) {
-					localA.notifyPropertyListeners();
-				}
-			}
-		);
-	}
-
-	public void testIndirectRemoveCollectionListener() {
-		this.verifyIndirectRemoveListener(
-			new NotifyCommand() {
-				public void notifyListeners(LocalA localA) {
-					localA.notifyCollectionListeners();
-				}
-			}
-		);
-	}
-
-	public void testIndirectRemoveListListener() {
-		this.verifyIndirectRemoveListener(
-			new NotifyCommand() {
-				public void notifyListeners(LocalA localA) {
-					localA.notifyListListeners();
-				}
-			}
-		);
-	}
-
-	public void testIndirectRemoveTreeListener() {
-		this.verifyIndirectRemoveListener(
-			new NotifyCommand() {
-				public void notifyListeners(LocalA localA) {
-					localA.notifyTreeListeners();
-				}
-			}
-		);
-	}
-
-	public void verifyIndirectRemoveListener(NotifyCommand command) {
-		LocalA localA = new LocalA();
-		LocalB localB = new LocalB(localA);
-
-		// build a bunch of LocalCs so at least one of them is notified AFTER the LocalB;
-		// using 1000 seemed to fail very consistently before ChangeSupport was fixed
-		LocalC[] localCs = new LocalC[1000];
-		for (int i = localCs.length; i-- > 0; ) {
-			localCs[i] = new LocalC(localA, localB);
-		}
-
-		boolean exCaught = false;
-		try {
-			command.notifyListeners(localA);
-		} catch (IllegalStateException ex) {
-			if (ex.getMessage() == ISE_MESSAGE) {
-				exCaught = true;
-			} else {
-				throw ex;
-			}
-		}
-		assertFalse(exCaught);
-
-		for (int i = localCs.length; i-- > 0; ) {
-			assertFalse(localCs[i].isListeningToLocalA());
-		}
-	}
-
-	private interface NotifyCommand {
-		void notifyListeners(LocalA localA);
-	}
-
-	/**
-	 * This object simply fires a state change event. Both LocalB and LocalC
-	 * will be listeners.
-	 */
-	private static class LocalA extends AbstractModel {
-		LocalA() {
-			super();
-		}
-		void notifyStateListeners() {
-			this.fireStateChanged();
-		}
-		void notifyPropertyListeners() {
-			this.firePropertyChanged("foo", 1, 2);
-		}
-		void notifyCollectionListeners() {
-			this.fireCollectionChanged("foo");
-		}
-		void notifyListListeners() {
-			this.fireListChanged("foo");
-		}
-		void notifyTreeListeners() {
-			this.fireTreeChanged("foo");
-		}
-	}
-
-	/**
-	 * This object will fire state change events whenever it receives
-	 * a state change event from localA.
-	 */
-	private static class LocalB
-		extends AbstractModel
-		implements StateChangeListener, PropertyChangeListener, CollectionChangeListener, ListChangeListener, TreeChangeListener
-	{
-		LocalB(LocalA localA) {
-			super();
-			localA.addStateChangeListener(this);
-			localA.addPropertyChangeListener(this);
-			localA.addCollectionChangeListener(this);
-			localA.addListChangeListener(this);
-			localA.addTreeChangeListener(this);
-		}
-
-		public void stateChanged(StateChangeEvent e) {
-			this.fireStateChanged();
-		}
-
-		public void propertyChanged(PropertyChangeEvent evt) {
-			this.firePropertyChanged("bar", 1, 2);
-		}
-
-		public void collectionChanged(CollectionChangeEvent e) {
-			this.fireCollectionChanged("bar");
-		}
-		public void collectionCleared(CollectionChangeEvent e) {/*ignore*/}
-		public void itemsAdded(CollectionChangeEvent e) {/*ignore*/}
-		public void itemsRemoved(CollectionChangeEvent e) {/*ignore*/}
-
-		public void listChanged(ListChangeEvent e) {
-			this.fireListChanged("bar");
-		}
-		public void listCleared(ListChangeEvent e) {/*ignore*/}
-		public void itemsAdded(ListChangeEvent e) {/*ignore*/}
-		public void itemsRemoved(ListChangeEvent e) {/*ignore*/}
-		public void itemsReplaced(ListChangeEvent e) {/*ignore*/}
-		public void itemsMoved(ListChangeEvent e) {/*ignore*/}
-
-		public void treeChanged(TreeChangeEvent e) {
-			this.fireTreeChanged("bar");
-		}
-		public void treeCleared(TreeChangeEvent e) {/*ignore*/}
-		public void nodeAdded(TreeChangeEvent e) {/*ignore*/}
-		public void nodeRemoved(TreeChangeEvent e) {/*ignore*/}
-
-	}
-
-	/**
-	 * This object will listen to two other objects, localA and localB.
-	 * If this object receives notification from localB, it will stop listening to
-	 * localA. If this object receives notification from localA, it will check to
-	 * see whether it still listening to localA. If this object is no longer
-	 * listening to localA, it will complain about receiving the event and
-	 * throw an exception.
-	 */
-	private static class LocalC
-		extends AbstractModel
-		implements StateChangeListener, PropertyChangeListener, CollectionChangeListener, ListChangeListener, TreeChangeListener
-	{
-		private LocalA localA;
-		private LocalB localB;
-		private boolean listeningToLocalA;
-
-		LocalC(LocalA localA, LocalB localB) {
-			super();
-			this.localA = localA;
-			this.localB = localB;
-
-			localA.addStateChangeListener(this);
-			localA.addPropertyChangeListener(this);
-			localA.addCollectionChangeListener(this);
-			localA.addListChangeListener(this);
-			localA.addTreeChangeListener(this);
-			this.listeningToLocalA = true;
-
-			localB.addStateChangeListener(this);
-			localB.addPropertyChangeListener(this);
-			localB.addCollectionChangeListener(this);
-			localB.addListChangeListener(this);
-			localB.addTreeChangeListener(this);
-		}
-		boolean isListeningToLocalA() {
-			return this.listeningToLocalA;
-		}
-
-		public void stateChanged(StateChangeEvent e) {
-			Object source = e.getSource();
-			if (source == this.localA) {
-				if ( ! this.listeningToLocalA) {
-					throw new IllegalStateException(ISE_MESSAGE);
-				}
-			} else if (source == this.localB) {
-				this.localA.removeStateChangeListener(this);
-				this.listeningToLocalA = false;
-			} else {
-				throw new IllegalStateException("bogus event source: " + source);
-			}
-		}
-
-		public void propertyChanged(PropertyChangeEvent e) {
-			Object source = e.getSource();
-			if (source == this.localA) {
-				if ( ! this.listeningToLocalA) {
-					throw new IllegalStateException(ISE_MESSAGE);
-				}
-			} else if (source == this.localB) {
-				this.localA.removePropertyChangeListener(this);
-				this.listeningToLocalA = false;
-			} else {
-				throw new IllegalStateException("bogus event source: " + source);
-			}
-		}
-
-		public void collectionChanged(CollectionChangeEvent e) {
-			Object source = e.getSource();
-			if (source == this.localA) {
-				if ( ! this.listeningToLocalA) {
-					throw new IllegalStateException(ISE_MESSAGE);
-				}
-			} else if (source == this.localB) {
-				this.localA.removeCollectionChangeListener(this);
-				this.listeningToLocalA = false;
-			} else {
-				throw new IllegalStateException("bogus event source: " + source);
-			}
-		}
-		public void collectionCleared(CollectionChangeEvent e) {/*ignore*/}
-		public void itemsAdded(CollectionChangeEvent e) {/*ignore*/}
-		public void itemsRemoved(CollectionChangeEvent e) {/*ignore*/}
-
-		public void listChanged(ListChangeEvent e) {
-			Object source = e.getSource();
-			if (source == this.localA) {
-				if ( ! this.listeningToLocalA) {
-					throw new IllegalStateException(ISE_MESSAGE);
-				}
-			} else if (source == this.localB) {
-				this.localA.removeListChangeListener(this);
-				this.listeningToLocalA = false;
-			} else {
-				throw new IllegalStateException("bogus event source: " + source);
-			}
-		}
-		public void listCleared(ListChangeEvent e) {/*ignore*/}
-		public void itemsAdded(ListChangeEvent e) {/*ignore*/}
-		public void itemsRemoved(ListChangeEvent e) {/*ignore*/}
-		public void itemsReplaced(ListChangeEvent e) {/*ignore*/}
-		public void itemsMoved(ListChangeEvent e) {/*ignore*/}
-
-		public void treeChanged(TreeChangeEvent e) {
-			Object source = e.getSource();
-			if (source == this.localA) {
-				if ( ! this.listeningToLocalA) {
-					throw new IllegalStateException(ISE_MESSAGE);
-				}
-			} else if (source == this.localB) {
-				this.localA.removeTreeChangeListener(this);
-				this.listeningToLocalA = false;
-			} else {
-				throw new IllegalStateException("bogus event source: " + source);
-			}
-		}
-		public void treeCleared(TreeChangeEvent e) {/*ignore*/}
-		public void nodeAdded(TreeChangeEvent e) {/*ignore*/}
-		public void nodeRemoved(TreeChangeEvent e) {/*ignore*/}
-
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/JptUtilityModelTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/JptUtilityModelTests.java
deleted file mode 100644
index f01366a..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/JptUtilityModelTests.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal.model;
-
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.tests.internal.model.listener.JptUtilityModelListenerTests;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class JptUtilityModelTests {
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ClassTools.packageNameFor(JptUtilityModelTests.class));
-
-		suite.addTest(JptUtilityModelListenerTests.suite());
-		suite.addTestSuite(AbstractModelTests.class);
-
-		return suite;
-	}
-
-	private JptUtilityModelTests() {
-		super();
-		throw new UnsupportedOperationException();
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/JptUtilityModelListenerTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/JptUtilityModelListenerTests.java
deleted file mode 100644
index 1a3b559..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/JptUtilityModelListenerTests.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal.model.listener;
-
-import org.eclipse.jpt.utility.internal.ClassTools;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class JptUtilityModelListenerTests {
-	
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ClassTools.packageNameFor(JptUtilityModelListenerTests.class));
-
-		suite.addTestSuite(ReflectiveCollectionChangeListenerTests.class);
-		suite.addTestSuite(ReflectiveListChangeListenerTests.class);
-		suite.addTestSuite(ReflectivePropertyChangeListenerTests.class);
-		suite.addTestSuite(ReflectiveStateChangeListenerTests.class);
-		suite.addTestSuite(ReflectiveTreeChangeListenerTests.class);
-	
-		return suite;
-	}
-	
-	private JptUtilityModelListenerTests() {
-		super();
-		throw new UnsupportedOperationException();
-	}
-	
-}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectiveCollectionChangeListenerTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectiveCollectionChangeListenerTests.java
deleted file mode 100644
index a60f0b5..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectiveCollectionChangeListenerTests.java
+++ /dev/null
@@ -1,455 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal.model.listener;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.internal.CollectionTools;
-import org.eclipse.jpt.utility.internal.iterators.CloneIterator;
-import org.eclipse.jpt.utility.internal.model.AbstractModel;
-import org.eclipse.jpt.utility.internal.model.event.CollectionChangeEvent;
-import org.eclipse.jpt.utility.internal.model.listener.CollectionChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ListChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ReflectiveChangeListener;
-
-import junit.framework.TestCase;
-
-public class ReflectiveCollectionChangeListenerTests extends TestCase {
-	
-	public ReflectiveCollectionChangeListenerTests(String name) {
-		super(name);
-	}
-
-	private CollectionChangeListener buildZeroArgumentListener(Object target) {
-		return ReflectiveChangeListener.buildCollectionChangeListener(target, "itemAddedZeroArgument", "itemRemovedZeroArgument", "collectionClearedZeroArgument", "collectionChangedZeroArgument");
-	}
-
-	private CollectionChangeListener buildSingleArgumentListener(Object target) {
-		return ReflectiveChangeListener.buildCollectionChangeListener(target, "itemAddedSingleArgument", "itemRemovedSingleArgument", "collectionClearedSingleArgument", "collectionChangedSingleArgument");
-	}
-
-	public void testItemAddedZeroArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(this.buildZeroArgumentListener(target));
-		testModel.addString(string);
-		assertTrue(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.collectionClearedZeroArgumentFlag);
-		assertFalse(target.collectionClearedSingleArgumentFlag);
-		assertFalse(target.collectionChangedZeroArgumentFlag);
-		assertFalse(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testItemAddedZeroArgumentNamedCollection() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildZeroArgumentListener(target));
-		testModel.addString(string);
-		assertTrue(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.collectionClearedZeroArgumentFlag);
-		assertFalse(target.collectionClearedSingleArgumentFlag);
-		assertFalse(target.collectionChangedZeroArgumentFlag);
-		assertFalse(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testItemAddedSingleArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(this.buildSingleArgumentListener(target));
-		testModel.addString(string);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertTrue(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.collectionClearedZeroArgumentFlag);
-		assertFalse(target.collectionClearedSingleArgumentFlag);
-		assertFalse(target.collectionChangedZeroArgumentFlag);
-		assertFalse(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testItemAddedSingleArgumentNamedCollection() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildSingleArgumentListener(target));
-		testModel.addString(string);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertTrue(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.collectionClearedZeroArgumentFlag);
-		assertFalse(target.collectionClearedSingleArgumentFlag);
-		assertFalse(target.collectionChangedZeroArgumentFlag);
-		assertFalse(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testItemRemovedZeroArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(this.buildZeroArgumentListener(target));
-		testModel.removeString(string);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertTrue(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.collectionClearedZeroArgumentFlag);
-		assertFalse(target.collectionClearedSingleArgumentFlag);
-		assertFalse(target.collectionChangedZeroArgumentFlag);
-		assertFalse(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testItemRemovedZeroArgumentNamedCollection() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildZeroArgumentListener(target));
-		testModel.removeString(string);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertTrue(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.collectionClearedZeroArgumentFlag);
-		assertFalse(target.collectionClearedSingleArgumentFlag);
-		assertFalse(target.collectionChangedZeroArgumentFlag);
-		assertFalse(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testItemRemovedSingleArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(this.buildSingleArgumentListener(target));
-		testModel.removeString(string);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertTrue(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.collectionClearedZeroArgumentFlag);
-		assertFalse(target.collectionClearedSingleArgumentFlag);
-		assertFalse(target.collectionChangedZeroArgumentFlag);
-		assertFalse(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testItemRemovedSingleArgumentNamedCollection() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildSingleArgumentListener(target));
-		testModel.removeString(string);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertTrue(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.collectionClearedZeroArgumentFlag);
-		assertFalse(target.collectionClearedSingleArgumentFlag);
-		assertFalse(target.collectionChangedZeroArgumentFlag);
-		assertFalse(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testCollectionClearedZeroArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(this.buildZeroArgumentListener(target));
-		testModel.clearStrings();
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertTrue(target.collectionClearedZeroArgumentFlag);
-		assertFalse(target.collectionClearedSingleArgumentFlag);
-		assertFalse(target.collectionChangedZeroArgumentFlag);
-		assertFalse(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testCollectionClearedZeroArgumentNamedCollection() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildZeroArgumentListener(target));
-		testModel.clearStrings();
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertTrue(target.collectionClearedZeroArgumentFlag);
-		assertFalse(target.collectionClearedSingleArgumentFlag);
-		assertFalse(target.collectionChangedZeroArgumentFlag);
-		assertFalse(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testCollectionClearedSingleArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(this.buildSingleArgumentListener(target));
-		testModel.clearStrings();
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.collectionClearedZeroArgumentFlag);
-		assertTrue(target.collectionClearedSingleArgumentFlag);
-		assertFalse(target.collectionChangedZeroArgumentFlag);
-		assertFalse(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testCollectionClearedSingleArgumentNamedCollection() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildSingleArgumentListener(target));
-		testModel.clearStrings();
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.collectionClearedZeroArgumentFlag);
-		assertTrue(target.collectionClearedSingleArgumentFlag);
-		assertFalse(target.collectionChangedZeroArgumentFlag);
-		assertFalse(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testCollectionChangedZeroArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(this.buildZeroArgumentListener(target));
-		testModel.replaceStrings(new String[] {"bar", "baz"});
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.collectionClearedZeroArgumentFlag);
-		assertFalse(target.collectionClearedSingleArgumentFlag);
-		assertTrue(target.collectionChangedZeroArgumentFlag);
-		assertFalse(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testCollectionChangedZeroArgumentNamedCollection() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildZeroArgumentListener(target));
-		testModel.replaceStrings(new String[] {"bar", "baz"});
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.collectionClearedZeroArgumentFlag);
-		assertFalse(target.collectionClearedSingleArgumentFlag);
-		assertTrue(target.collectionChangedZeroArgumentFlag);
-		assertFalse(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testCollectionChangedSingleArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(this.buildSingleArgumentListener(target));
-		testModel.replaceStrings(new String[] {"bar", "baz"});
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.collectionClearedZeroArgumentFlag);
-		assertFalse(target.collectionClearedSingleArgumentFlag);
-		assertFalse(target.collectionChangedZeroArgumentFlag);
-		assertTrue(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testCollectionChangedSingleArgumentNamedCollection() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildSingleArgumentListener(target));
-		testModel.replaceStrings(new String[] {"bar", "baz"});
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.collectionClearedZeroArgumentFlag);
-		assertFalse(target.collectionClearedSingleArgumentFlag);
-		assertFalse(target.collectionChangedZeroArgumentFlag);
-		assertTrue(target.collectionChangedSingleArgumentFlag);
-	}
-
-	public void testBogusDoubleArgument1() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		boolean exCaught = false;
-		try {
-			CollectionChangeListener listener = ReflectiveChangeListener.buildCollectionChangeListener(target, "collectionChangedDoubleArgument");
-			fail("bogus listener: " + listener);
-		} catch (RuntimeException ex) {
-			if (ex.getCause().getClass() == NoSuchMethodException.class) {
-				exCaught = true;
-			}
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testBogusDoubleArgument2() throws Exception {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		Method method = ClassTools.method(target, "collectionChangedDoubleArgument", new Class[] {CollectionChangeEvent.class, Object.class});
-		boolean exCaught = false;
-		try {
-			CollectionChangeListener listener = ReflectiveChangeListener.buildCollectionChangeListener(target, method);
-			fail("bogus listener: " + listener);
-		} catch (RuntimeException ex) {
-			if (ex.getMessage().equals(method.toString())) {
-				exCaught = true;
-			}
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testListenerMismatch() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
-		// build a COLLECTION change listener and hack it so we
-		// can add it as a LIST change listener
-		Object listener = ReflectiveChangeListener.buildCollectionChangeListener(target, "itemAddedSingleArgument");
-		testModel.addListChangeListener((ListChangeListener) listener);
-
-		boolean exCaught = false;
-		try {
-			testModel.changeList();
-			fail("listener mismatch: " + listener);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-
-	private class TestModel extends AbstractModel {
-		private Collection<String> strings = new ArrayList<String>();
-			public static final String STRINGS_COLLECTION = "strings";
-		TestModel() {
-			super();
-		}
-		Iterator<String> strings() {
-			return new CloneIterator<String>(this.strings) {
-				@Override
-				protected void remove(String s) {
-					TestModel.this.removeString(s);
-				}
-			};
-		}
-		void addString(String string) {
-			this.addItemToCollection(string, this.strings, STRINGS_COLLECTION);
-		}
-		void removeString(String string) {
-			this.removeItemFromCollection(string, this.strings, STRINGS_COLLECTION);
-		}
-		void clearStrings() {
-			this.clearCollection(this.strings, STRINGS_COLLECTION);
-		}
-		void replaceStrings(String[] newStrings) {
-			this.strings.clear();
-			CollectionTools.addAll(this.strings, newStrings);
-			this.fireCollectionChanged(STRINGS_COLLECTION);
-		}
-		void changeList() {
-			this.fireListChanged("bogus list");
-		}
-	}
-
-	private class Target {
-		TestModel testModel;
-		String collectionName;
-		String string;
-		boolean itemAddedZeroArgumentFlag = false;
-		boolean itemAddedSingleArgumentFlag = false;
-		boolean itemRemovedZeroArgumentFlag = false;
-		boolean itemRemovedSingleArgumentFlag = false;
-		boolean collectionClearedZeroArgumentFlag = false;
-		boolean collectionClearedSingleArgumentFlag = false;
-		boolean collectionChangedZeroArgumentFlag = false;
-		boolean collectionChangedSingleArgumentFlag = false;
-		Target(TestModel testModel, String collectionName, String string) {
-			super();
-			this.testModel = testModel;
-			this.collectionName = collectionName;
-			this.string = string;
-		}
-		void itemAddedZeroArgument() {
-			this.itemAddedZeroArgumentFlag = true;
-		}
-		void itemAddedSingleArgument(CollectionChangeEvent e) {
-			this.itemAddedSingleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.collectionName, e.collectionName());
-			assertEquals(this.string, e.items().next());
-		}
-		void itemRemovedZeroArgument() {
-			this.itemRemovedZeroArgumentFlag = true;
-		}
-		void itemRemovedSingleArgument(CollectionChangeEvent e) {
-			this.itemRemovedSingleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.collectionName, e.collectionName());
-			assertEquals(this.string, e.items().next());
-		}
-		void collectionClearedZeroArgument() {
-			this.collectionClearedZeroArgumentFlag = true;
-		}
-		void collectionClearedSingleArgument(CollectionChangeEvent e) {
-			this.collectionClearedSingleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.collectionName, e.collectionName());
-			assertFalse(e.items().hasNext());
-		}
-		void collectionChangedZeroArgument() {
-			this.collectionChangedZeroArgumentFlag = true;
-		}
-		void collectionChangedSingleArgument(CollectionChangeEvent e) {
-			this.collectionChangedSingleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.collectionName, e.collectionName());
-			assertFalse(e.items().hasNext());
-		}
-		void collectionChangedDoubleArgument(CollectionChangeEvent e, Object o) {
-			fail("bogus event: " + e);
-		}
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectiveListChangeListenerTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectiveListChangeListenerTests.java
deleted file mode 100644
index ea8b980..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectiveListChangeListenerTests.java
+++ /dev/null
@@ -1,744 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal.model.listener;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.internal.CollectionTools;
-import org.eclipse.jpt.utility.internal.iterators.CloneListIterator;
-import org.eclipse.jpt.utility.internal.model.AbstractModel;
-import org.eclipse.jpt.utility.internal.model.event.ListChangeEvent;
-import org.eclipse.jpt.utility.internal.model.listener.CollectionChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ListChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ReflectiveChangeListener;
-
-import junit.framework.TestCase;
-
-public class ReflectiveListChangeListenerTests extends TestCase {
-	
-	public ReflectiveListChangeListenerTests(String name) {
-		super(name);
-	}
-
-	private ListChangeListener buildZeroArgumentListener(Object target) {
-		return ReflectiveChangeListener.buildListChangeListener(target, "itemAddedZeroArgument", "itemRemovedZeroArgument", "itemReplacedZeroArgument", "itemMovedZeroArgument", "listClearedZeroArgument", "listChangedZeroArgument");
-	}
-
-	private ListChangeListener buildSingleArgumentListener(Object target) {
-		return ReflectiveChangeListener.buildListChangeListener(target, "itemAddedSingleArgument", "itemRemovedSingleArgument", "itemReplacedSingleArgument", "itemMovedSingleArgument", "listClearedSingleArgument", "listChangedSingleArgument");
-	}
-
-	public void testItemAddedZeroArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
-		testModel.addListChangeListener(this.buildZeroArgumentListener(target));
-		testModel.addString(string);
-		assertTrue(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemAddedZeroArgumentNamedList() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
-		testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target));
-		testModel.addString(string);
-		assertTrue(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemAddedSingleArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
-		testModel.addListChangeListener(this.buildSingleArgumentListener(target));
-		testModel.addString(string);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertTrue(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemAddedSingleArgumentNamedList() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
-		testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target));
-		testModel.addString(string);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertTrue(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemRemovedZeroArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
-		testModel.addListChangeListener(this.buildZeroArgumentListener(target));
-		testModel.removeString(string);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertTrue(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemRemovedZeroArgumentNamedList() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
-		testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target));
-		testModel.removeString(string);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertTrue(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemRemovedSingleArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
-		testModel.addListChangeListener(this.buildSingleArgumentListener(target));
-		testModel.removeString(string);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertTrue(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemRemovedSingleArgumentNamedList() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
-		testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target));
-		testModel.removeString(string);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertTrue(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemReplacedZeroArgument() {
-		TestModel testModel = new TestModel();
-		String oldString = "foo";
-		String newString = "bar";
-		testModel.addString(oldString);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, newString, 0, oldString);
-		testModel.addListChangeListener(this.buildZeroArgumentListener(target));
-		testModel.replaceString(oldString, newString);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertTrue(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemReplacedZeroArgumentNamedList() {
-		TestModel testModel = new TestModel();
-		String oldString = "foo";
-		String newString = "bar";
-		testModel.addString(oldString);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, newString, 0, oldString);
-		testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target));
-		testModel.replaceString(oldString, newString);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertTrue(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemReplacedSingleArgument() {
-		TestModel testModel = new TestModel();
-		String oldString = "foo";
-		String newString = "bar";
-		testModel.addString(oldString);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, newString, 0, oldString);
-		testModel.addListChangeListener(this.buildSingleArgumentListener(target));
-		testModel.replaceString(oldString, newString);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertTrue(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemReplacedSingleArgumentNamedList() {
-		TestModel testModel = new TestModel();
-		String oldString = "foo";
-		String newString = "bar";
-		testModel.addString(oldString);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, newString, 0, oldString);
-		testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target));
-		testModel.replaceString(oldString, newString);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertTrue(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemMovedZeroArgument() {
-		TestModel testModel = new TestModel();
-		testModel.addString("zero");
-		testModel.addString("one");
-		testModel.addString("two");
-		testModel.addString("three");
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, 0, 2);
-		testModel.addListChangeListener(this.buildZeroArgumentListener(target));
-		testModel.moveString(0, 2);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertTrue(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemMovedZeroArgumentNamedList() {
-		TestModel testModel = new TestModel();
-		testModel.addString("zero");
-		testModel.addString("one");
-		testModel.addString("two");
-		testModel.addString("three");
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, 0, 2);
-		testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target));
-		testModel.moveString(0, 2);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertTrue(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemMovedSingleArgument() {
-		TestModel testModel = new TestModel();
-		testModel.addString("zero");
-		testModel.addString("one");
-		testModel.addString("two");
-		testModel.addString("three");
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, 0, 2);
-		testModel.addListChangeListener(this.buildSingleArgumentListener(target));
-		testModel.moveString(0, 2);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertTrue(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testItemMovedSingleArgumentNamedList() {
-		TestModel testModel = new TestModel();
-		testModel.addString("zero");
-		testModel.addString("one");
-		testModel.addString("two");
-		testModel.addString("three");
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, 0, 2);
-		testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target));
-		testModel.moveString(0, 2);
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertTrue(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testListClearedZeroArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1);
-		testModel.addListChangeListener(this.buildZeroArgumentListener(target));
-		testModel.clearStrings();
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertTrue(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testListClearedZeroArgumentNamedList() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1);
-		testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target));
-		testModel.clearStrings();
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertTrue(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testListClearedSingleArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1);
-		testModel.addListChangeListener(this.buildSingleArgumentListener(target));
-		testModel.clearStrings();
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertTrue(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testListClearedSingleArgumentNamedList() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1);
-		testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target));
-		testModel.clearStrings();
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertTrue(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testListChangedZeroArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1);
-		testModel.addListChangeListener(this.buildZeroArgumentListener(target));
-		testModel.replaceAllStrings(new String[] {"bar", "baz"});
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertTrue(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testListChangedZeroArgumentNamedList() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1);
-		testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target));
-		testModel.replaceAllStrings(new String[] {"bar", "baz"});
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertTrue(target.listChangedZeroArgumentFlag);
-		assertFalse(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testListChangedSingleArgument() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1);
-		testModel.addListChangeListener(this.buildSingleArgumentListener(target));
-		testModel.replaceAllStrings(new String[] {"bar", "baz"});
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertTrue(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testListChangedSingleArgumentNamedList() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		testModel.addString(string);
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1);
-		testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target));
-		testModel.replaceAllStrings(new String[] {"bar", "baz"});
-		assertFalse(target.itemAddedZeroArgumentFlag);
-		assertFalse(target.itemAddedSingleArgumentFlag);
-		assertFalse(target.itemRemovedZeroArgumentFlag);
-		assertFalse(target.itemRemovedSingleArgumentFlag);
-		assertFalse(target.itemReplacedZeroArgumentFlag);
-		assertFalse(target.itemReplacedSingleArgumentFlag);
-		assertFalse(target.itemMovedZeroArgumentFlag);
-		assertFalse(target.itemMovedSingleArgumentFlag);
-		assertFalse(target.listClearedZeroArgumentFlag);
-		assertFalse(target.listClearedSingleArgumentFlag);
-		assertFalse(target.listChangedZeroArgumentFlag);
-		assertTrue(target.listChangedSingleArgumentFlag);
-	}
-
-	public void testBogusDoubleArgument1() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
-		boolean exCaught = false;
-		try {
-			ListChangeListener listener = ReflectiveChangeListener.buildListChangeListener(target, "listChangedDoubleArgument");
-			fail("bogus listener: " + listener);
-		} catch (RuntimeException ex) {
-			if (ex.getCause().getClass() == NoSuchMethodException.class) {
-				exCaught = true;
-			}
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testBogusDoubleArgument2() throws Exception {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
-		Method method = ClassTools.method(target, "listChangedDoubleArgument", new Class[] {ListChangeEvent.class, Object.class});
-		boolean exCaught = false;
-		try {
-			ListChangeListener listener = ReflectiveChangeListener.buildListChangeListener(target, method);
-			fail("bogus listener: " + listener);
-		} catch (RuntimeException ex) {
-			if (ex.getMessage().equals(method.toString())) {
-				exCaught = true;
-			}
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testListenerMismatch() {
-		TestModel testModel = new TestModel();
-		String string = "foo";
-		Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
-		// build a LIST change listener and hack it so we
-		// can add it as a COLLECTION change listener
-		Object listener = ReflectiveChangeListener.buildListChangeListener(target, "itemAddedSingleArgument");
-		testModel.addCollectionChangeListener((CollectionChangeListener) listener);
-
-		boolean exCaught = false;
-		try {
-			testModel.changeCollection();
-			fail("listener mismatch: " + listener);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-
-	private class TestModel extends AbstractModel {
-		private List<String> strings = new ArrayList<String>();
-			public static final String STRINGS_LIST = "strings";
-		TestModel() {
-			super();
-		}
-		ListIterator<String> strings() {
-			return new CloneListIterator<String>(this.strings);
-		}
-		void addString(String string) {
-			this.addItemToList(string, this.strings, STRINGS_LIST);
-		}
-		void removeString(String string) {
-			this.removeItemFromList(this.strings.indexOf(string), this.strings, STRINGS_LIST);
-		}
-		void replaceString(String oldString, String newString) {
-			this.setItemInList(this.strings.indexOf(oldString), newString, this.strings, STRINGS_LIST);
-		}
-		void moveString(int targetIndex, int sourceIndex) {
-			this.moveItemInList(targetIndex, sourceIndex, this.strings, STRINGS_LIST);
-		}
-		void clearStrings() {
-			this.clearList(this.strings, STRINGS_LIST);
-		}
-		void replaceAllStrings(String[] newStrings) {
-			this.strings.clear();
-			CollectionTools.addAll(this.strings, newStrings);
-			this.fireListChanged(STRINGS_LIST);
-		}
-		void changeCollection() {
-			this.fireCollectionChanged("bogus collection");
-		}
-	}
-
-	private class Target {
-		TestModel testModel;
-		String listName;
-		String string;
-		int index;
-		String replacedString;
-		int sourceIndex;
-		boolean itemAddedZeroArgumentFlag = false;
-		boolean itemAddedSingleArgumentFlag = false;
-		boolean itemRemovedZeroArgumentFlag = false;
-		boolean itemRemovedSingleArgumentFlag = false;
-		boolean itemReplacedZeroArgumentFlag = false;
-		boolean itemReplacedSingleArgumentFlag = false;
-		boolean itemMovedZeroArgumentFlag = false;
-		boolean itemMovedSingleArgumentFlag = false;
-		boolean listClearedZeroArgumentFlag = false;
-		boolean listClearedSingleArgumentFlag = false;
-		boolean listChangedZeroArgumentFlag = false;
-		boolean listChangedSingleArgumentFlag = false;
-		Target(TestModel testModel, String listName, String string, int index) {
-			super();
-			this.testModel = testModel;
-			this.listName = listName;
-			this.string = string;
-			this.index = index;
-		}
-		Target(TestModel testModel, String listName, String string, int index, String replacedString) {
-			this(testModel, listName, string, index);
-			this.replacedString = replacedString;
-		}
-		Target(TestModel testModel, String listName, int targetIndex, int sourceIndex) {
-			super();
-			this.testModel = testModel;
-			this.listName = listName;
-			this.index = targetIndex;
-			this.sourceIndex = sourceIndex;
-		}
-		void itemAddedZeroArgument() {
-			this.itemAddedZeroArgumentFlag = true;
-		}
-		void itemAddedSingleArgument(ListChangeEvent e) {
-			this.itemAddedSingleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.listName, e.listName());
-			assertEquals(this.string, e.items().next());
-			assertEquals(this.index, e.index());
-		}
-		void itemRemovedZeroArgument() {
-			this.itemRemovedZeroArgumentFlag = true;
-		}
-		void itemRemovedSingleArgument(ListChangeEvent e) {
-			this.itemRemovedSingleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.listName, e.listName());
-			assertEquals(this.string, e.items().next());
-			assertEquals(this.index, e.index());
-		}
-		void itemReplacedZeroArgument() {
-			this.itemReplacedZeroArgumentFlag = true;
-		}
-		void itemReplacedSingleArgument(ListChangeEvent e) {
-			this.itemReplacedSingleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.listName, e.listName());
-			assertEquals(this.string, e.items().next());
-			assertEquals(this.replacedString, e.replacedItems().next());
-			assertEquals(this.index, e.index());
-		}
-		void itemMovedZeroArgument() {
-			this.itemMovedZeroArgumentFlag = true;
-		}
-		void itemMovedSingleArgument(ListChangeEvent e) {
-			this.itemMovedSingleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.listName, e.listName());
-			assertEquals(this.index, e.targetIndex());
-			assertEquals(this.sourceIndex, e.sourceIndex());
-		}
-		void listChangedZeroArgument() {
-			this.listChangedZeroArgumentFlag = true;
-		}
-		void listClearedSingleArgument(ListChangeEvent e) {
-			this.listClearedSingleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.listName, e.listName());
-			assertFalse(e.items().hasNext());
-			assertEquals(this.index, e.index());
-		}
-		void listClearedZeroArgument() {
-			this.listClearedZeroArgumentFlag = true;
-		}
-		void listChangedSingleArgument(ListChangeEvent e) {
-			this.listChangedSingleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.listName, e.listName());
-			assertFalse(e.items().hasNext());
-			assertEquals(this.index, e.index());
-		}
-		void listChangedDoubleArgument(ListChangeEvent e, Object o) {
-			fail("bogus event: " + e);
-		}
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectivePropertyChangeListenerTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectivePropertyChangeListenerTests.java
deleted file mode 100644
index 3fe86aa..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectivePropertyChangeListenerTests.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal.model.listener;
-
-import java.lang.reflect.Method;
-
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.internal.model.AbstractModel;
-import org.eclipse.jpt.utility.internal.model.event.PropertyChangeEvent;
-import org.eclipse.jpt.utility.internal.model.listener.PropertyChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ReflectiveChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.StateChangeListener;
-
-import junit.framework.TestCase;
-
-public class ReflectivePropertyChangeListenerTests extends TestCase {
-	
-	public ReflectivePropertyChangeListenerTests(String name) {
-		super(name);
-	}
-
-	public void testZeroArgument() {
-		TestModel testModel = new TestModel(7);
-		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
-		testModel.addPropertyChangeListener(ReflectiveChangeListener.buildPropertyChangeListener(target, "propertyChangedZeroArgument"));
-		testModel.setValue(99);
-		assertTrue(target.zeroArgumentFlag);
-		assertFalse(target.singleArgumentFlag);
-	}
-
-	public void testZeroArgumentNamedProperty() {
-		TestModel testModel = new TestModel(7);
-		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
-		testModel.addPropertyChangeListener(TestModel.VALUE_PROPERTY, ReflectiveChangeListener.buildPropertyChangeListener(target, "propertyChangedZeroArgument"));
-		testModel.setValue(99);
-		assertTrue(target.zeroArgumentFlag);
-		assertFalse(target.singleArgumentFlag);
-	}
-
-	public void testSingleArgument() {
-		TestModel testModel = new TestModel(7);
-		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
-		testModel.addPropertyChangeListener(ReflectiveChangeListener.buildPropertyChangeListener(target, "propertyChangedSingleArgument"));
-		testModel.setValue(99);
-		assertFalse(target.zeroArgumentFlag);
-		assertTrue(target.singleArgumentFlag);
-	}
-
-	/**
-	 * test method that has more general method parameter type
-	 */
-	public void testSingleArgument2() throws Exception {
-		TestModel testModel = new TestModel(7);
-		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
-		Method method = ClassTools.method(target, "propertyChangedSingleArgument2", new Class[] {Object.class});
-		testModel.addPropertyChangeListener(ReflectiveChangeListener.buildPropertyChangeListener(target, method));
-		testModel.setValue(99);
-		assertFalse(target.zeroArgumentFlag);
-		assertTrue(target.singleArgumentFlag);
-	}
-
-	public void testSingleArgumentNamedProperty() {
-		TestModel testModel = new TestModel(7);
-		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
-		testModel.addPropertyChangeListener(TestModel.VALUE_PROPERTY, ReflectiveChangeListener.buildPropertyChangeListener(target, "propertyChangedSingleArgument"));
-		testModel.setValue(99);
-		assertFalse(target.zeroArgumentFlag);
-		assertTrue(target.singleArgumentFlag);
-	}
-
-	/**
-	 * test method that has more general method parameter type
-	 */
-	public void testSingleArgumentNamedProperty2() throws Exception {
-		TestModel testModel = new TestModel(7);
-		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
-		Method method = ClassTools.method(target, "propertyChangedSingleArgument2", new Class[] {Object.class});
-		testModel.addPropertyChangeListener(TestModel.VALUE_PROPERTY, ReflectiveChangeListener.buildPropertyChangeListener(target, method));
-		testModel.setValue(99);
-		assertFalse(target.zeroArgumentFlag);
-		assertTrue(target.singleArgumentFlag);
-	}
-
-	public void testListenerMismatch() {
-		TestModel testModel = new TestModel(7);
-		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
-		// build a PROPERTY change listener and hack it so we
-		// can add it as a STATE change listener
-		Object listener = ReflectiveChangeListener.buildPropertyChangeListener(target, "propertyChangedSingleArgument");
-		testModel.addStateChangeListener((StateChangeListener) listener);
-
-		boolean exCaught = false;
-		try {
-			testModel.setValue(99);
-			fail("listener mismatch: " + listener);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testBogusDoubleArgument1() {
-		TestModel testModel = new TestModel(7);
-		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
-		boolean exCaught = false;
-		try {
-			PropertyChangeListener listener = ReflectiveChangeListener.buildPropertyChangeListener(target, "stateChangedDoubleArgument");
-			fail("bogus listener: " + listener);
-		} catch (RuntimeException ex) {
-			if (ex.getCause().getClass() == NoSuchMethodException.class) {
-				exCaught = true;
-			}
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testBogusDoubleArgument2() throws Exception {
-		TestModel testModel = new TestModel(7);
-		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
-		Method method = ClassTools.method(target, "propertyChangedDoubleArgument", new Class[] {PropertyChangeEvent.class, Object.class});
-		boolean exCaught = false;
-		try {
-			PropertyChangeListener listener = ReflectiveChangeListener.buildPropertyChangeListener(target, method);
-			fail("bogus listener: " + listener);
-		} catch (RuntimeException ex) {
-			if (ex.getMessage().equals(method.toString())) {
-				exCaught = true;
-			}
-		}
-		assertTrue(exCaught);
-	}
-
-
-	private class TestModel extends AbstractModel {
-		private int value = 0;
-			public static final String VALUE_PROPERTY = "value";
-		TestModel(int value) {
-			super();
-			this.value = value;
-		}
-		void setValue(int value) {
-			int old = this.value;
-			this.value = value;
-			this.firePropertyChanged(VALUE_PROPERTY, old, value);
-			if (old != value) {
-				this.fireStateChanged();
-			}
-		}
-	}
-
-	private class Target {
-		TestModel testModel;
-		String propertyName;
-		Object oldValue;
-		Object newValue;
-		boolean zeroArgumentFlag = false;
-		boolean singleArgumentFlag = false;
-		Target(TestModel testModel, String propertyName, int oldValue, int newValue) {
-			super();
-			this.testModel = testModel;
-			this.propertyName = propertyName;
-			this.oldValue = new Integer(oldValue);
-			this.newValue = new Integer(newValue);
-		}
-		void propertyChangedZeroArgument() {
-			this.zeroArgumentFlag = true;
-		}
-		void propertyChangedSingleArgument(PropertyChangeEvent e) {
-			this.singleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.propertyName, e.propertyName());
-			assertEquals(this.oldValue, e.oldValue());
-			assertEquals(this.newValue, e.newValue());
-		}
-		void propertyChangedSingleArgument2(Object o) {
-			PropertyChangeEvent e = (PropertyChangeEvent) o;
-			this.singleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.propertyName, e.propertyName());
-			assertEquals(this.oldValue, e.oldValue());
-			assertEquals(this.newValue, e.newValue());
-		}
-		void propertyChangedDoubleArgument(PropertyChangeEvent e, Object o) {
-			fail("bogus event: " + e);
-		}
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectiveStateChangeListenerTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectiveStateChangeListenerTests.java
deleted file mode 100644
index 5dd8c86..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectiveStateChangeListenerTests.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal.model.listener;
-
-import java.lang.reflect.Method;
-
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.internal.model.AbstractModel;
-import org.eclipse.jpt.utility.internal.model.event.StateChangeEvent;
-import org.eclipse.jpt.utility.internal.model.listener.PropertyChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ReflectiveChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.StateChangeListener;
-
-import junit.framework.TestCase;
-
-public class ReflectiveStateChangeListenerTests extends TestCase {
-	
-	public ReflectiveStateChangeListenerTests(String name) {
-		super(name);
-	}
-
-	public void testZeroArgument() {
-		TestModel testModel = new TestModel();
-		Target target = new Target(testModel);
-		testModel.addStateChangeListener(ReflectiveChangeListener.buildStateChangeListener(target, "stateChangedZeroArgument"));
-		testModel.changeState();
-		assertTrue(target.zeroArgumentFlag);
-		assertFalse(target.singleArgumentFlag);
-	}
-
-	public void testSingleArgument() {
-		TestModel testModel = new TestModel();
-		Target target = new Target(testModel);
-		testModel.addStateChangeListener(ReflectiveChangeListener.buildStateChangeListener(target, "stateChangedSingleArgument"));
-		testModel.changeState();
-		assertFalse(target.zeroArgumentFlag);
-		assertTrue(target.singleArgumentFlag);
-	}
-
-	/**
-	 * test method that has more general method parameter type
-	 */
-	public void testSingleArgument2() throws Exception {
-		TestModel testModel = new TestModel();
-		Target target = new Target(testModel);
-		Method method = ClassTools.method(target, "stateChangedSingleArgument2", new Class[] {Object.class});
-		testModel.addStateChangeListener(ReflectiveChangeListener.buildStateChangeListener(target, method));
-		testModel.changeState();
-		assertFalse(target.zeroArgumentFlag);
-		assertTrue(target.singleArgumentFlag);
-	}
-
-	public void testListenerMismatch() {
-		TestModel testModel = new TestModel();
-		Target target = new Target(testModel);
-		// build a STATE change listener and hack it so we
-		// can add it as a PROPERTY change listener
-		Object listener = ReflectiveChangeListener.buildStateChangeListener(target, "stateChangedSingleArgument");
-		testModel.addPropertyChangeListener((PropertyChangeListener) listener);
-
-		boolean exCaught = false;
-		try {
-			testModel.changeProperty();
-			fail("listener mismatch: " + listener);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testBogusDoubleArgument1() {
-		TestModel testModel = new TestModel();
-		Target target = new Target(testModel);
-		boolean exCaught = false;
-		try {
-			StateChangeListener listener = ReflectiveChangeListener.buildStateChangeListener(target, "stateChangedDoubleArgument");
-			fail("bogus listener: " + listener);
-		} catch (RuntimeException ex) {
-			if (ex.getCause().getClass() == NoSuchMethodException.class) {
-				exCaught = true;
-			}
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testBogusDoubleArgument2() throws Exception {
-		TestModel testModel = new TestModel();
-		Target target = new Target(testModel);
-		Method method = ClassTools.method(target, "stateChangedDoubleArgument", new Class[] {StateChangeEvent.class, Object.class});
-		boolean exCaught = false;
-		try {
-			StateChangeListener listener = ReflectiveChangeListener.buildStateChangeListener(target, method);
-			fail("bogus listener: " + listener);
-		} catch (RuntimeException ex) {
-			if (ex.getMessage().equals(method.toString())) {
-				exCaught = true;
-			}
-		}
-		assertTrue(exCaught);
-	}
-
-
-	private class TestModel extends AbstractModel {
-		TestModel() {
-			super();
-		}
-		void changeState() {
-			this.fireStateChanged();
-		}
-		void changeProperty() {
-			this.firePropertyChanged("value", 55, 42);
-		}
-	}
-
-	private class Target {
-		TestModel testModel;
-		boolean zeroArgumentFlag = false;
-		boolean singleArgumentFlag = false;
-		Target(TestModel testModel) {
-			super();
-			this.testModel = testModel;
-		}
-		void stateChangedZeroArgument() {
-			this.zeroArgumentFlag = true;
-		}
-		void stateChangedSingleArgument(StateChangeEvent e) {
-			this.singleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-		}
-		void stateChangedSingleArgument2(Object e) {
-			this.singleArgumentFlag = true;
-			assertSame(this.testModel, ((StateChangeEvent) e).getSource());
-		}
-		void stateChangedDoubleArgument(StateChangeEvent e, Object o) {
-			fail("bogus event: " + e);
-		}
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectiveTreeChangeListenerTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectiveTreeChangeListenerTests.java
deleted file mode 100644
index 3798d25..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/model/listener/ReflectiveTreeChangeListenerTests.java
+++ /dev/null
@@ -1,515 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal.model.listener;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.internal.CollectionTools;
-import org.eclipse.jpt.utility.internal.iterators.CloneIterator;
-import org.eclipse.jpt.utility.internal.model.AbstractModel;
-import org.eclipse.jpt.utility.internal.model.event.TreeChangeEvent;
-import org.eclipse.jpt.utility.internal.model.listener.CollectionChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.ReflectiveChangeListener;
-import org.eclipse.jpt.utility.internal.model.listener.TreeChangeListener;
-
-import junit.framework.TestCase;
-
-public class ReflectiveTreeChangeListenerTests extends TestCase {
-	
-	public ReflectiveTreeChangeListenerTests(String name) {
-		super(name);
-	}
-
-	private TreeChangeListener buildZeroArgumentListener(Object target) {
-		return ReflectiveChangeListener.buildTreeChangeListener(target, "nodeAddedZeroArgument", "nodeRemovedZeroArgument", "treeClearedZeroArgument", "treeChangedZeroArgument");
-	}
-
-	private TreeChangeListener buildSingleArgumentListener(Object target) {
-		return ReflectiveChangeListener.buildTreeChangeListener(target, "nodeAddedSingleArgument", "nodeRemovedSingleArgument", "treeClearedSingleArgument", "treeChangedSingleArgument");
-	}
-
-	public void testNodeAddedZeroArgument() {
-		TestModel testModel = new TestModel("root");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "child"});
-		testModel.addTreeChangeListener(this.buildZeroArgumentListener(target));
-		testModel.addNode("root", "child");
-		assertTrue(target.nodeAddedZeroArgumentFlag);
-		assertFalse(target.nodeAddedSingleArgumentFlag);
-		assertFalse(target.nodeRemovedZeroArgumentFlag);
-		assertFalse(target.nodeRemovedSingleArgumentFlag);
-		assertFalse(target.treeClearedZeroArgumentFlag);
-		assertFalse(target.treeClearedSingleArgumentFlag);
-		assertFalse(target.treeChangedZeroArgumentFlag);
-		assertFalse(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testNodeAddedZeroArgumentNamedTree() {
-		TestModel testModel = new TestModel("root");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "child"});
-		testModel.addTreeChangeListener(TestModel.STRINGS_TREE, this.buildZeroArgumentListener(target));
-		testModel.addNode("root", "child");
-		assertTrue(target.nodeAddedZeroArgumentFlag);
-		assertFalse(target.nodeAddedSingleArgumentFlag);
-		assertFalse(target.nodeRemovedZeroArgumentFlag);
-		assertFalse(target.nodeRemovedSingleArgumentFlag);
-		assertFalse(target.treeClearedZeroArgumentFlag);
-		assertFalse(target.treeClearedSingleArgumentFlag);
-		assertFalse(target.treeChangedZeroArgumentFlag);
-		assertFalse(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testNodeAddedSingleArgument() {
-		TestModel testModel = new TestModel("root");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "child"});
-		testModel.addTreeChangeListener(this.buildSingleArgumentListener(target));
-		testModel.addNode("root", "child");
-		assertFalse(target.nodeAddedZeroArgumentFlag);
-		assertTrue(target.nodeAddedSingleArgumentFlag);
-		assertFalse(target.nodeRemovedZeroArgumentFlag);
-		assertFalse(target.nodeRemovedSingleArgumentFlag);
-		assertFalse(target.treeClearedZeroArgumentFlag);
-		assertFalse(target.treeClearedSingleArgumentFlag);
-		assertFalse(target.treeChangedZeroArgumentFlag);
-		assertFalse(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testNodeAddedSingleArgumentNamedTree() {
-		TestModel testModel = new TestModel("root");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "child"});
-		testModel.addTreeChangeListener(TestModel.STRINGS_TREE, this.buildSingleArgumentListener(target));
-		testModel.addNode("root", "child");
-		assertFalse(target.nodeAddedZeroArgumentFlag);
-		assertTrue(target.nodeAddedSingleArgumentFlag);
-		assertFalse(target.nodeRemovedZeroArgumentFlag);
-		assertFalse(target.nodeRemovedSingleArgumentFlag);
-		assertFalse(target.treeClearedZeroArgumentFlag);
-		assertFalse(target.treeClearedSingleArgumentFlag);
-		assertFalse(target.treeChangedZeroArgumentFlag);
-		assertFalse(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testNodeRemovedZeroArgument() {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "child"});
-		testModel.addTreeChangeListener(this.buildZeroArgumentListener(target));
-		testModel.removeNode("child");
-		assertFalse(target.nodeAddedZeroArgumentFlag);
-		assertFalse(target.nodeAddedSingleArgumentFlag);
-		assertTrue(target.nodeRemovedZeroArgumentFlag);
-		assertFalse(target.nodeRemovedSingleArgumentFlag);
-		assertFalse(target.treeClearedZeroArgumentFlag);
-		assertFalse(target.treeClearedSingleArgumentFlag);
-		assertFalse(target.treeChangedZeroArgumentFlag);
-		assertFalse(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testNodeRemovedZeroArgumentNamedTree() {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "child"});
-		testModel.addTreeChangeListener(TestModel.STRINGS_TREE, this.buildZeroArgumentListener(target));
-		testModel.removeNode("child");
-		assertFalse(target.nodeAddedZeroArgumentFlag);
-		assertFalse(target.nodeAddedSingleArgumentFlag);
-		assertTrue(target.nodeRemovedZeroArgumentFlag);
-		assertFalse(target.nodeRemovedSingleArgumentFlag);
-		assertFalse(target.treeClearedZeroArgumentFlag);
-		assertFalse(target.treeClearedSingleArgumentFlag);
-		assertFalse(target.treeChangedZeroArgumentFlag);
-		assertFalse(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testNodeRemovedSingleArgument() {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "child"});
-		testModel.addTreeChangeListener(this.buildSingleArgumentListener(target));
-		testModel.removeNode("child");
-		assertFalse(target.nodeAddedZeroArgumentFlag);
-		assertFalse(target.nodeAddedSingleArgumentFlag);
-		assertFalse(target.nodeRemovedZeroArgumentFlag);
-		assertTrue(target.nodeRemovedSingleArgumentFlag);
-		assertFalse(target.treeClearedZeroArgumentFlag);
-		assertFalse(target.treeClearedSingleArgumentFlag);
-		assertFalse(target.treeChangedZeroArgumentFlag);
-		assertFalse(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testNodeRemovedSingleArgumentNamedTree() {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "child"});
-		testModel.addTreeChangeListener(TestModel.STRINGS_TREE, this.buildSingleArgumentListener(target));
-		testModel.removeNode("child");
-		assertFalse(target.nodeAddedZeroArgumentFlag);
-		assertFalse(target.nodeAddedSingleArgumentFlag);
-		assertFalse(target.nodeRemovedZeroArgumentFlag);
-		assertTrue(target.nodeRemovedSingleArgumentFlag);
-		assertFalse(target.treeClearedZeroArgumentFlag);
-		assertFalse(target.treeClearedSingleArgumentFlag);
-		assertFalse(target.treeChangedZeroArgumentFlag);
-		assertFalse(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testTreeClearedZeroArgument() {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		testModel.addNode("child", "grandchild");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[0]);
-		testModel.addTreeChangeListener(this.buildZeroArgumentListener(target));
-		testModel.clearTree();
-		assertFalse(target.nodeAddedZeroArgumentFlag);
-		assertFalse(target.nodeAddedSingleArgumentFlag);
-		assertFalse(target.nodeRemovedZeroArgumentFlag);
-		assertFalse(target.nodeRemovedSingleArgumentFlag);
-		assertTrue(target.treeClearedZeroArgumentFlag);
-		assertFalse(target.treeClearedSingleArgumentFlag);
-		assertFalse(target.treeChangedZeroArgumentFlag);
-		assertFalse(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testTreeClearedZeroArgumentNamedTree() {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		testModel.addNode("child", "grandchild");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[0]);
-		testModel.addTreeChangeListener(TestModel.STRINGS_TREE, this.buildZeroArgumentListener(target));
-		testModel.clearTree();
-		assertFalse(target.nodeAddedZeroArgumentFlag);
-		assertFalse(target.nodeAddedSingleArgumentFlag);
-		assertFalse(target.nodeRemovedZeroArgumentFlag);
-		assertFalse(target.nodeRemovedSingleArgumentFlag);
-		assertTrue(target.treeClearedZeroArgumentFlag);
-		assertFalse(target.treeClearedSingleArgumentFlag);
-		assertFalse(target.treeChangedZeroArgumentFlag);
-		assertFalse(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testTreeClearedSingleArgument() {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		testModel.addNode("child", "grandchild");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[0]);
-		testModel.addTreeChangeListener(this.buildSingleArgumentListener(target));
-		testModel.clearTree();
-		assertFalse(target.nodeAddedZeroArgumentFlag);
-		assertFalse(target.nodeAddedSingleArgumentFlag);
-		assertFalse(target.nodeRemovedZeroArgumentFlag);
-		assertFalse(target.nodeRemovedSingleArgumentFlag);
-		assertFalse(target.treeClearedZeroArgumentFlag);
-		assertTrue(target.treeClearedSingleArgumentFlag);
-		assertFalse(target.treeChangedZeroArgumentFlag);
-		assertFalse(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testTreeClearedSingleArgumentNamedTree() {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		testModel.addNode("child", "grandchild");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[0]);
-		testModel.addTreeChangeListener(TestModel.STRINGS_TREE, this.buildSingleArgumentListener(target));
-		testModel.clearTree();
-		assertFalse(target.nodeAddedZeroArgumentFlag);
-		assertFalse(target.nodeAddedSingleArgumentFlag);
-		assertFalse(target.nodeRemovedZeroArgumentFlag);
-		assertFalse(target.nodeRemovedSingleArgumentFlag);
-		assertFalse(target.treeClearedZeroArgumentFlag);
-		assertTrue(target.treeClearedSingleArgumentFlag);
-		assertFalse(target.treeChangedZeroArgumentFlag);
-		assertFalse(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testTreeChangedZeroArgument() {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "another child"});
-		testModel.addTreeChangeListener(this.buildZeroArgumentListener(target));
-		testModel.replaceNode("child", "another child");
-		assertFalse(target.nodeAddedZeroArgumentFlag);
-		assertFalse(target.nodeAddedSingleArgumentFlag);
-		assertFalse(target.nodeRemovedZeroArgumentFlag);
-		assertFalse(target.nodeRemovedSingleArgumentFlag);
-		assertFalse(target.treeClearedZeroArgumentFlag);
-		assertFalse(target.treeClearedSingleArgumentFlag);
-		assertTrue(target.treeChangedZeroArgumentFlag);
-		assertFalse(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testTreeChangedZeroArgumentNamedTree() {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "another child"});
-		testModel.addTreeChangeListener(TestModel.STRINGS_TREE, this.buildZeroArgumentListener(target));
-		testModel.replaceNode("child", "another child");
-		assertFalse(target.nodeAddedZeroArgumentFlag);
-		assertFalse(target.nodeAddedSingleArgumentFlag);
-		assertFalse(target.nodeRemovedZeroArgumentFlag);
-		assertFalse(target.nodeRemovedSingleArgumentFlag);
-		assertFalse(target.treeClearedZeroArgumentFlag);
-		assertFalse(target.treeClearedSingleArgumentFlag);
-		assertTrue(target.treeChangedZeroArgumentFlag);
-		assertFalse(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testTreeChangedSingleArgument() {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "another child"});
-		testModel.addTreeChangeListener(this.buildSingleArgumentListener(target));
-		testModel.replaceNode("child", "another child");
-		assertFalse(target.nodeAddedZeroArgumentFlag);
-		assertFalse(target.nodeAddedSingleArgumentFlag);
-		assertFalse(target.nodeRemovedZeroArgumentFlag);
-		assertFalse(target.nodeRemovedSingleArgumentFlag);
-		assertFalse(target.treeClearedZeroArgumentFlag);
-		assertFalse(target.treeClearedSingleArgumentFlag);
-		assertFalse(target.treeChangedZeroArgumentFlag);
-		assertTrue(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testTreeChangedSingleArgumentNamedTree() {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "another child"});
-		testModel.addTreeChangeListener(TestModel.STRINGS_TREE, this.buildSingleArgumentListener(target));
-		testModel.replaceNode("child", "another child");
-		assertFalse(target.nodeAddedZeroArgumentFlag);
-		assertFalse(target.nodeAddedSingleArgumentFlag);
-		assertFalse(target.nodeRemovedZeroArgumentFlag);
-		assertFalse(target.nodeRemovedSingleArgumentFlag);
-		assertFalse(target.treeClearedZeroArgumentFlag);
-		assertFalse(target.treeClearedSingleArgumentFlag);
-		assertFalse(target.treeChangedZeroArgumentFlag);
-		assertTrue(target.treeChangedSingleArgumentFlag);
-	}
-
-	public void testBogusDoubleArgument1() {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "child"});
-		boolean exCaught = false;
-		try {
-			TreeChangeListener listener = ReflectiveChangeListener.buildTreeChangeListener(target, "collectionChangedDoubleArgument");
-			fail("bogus listener: " + listener);
-		} catch (RuntimeException ex) {
-			if (ex.getCause().getClass() == NoSuchMethodException.class) {
-				exCaught = true;
-			}
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testBogusDoubleArgument2() throws Exception {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "child"});
-		Method method = ClassTools.method(target, "collectionChangedDoubleArgument", new Class[] {TreeChangeEvent.class, Object.class});
-		boolean exCaught = false;
-		try {
-			TreeChangeListener listener = ReflectiveChangeListener.buildTreeChangeListener(target, method);
-			fail("bogus listener: " + listener);
-		} catch (RuntimeException ex) {
-			if (ex.getMessage().equals(method.toString())) {
-				exCaught = true;
-			}
-		}
-		assertTrue(exCaught);
-	}
-
-	public void testListenerMismatch() {
-		TestModel testModel = new TestModel("root");
-		testModel.addNode("root", "child");
-		Target target = new Target(testModel, TestModel.STRINGS_TREE, new String[]{"root", "child"});
-		// build a TREE change listener and hack it so we
-		// can add it as a COLLECTION change listener
-		Object listener = ReflectiveChangeListener.buildTreeChangeListener(target, "nodeAddedSingleArgument");
-		testModel.addCollectionChangeListener((CollectionChangeListener) listener);
-
-		boolean exCaught = false;
-		try {
-			testModel.changeCollection();
-			fail("listener mismatch: " + listener);
-		} catch (IllegalArgumentException ex) {
-			exCaught = true;
-		}
-		assertTrue(exCaught);
-	}
-
-
-	private class TestModel extends AbstractModel {
-		private final String root;
-		private Map<String, Collection<String>> childrenLists = new HashMap<String, Collection<String>>();
-		private Map<String, String> parents = new HashMap<String, String>();
-			public static final String STRINGS_TREE = "strings";
-		TestModel(String root) {
-			super();
-			if (root == null) {
-				throw new NullPointerException();
-			}
-			this.root = root;
-			this.childrenLists.put(root, new ArrayList<String>());
-			this.parents.put(root, null);
-		}
-		String getRoot() {
-			return this.root;
-		}
-		private String[] path(String node) {
-			String temp = node;
-			List<String> reversePath = new ArrayList<String>();
-			do {
-				reversePath.add(temp);
-				temp = this.parents.get(temp);
-			} while (temp != null);
-			return CollectionTools.reverse(reversePath).toArray(new String[reversePath.size()]);
-		}
-		Iterator<String> strings() {
-			return new CloneIterator<String>(this.childrenLists.keySet()) {
-				@Override
-				protected void remove(String s) {
-					TestModel.this.removeNode(s);
-				}
-			};
-		}
-		void addNode(String parent, String child) {
-			if ((parent == null) || (child == null)) {
-				throw new NullPointerException();
-			}
-
-			Collection<String> children = this.childrenLists.get(parent);
-			if (children == null) {
-				throw new IllegalStateException("cannot add a child to a non-existent parent");
-			}
-
-			if (this.childrenLists.get(child) != null) {
-				throw new IllegalStateException("cannot add a child that is already in the tree");
-			}
-			
-			children.add(child);
-			this.childrenLists.put(child, new ArrayList<String>());
-			this.parents.put(child, parent);
-			this.fireNodeAdded(STRINGS_TREE, this.path(child));
-		}
-		void removeNode(String node) {
-			if (node == null) {
-				throw new NullPointerException();
-			}
-
-			Collection<String> children = this.childrenLists.get(node);
-			if (children == null) {
-				throw new IllegalStateException("node is not in tree");
-			}
-			Object[] path = this.path(node);
-			for (String s : children) {
-				this.removeNode(s);
-			}
-			this.childrenLists.remove(node);
-			this.parents.remove(node);
-			this.fireNodeRemoved(STRINGS_TREE, path);
-		}
-		void replaceNode(String oldNode, String newNode) {
-			if ((oldNode == null) || (newNode == null)) {
-				throw new NullPointerException();
-			}
-
-			Collection<String> children = this.childrenLists.remove(oldNode);
-			if (children == null) {
-				throw new IllegalStateException("old node is not in tree");
-			}
-			this.childrenLists.put(newNode, children);
-			for (String child : children) {
-				this.parents.put(child, newNode);
-			}
-
-			String parent = this.parents.remove(oldNode);
-			this.parents.put(newNode, parent);
-
-			this.fireTreeChanged(STRINGS_TREE, this.path(newNode));
-		}
-		void clearTree() {
-			this.childrenLists.clear();
-			this.childrenLists.put(root, new ArrayList<String>());
-			this.parents.clear();
-			this.parents.put(root, null);
-			this.fireTreeCleared(STRINGS_TREE);
-		}
-		void changeCollection() {
-			this.fireCollectionChanged("bogus collection");
-		}
-	}
-
-	private class Target {
-		TestModel testModel;
-		String treeName;
-		String[] path;
-		boolean nodeAddedZeroArgumentFlag = false;
-		boolean nodeAddedSingleArgumentFlag = false;
-		boolean nodeRemovedZeroArgumentFlag = false;
-		boolean nodeRemovedSingleArgumentFlag = false;
-		boolean treeClearedZeroArgumentFlag = false;
-		boolean treeClearedSingleArgumentFlag = false;
-		boolean treeChangedZeroArgumentFlag = false;
-		boolean treeChangedSingleArgumentFlag = false;
-		Target(TestModel testModel, String treeName, String[] path) {
-			super();
-			this.testModel = testModel;
-			this.treeName = treeName;
-			this.path = path;
-		}
-		void nodeAddedZeroArgument() {
-			this.nodeAddedZeroArgumentFlag = true;
-		}
-		void nodeAddedSingleArgument(TreeChangeEvent e) {
-			this.nodeAddedSingleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.treeName, e.treeName());
-			assertTrue(Arrays.equals(this.path, e.path()));
-		}
-		void nodeRemovedZeroArgument() {
-			this.nodeRemovedZeroArgumentFlag = true;
-		}
-		void nodeRemovedSingleArgument(TreeChangeEvent e) {
-			this.nodeRemovedSingleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.treeName, e.treeName());
-			assertTrue(Arrays.equals(this.path, e.path()));
-		}
-		void treeClearedZeroArgument() {
-			this.treeClearedZeroArgumentFlag = true;
-		}
-		void treeClearedSingleArgument(TreeChangeEvent e) {
-			this.treeClearedSingleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.treeName, e.treeName());
-			assertTrue(Arrays.equals(this.path, e.path()));
-		}
-		void treeChangedZeroArgument() {
-			this.treeChangedZeroArgumentFlag = true;
-		}
-		void treeChangedSingleArgument(TreeChangeEvent e) {
-			this.treeChangedSingleArgumentFlag = true;
-			assertSame(this.testModel, e.getSource());
-			assertEquals(this.treeName, e.treeName());
-			assertTrue(Arrays.equals(this.path, e.path()));
-		}
-		void collectionChangedDoubleArgument(TreeChangeEvent e, Object o) {
-			fail("bogus event: " + e);
-		}
-	}
-
-}
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/node/AbstractNodeModelTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/node/AbstractNodeModelTests.java
deleted file mode 100644
index 5af287f..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/node/AbstractNodeModelTests.java
+++ /dev/null
@@ -1,528 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal.node;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jpt.utility.internal.CollectionTools;
-import org.eclipse.jpt.utility.internal.HashBag;
-import org.eclipse.jpt.utility.internal.Range;
-import org.eclipse.jpt.utility.internal.iterators.CloneIterator;
-import org.eclipse.jpt.utility.internal.node.AbstractNodeModel;
-import org.eclipse.jpt.utility.internal.node.Node;
-import org.eclipse.jpt.utility.internal.node.Problem;
-import org.eclipse.jpt.utility.tests.internal.TestTools;
-
-import junit.framework.TestCase;
-
-public class AbstractNodeModelTests extends TestCase {
-	private TestWorkbenchModel root;
-
-	public AbstractNodeModelTests(String name) {
-		super(name);
-	}
-
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-		this.root = this.buildRoot();
-	}
-
-	private TestWorkbenchModel buildRoot() {
-		TestWorkbenchModel r = new RootTestWorkbenchModel("root");
-			TestWorkbenchModel node1 = r.addTestChildNamed("node 1");
-				TestWorkbenchModel node1_1 = node1.addTestChildNamed("node 1.1");
-					node1_1.addTestChildNamed("node 1.1.1");
-					node1_1.addTestChildNamed("node 1.1.2");
-					node1_1.addTestChildNamed("node 1.1.3");
-				node1.addTestChildNamed("node 1.2");
-			TestWorkbenchModel node2 = r.addTestChildNamed("node 2");
-				node2.addTestChildNamed("node 2.1");
-				node2.addTestChildNamed("node 2.2");
-			r.addTestChildNamed("node 3");
-			r.addTestChildNamed("node 4");
-
-		// mark the entire tree clean
-		r.markEntireBranchClean();
-		return r;
-	}
-
-	@Override
-	protected void tearDown() throws Exception {
-		TestTools.clear(this);
-		super.tearDown();
-	}
-
-	public void testTestWorkbenchModel() {
-		// make sure our test class works OK...
-		assertNull(this.root.testChildNamed(""));
-		assertNotNull(this.root.testChildNamed("node 1"));
-		assertTrue(this.root.testChildNamed("node 1").isClean());
-		assertTrue(this.root.testChildNamed("node 1").isCleanBranch());
-		assertNotNull(this.root.testChildNamed("node 2"));
-		assertTrue(this.root.testChildNamed("node 2").isClean());
-		assertTrue(this.root.testChildNamed("node 2").isCleanBranch());
-		assertNull(this.root.testChildNamed("node 2.1"));
-
-		assertNull(this.root.testDescendantNamed(""));
-		assertNotNull(this.root.testDescendantNamed("node 1"));
-		assertNotNull(this.root.testDescendantNamed("node 2"));
-		assertNotNull(this.root.testDescendantNamed("node 2.1"));
-		assertTrue(this.root.testDescendantNamed("node 2.1").isClean());
-		assertTrue(this.root.testDescendantNamed("node 2.1").isCleanBranch());
-		assertNotNull(this.root.testDescendantNamed("node 1.1.3"));
-		assertTrue(this.root.testDescendantNamed("node 1.1.3").isClean());
-		assertTrue(this.root.testDescendantNamed("node 1.1.3").isCleanBranch());
-	}
-
-	public void testParentAndChildren() {
-		TestWorkbenchModel node = this.root.testDescendantNamed("node 1.1.3");
-		assertEquals("node 1.1.3", node.getName());
-		assertEquals(0, CollectionTools.size(node.children()));
-
-		node = (TestWorkbenchModel) node.parent();
-		assertEquals("node 1.1", node.getName());
-		assertEquals(3, CollectionTools.size(node.children()));
-
-		node = (TestWorkbenchModel) node.parent();
-		assertEquals("node 1", node.getName());
-		assertEquals(2, CollectionTools.size(node.children()));
-
-		node = (TestWorkbenchModel) node.parent();
-		assertEquals("root", node.getName());
-		assertEquals(4, CollectionTools.size(node.children()));
-
-		node = (TestWorkbenchModel) node.parent();
-		assertNull(node);
-	}
-
-	public void testDirty() {
-		TestWorkbenchModel node = this.root.testDescendantNamed("node 1.1.3");
-		node.setSize(42);
-		assertTrue(node.isDirty());
-
-		TestWorkbenchModel parent = (TestWorkbenchModel) node.parent();
-		assertTrue(parent.isClean());
-		assertTrue(this.root.isClean());
-	}
-
-	public void testDirtyUnchangedAttribute() {
-		TestWorkbenchModel node = this.root.testDescendantNamed("node 1.1.3");
-		node.setSize(42);
-		assertTrue(node.isDirty());
-
-		TestWorkbenchModel parent = (TestWorkbenchModel) node.parent();
-		assertTrue(parent.isClean());
-		assertTrue(this.root.isClean());
-
-		this.root.markEntireBranchClean();
-		// set size to same number - should stay clean
-		node.setSize(42);
-		assertTrue(node.isClean());
-		assertTrue(parent.isClean());
-		assertTrue(this.root.isClean());
-	}
-
-	public void testDirtyBranch() {
-		TestWorkbenchModel node = this.root.testDescendantNamed("node 1.1.3");
-		node.setSize(42);
-		assertTrue(node.isDirtyBranch());
-
-		TestWorkbenchModel parent = (TestWorkbenchModel) node.parent();
-		assertTrue(parent.isDirtyBranch());
-		assertTrue(this.root.isDirtyBranch());
-
-		parent.setSize(77);
-		assertTrue(parent.isDirty());
-		assertTrue(parent.isDirtyBranch());
-
-		node.markEntireBranchClean();
-		assertTrue(parent.isDirty());
-		assertTrue(parent.isDirtyBranch());
-	}
-
-	public void testDirtyBranchCleanChildDirtyParent() {
-		TestWorkbenchModel node = this.root.testDescendantNamed("node 1.1.3");
-		node.setSize(42);
-
-		TestWorkbenchModel parent = (TestWorkbenchModel) node.parent();
-		parent.setSize(77);
-		assertTrue(parent.isDirty());
-		assertTrue(parent.isDirtyBranch());
-
-		// now, clean the child, but leave the parent dirty
-		node.markEntireBranchClean();
-		assertTrue(parent.isDirty());
-		assertTrue(parent.isDirtyBranch());
-	}
-
-	public void testDirtyBranchCleanChildDirtyChild() {
-		TestWorkbenchModel node1 = this.root.testDescendantNamed("node 1.1.1");
-		node1.setSize(41);
-		TestWorkbenchModel node2 = this.root.testDescendantNamed("node 1.1.2");
-		node2.setSize(42);
-
-		TestWorkbenchModel parent = (TestWorkbenchModel) node1.parent();
-		assertTrue(parent.isClean());
-		assertTrue(parent.isDirtyBranch());
-
-		// now, clean the first child, but leave the second child dirty
-		node1.markEntireBranchClean();
-		assertTrue(parent.isClean());
-		assertTrue(parent.isDirtyBranch());
-	}
-
-	public void testDirtyBranchForced() {
-		TestWorkbenchModel node = this.root.testDescendantNamed("node 1.1.3");
-		TestWorkbenchModel parent = (TestWorkbenchModel) node.parent();
-
-		assertTrue(node.isClean());
-		assertTrue(node.isCleanBranch());
-		assertTrue(parent.isClean());
-		assertTrue(parent.isCleanBranch());
-		assertTrue(this.root.isClean());
-		assertTrue(this.root.isCleanBranch());
-
-		this.root.markEntireBranchDirty();
-
-		assertTrue(node.isDirty());
-		assertTrue(node.isDirtyBranch());
-		assertTrue(parent.isDirty());
-		assertTrue(parent.isDirtyBranch());
-		assertTrue(this.root.isDirty());
-		assertTrue(this.root.isDirtyBranch());
-	}
-
-	public void testDirtyTransientAttribute() {
-		TestWorkbenchModel node = this.root.testDescendantNamed("node 1.1.3");
-		node.setName("BOGUS");
-		assertTrue(node.isDirty());
-		TestWorkbenchModel parent = (TestWorkbenchModel) node.parent();
-		assertTrue(parent.isClean());
-		assertTrue(parent.isDirtyBranch());
-		assertTrue(this.root.isClean());
-		assertTrue(this.root.isDirtyBranch());
-
-		this.root.markEntireBranchClean();
-
-		this.root.validateBranch();
-
-		assertTrue(this.root.problemsSize() == 0);
-		assertTrue(node.branchProblems().hasNext());
-		assertTrue(parent.problemsSize() == 0);
-		assertTrue(parent.branchProblems().hasNext());
-		assertTrue(node.problemsSize() > 0);
-
-		// since problems are transient, everything should still be clean
-		assertTrue(node.isClean());
-		assertTrue(node.isCleanBranch());
-		assertTrue(parent.isClean());
-		assertTrue(parent.isCleanBranch());
-		assertTrue(this.root.isClean());
-		assertTrue(this.root.isCleanBranch());
-	}
-
-	public void testProblems() {
-		TestWorkbenchModel node = this.root.testDescendantNamed("node 1.1.3");
-		node.setName("BOGUS");
-		TestWorkbenchModel parent = (TestWorkbenchModel) node.parent();
-
-		this.root.validateBranch();
-
-		assertEquals(0, this.root.problemsSize());
-		assertTrue(node.branchProblems().hasNext());
-		assertEquals(0, parent.problemsSize());
-		assertTrue(parent.branchProblems().hasNext());
-		assertEquals(1, node.problemsSize());
-		Problem problem1 = node.problems().next();
-
-		// now create another problem that should remove the old problem
-		node.setName("STILL BOGUS");
-		this.root.validateBranch();
-
-		assertEquals(0, this.root.problemsSize());
-		assertTrue(node.branchProblems().hasNext());
-		assertEquals(0, parent.problemsSize());
-		assertTrue(parent.branchProblems().hasNext());
-		assertEquals(1, node.problemsSize());
-		Problem problem2 = node.problems().next();
-		assertFalse(problem1 == problem2);
-		problem1 = problem2;
-
-		// now create another problem that should replace the old problem
-		node.setName("STILL BOGUS");
-		this.root.validateBranch();
-
-		assertEquals(0, this.root.problemsSize());
-		assertTrue(node.branchProblems().hasNext());
-		assertEquals(0, parent.problemsSize());
-		assertTrue(parent.branchProblems().hasNext());
-		assertEquals(1, node.problemsSize());
-		problem2 = node.problems().next();
-		// the same problem should be there
-		assertTrue(problem1.equals(problem2));
-	}
-
-	public void testBranchProblems() {
-		TestWorkbenchModel node = this.root.testDescendantNamed("node 1.1.3");
-		node.setName("BOGUS");
-		TestWorkbenchModel parent = (TestWorkbenchModel) node.parent();
-		parent.setName("BOGUS TOO");
-		this.root.setName("BOGUS TOO TOO");
-
-		this.root.validateBranch();
-
-		assertEquals(1, this.root.problemsSize());
-		assertEquals(3, this.root.branchProblemsSize());
-		assertEquals(1, parent.problemsSize());
-		assertEquals(2, parent.branchProblemsSize());
-		assertEquals(1, node.problemsSize());
-		assertEquals(1, node.branchProblemsSize());
-
-		node.setName("okie-dokie");
-
-		this.root.validateBranch();
-
-		assertEquals(1, this.root.problemsSize());
-		assertEquals(2, this.root.branchProblemsSize());
-		assertEquals(1, parent.problemsSize());
-		assertEquals(1, parent.branchProblemsSize());
-		assertEquals(0, node.problemsSize());
-		assertEquals(0, node.branchProblemsSize());
-	}
-
-	public void testClearAllBranchProblems() {
-		TestWorkbenchModel node = this.root.testDescendantNamed("node 1.1.3");
-		node.setName("BOGUS");
-		TestWorkbenchModel parent = (TestWorkbenchModel) node.parent();
-		parent.setName("BOGUS TOO");
-		this.root.setName("BOGUS TOO TOO");
-
-		this.root.validateBranch();
-
-		assertEquals(1, this.root.problemsSize());
-		assertEquals(3, this.root.branchProblemsSize());
-		assertEquals(1, parent.problemsSize());
-		assertEquals(2, parent.branchProblemsSize());
-		assertEquals(1, node.problemsSize());
-		assertEquals(1, node.branchProblemsSize());
-
-		parent.clearAllBranchProblems();
-
-		assertEquals(1, this.root.problemsSize());
-		assertEquals(1, this.root.branchProblemsSize());
-		assertEquals(0, parent.problemsSize());
-		assertEquals(0, parent.branchProblemsSize());
-		assertEquals(0, node.problemsSize());
-		assertEquals(0, CollectionTools.size(node.branchProblems()));
-	}
-
-	public void testRemovedBranchProblems() {
-		TestWorkbenchModel node = this.root.testDescendantNamed("node 1.1.3");
-		node.setName("BOGUS");
-		TestWorkbenchModel parent = (TestWorkbenchModel) node.parent();
-		parent.setName("BOGUS TOO");
-		this.root.setName("BOGUS TOO TOO");
-
-		this.root.validateBranch();
-
-		assertEquals(1, this.root.problemsSize());
-		assertEquals(3, CollectionTools.size(this.root.branchProblems()));
-		assertEquals(1, parent.problemsSize());
-		assertEquals(2, parent.branchProblemsSize());
-		assertEquals(1, node.problemsSize());
-		assertEquals(1, CollectionTools.size(node.branchProblems()));
-
-		// completely remove a node that has problems -
-		// the entire tree should recalculate its "branch" problems
-		parent.removeTestChild(node);
-
-		this.root.validateBranch();
-
-		assertEquals(1, this.root.problemsSize());
-		assertEquals(2, CollectionTools.size(this.root.branchProblems()));
-		assertEquals(1, parent.problemsSize());
-		assertEquals(1, parent.branchProblemsSize());
-	}
-
-	public void testSort() {
-		List<TestWorkbenchModel> nodes = this.buildSortedNodes();
-		assertTrue(new Range(0, 1).includes(this.indexOf(nodes, "aaa")));
-		assertTrue(new Range(0, 1).includes(this.indexOf(nodes, "AAA")));
-		assertTrue(new Range(2, 3).includes(this.indexOf(nodes, "bbb")));
-		assertTrue(new Range(2, 3).includes(this.indexOf(nodes, "BBB")));
-		assertTrue(new Range(4, 6).includes(this.indexOf(nodes, "ccc")));
-		assertTrue(new Range(4, 6).includes(this.indexOf(nodes, "CCC")));
-		assertTrue(new Range(4, 6).includes(this.indexOf(nodes, "���")));
-	}
-
-	private int indexOf(List<TestWorkbenchModel> nodes, String nodeName) {
-		for (int i = nodes.size(); i-- > 0; ) {
-			if (nodes.get(i).getName().equals(nodeName)) {
-				return i;
-			}
-		}
-		throw new IllegalArgumentException();
-	}
-
-	private List<TestWorkbenchModel> buildSortedNodes() {
-		List<TestWorkbenchModel> result = new ArrayList<TestWorkbenchModel>();
-		result.add(new RootTestWorkbenchModel("AAA"));
-		result.add(new RootTestWorkbenchModel("BBB"));
-		result.add(new RootTestWorkbenchModel("CCC"));
-		result.add(new RootTestWorkbenchModel("���"));
-		result.add(new RootTestWorkbenchModel("ccc"));
-		result.add(new RootTestWorkbenchModel("bbb"));
-		result.add(new RootTestWorkbenchModel("aaa"));
-		return CollectionTools.sort(result);
-	}
-
-
-	// ********** inner classes **********
-
-	private class TestWorkbenchModel extends AbstractNodeModel {
-		private String name;
-			public static final String NAME_PROPERTY = "name";
-		private int size;
-			public static final String SIZE_PROPERTY = "size";
-		private Collection<TestWorkbenchModel> testChildren;
-			public static final String TEST_CHILDREN_COLLECTION = "children";
-	
-		// ********** construction/initialization **********
-		public TestWorkbenchModel(TestWorkbenchModel parent, String name) {
-			super(parent);
-			if (name == null) {
-				throw new NullPointerException();
-			}
-			this.name = name;
-		}
-		@Override
-		protected void initialize() {
-			super.initialize();
-			this.size = 0;
-			this.testChildren = new HashBag<TestWorkbenchModel>();
-		}
-		
-		@Override
-		protected void checkParent(Node parent) {
-			// do nothing
-		}
-	
-	
-		// ********** accessors **********
-		public String getName() {
-			return this.name;
-		}
-		public void setName(String name) {
-			Object old = this.name;
-			this.name = name;
-			this.firePropertyChanged(NAME_PROPERTY, old, name);
-		}
-	
-		public int getSize() {
-			return this.size;
-		}
-		public void setSize(int size) {
-			int old = this.size;
-			this.size = size;
-			this.firePropertyChanged(SIZE_PROPERTY, old, size);
-		}
-	
-		public Iterator<TestWorkbenchModel> testChildren() {
-			return new CloneIterator<TestWorkbenchModel>(this.testChildren) {
-				@Override
-				protected void remove(TestWorkbenchModel current) {
-					TestWorkbenchModel.this.removeTestChild(current);
-				}
-			};
-		}
-		public int testChildrenSize() {
-			return this.testChildren.size();
-		}
-		private TestWorkbenchModel addTestChild(TestWorkbenchModel testChild) {
-			this.addItemToCollection(testChild, this.testChildren, TEST_CHILDREN_COLLECTION);
-			return testChild;
-		}
-		public TestWorkbenchModel addTestChildNamed(String childName) {
-			if (this.testChildNamed(childName) != null) {
-				throw new IllegalArgumentException(childName);
-			}
-			return this.addTestChild(new TestWorkbenchModel(this, childName));
-		}
-		public void removeTestChild(TestWorkbenchModel testChild) {
-			this.removeItemFromCollection(testChild, this.testChildren, TEST_CHILDREN_COLLECTION);
-		}
-	
-		// ********** queries **********
-		public String displayString() {
-			return this.name;
-		}
-		public TestWorkbenchModel testChildNamed(String childName) {
-			for (TestWorkbenchModel testChild : this.testChildren) {
-				if (testChild.getName().equals(childName)) {
-					return testChild;
-				}
-			}
-			return null;
-		}
-		public TestWorkbenchModel testDescendantNamed(String descendantName) {
-			for (TestWorkbenchModel testDescendant : this.testChildren) {
-				if (testDescendant.getName().equals(descendantName)) {
-					return testDescendant;
-				}
-				// recurse...
-				testDescendant = testDescendant.testDescendantNamed(descendantName);
-				if (testDescendant != null) {
-					return testDescendant;
-				}
-			}
-			return null;
-		}
-	
-		// ********** behavior **********
-		@Override
-		protected void addChildrenTo(List<Node> children) {
-			super.addChildrenTo(children);
-			children.addAll(this.testChildren);
-		}
-		@Override
-		protected void addProblemsTo(List<Problem> currentProblems) {
-			super.addProblemsTo(currentProblems);
-			// names must be all lowercase...
-			for (int i = this.name.length(); i-- > 0; ) {
-				char c = this.name.charAt(i);
-				if (Character.isLetter(c) && ! Character.isLowerCase(c)) {
-					currentProblems.add(this.buildProblem("NAME_MUST_BE_LOWERCASE", this.name));
-					return;
-				}
-			}
-		}
-		@Override
-		public void toString(StringBuffer sb) {
-			sb.append(this.name);
-		}
-	}
-
-
-	private class RootTestWorkbenchModel extends TestWorkbenchModel {
-		public RootTestWorkbenchModel(String name) {
-			super(null, name);
-		}
-		@Override
-		public Validator validator() {
-			return Node.NULL_VALIDATOR;
-		}
-	}
-
-}
-
diff --git a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/node/JptUtilityNodeTests.java b/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/node/JptUtilityNodeTests.java
deleted file mode 100644
index e16c3ba..0000000
--- a/jpa/tests/org.eclipse.jpt.utility.tests/src/org/eclipse/jpt/utility/tests/internal/node/JptUtilityNodeTests.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- * 
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jpt.utility.tests.internal.node;
-
-import org.eclipse.jpt.utility.internal.ClassTools;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class JptUtilityNodeTests {
-	
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ClassTools.packageNameFor(JptUtilityNodeTests.class));
-	
-		suite.addTestSuite(AbstractNodeModelTests.class);
-	
-		return suite;
-	}
-	
-	private JptUtilityNodeTests() {
-		super();
-	}
-	
-}
