diff --git a/jpa/plugins/org.eclipse.jpt.db/.classpath b/jpa/plugins/org.eclipse.jpt.db/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/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/plugins/org.eclipse.jpt.db/.cvsignore b/jpa/plugins/org.eclipse.jpt.db/.cvsignore
deleted file mode 100644
index a196dd7..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-bin
-@dot
-temp.folder
-build.xml
-javaCompiler...args
-javaCompiler...args.*
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.db/.project b/jpa/plugins/org.eclipse.jpt.db/.project
deleted file mode 100644
index 5675a48..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jpt.db</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jpa/plugins/org.eclipse.jpt.db/.settings/org.eclipse.core.resources.prefs b/jpa/plugins/org.eclipse.jpt.db/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 84ebb5c..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Tue Jan 15 11:11:02 EST 2008
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jpa/plugins/org.eclipse.jpt.db/.settings/org.eclipse.jdt.core.prefs b/jpa/plugins/org.eclipse.jpt.db/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 929d545..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Sun May 27 14:59:18 EDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jpa/plugins/org.eclipse.jpt.db/META-INF/MANIFEST.MF b/jpa/plugins/org.eclipse.jpt.db/META-INF/MANIFEST.MF
deleted file mode 100644
index 9e913be..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-Vendor: %providerName
-Bundle-SymbolicName: org.eclipse.jpt.db
-Bundle-Version: 1.1.4.qualifier
-Bundle-Activator: org.eclipse.jpt.db.JptDbPlugin
-Bundle-ClassPath: .
-Bundle-Localization: plugin
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-ActivationPolicy: lazy
-Eclipse-LazyStart: true
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.datatools.sqltools.editor.core;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jpt.utility;bundle-version="[1.2.0,2.0.0)"
-Export-Package: org.eclipse.jpt.db,
- org.eclipse.jpt.db.internal;x-internal:=true
diff --git a/jpa/plugins/org.eclipse.jpt.db/about.html b/jpa/plugins/org.eclipse.jpt.db/about.html
deleted file mode 100644
index be534ba..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/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>May 02, 2008</P>
-
-<H3>License</H3>
-
-<P>The Eclipse Foundation makes available all content in this plug-in 
-("Content"). Unless otherwise indicated below, the Content is provided to you 
-under the terms and conditions of the Eclipse Public License Version 1.0 
-("EPL"). A copy of the EPL is available at
-<A href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/org/documents/epl-v10.php</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-
-<P>If you did not receive this Content directly from the Eclipse Foundation, the 
-Content is being redistributed by another party ("Redistributor") and different 
-terms and conditions may apply to your use of any object code in the Content. 
-Check the Redistributor's license that was provided with the Content. If no such 
-license exists, contact the Redistributor. Unless otherwise indicated below, the 
-terms and conditions of the EPL still apply to any source code in the Content 
-and such source code may be obtained at
-<A href="http://www.eclipse.org/">http://www.eclipse.org/</A>.</P>
-
-</BODY>
-</HTML>
diff --git a/jpa/plugins/org.eclipse.jpt.db/build.properties b/jpa/plugins/org.eclipse.jpt.db/build.properties
deleted file mode 100644
index 974eada..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/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
-###############################################################################
-javacSource=1.5
-javacTarget=1.5
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               about.html,\
-               plugin.properties
-jars.compile.order = .
diff --git a/jpa/plugins/org.eclipse.jpt.db/component.xml b/jpa/plugins/org.eclipse.jpt.db/component.xml
deleted file mode 100644
index 644c396..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/component.xml
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><component  xmlns="http://eclipse.org/wtp/releng/tools/component-model" name="org.eclipse.jpt.db"><description url=""></description><component-depends unrestricted="true"></component-depends><plugin id="org.eclipse.jpt.db" fragment="false"/></component>
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.db/plugin.properties b/jpa/plugins/org.eclipse.jpt.db/plugin.properties
deleted file mode 100644
index e87a2d3..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/plugin.properties
+++ /dev/null
@@ -1,25 +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
-###############################################################################
-# ====================================================================
-# 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 API Tools - DB
-providerName = Eclipse.org
-
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Catalog.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Catalog.java
deleted file mode 100644
index 2db19a8..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Catalog.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 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;
-
-/**
- * Database catalog
- * 
- * Provisional API: This interface is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- * 
- * This interface is not intended to be implemented by clients.
- */
-public interface Catalog extends Comparable<Catalog> {
-
-	/**
-	 * Return the catalog's name.
-	 */
-	String getName();
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Column.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Column.java
deleted file mode 100644
index 99af66d..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Column.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 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;
-
-import org.eclipse.jpt.utility.JavaType;
-
-/**
- * Database column
- * 
- * Provisional API: This interface is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- * 
- * This interface is not intended to be implemented by clients.
- */
-public interface Column extends Comparable<Column> {
-
-	/**
-	 * Return the column's name.
-	 */
-	String getName();
-
-	/**
-	 * Return the name of the column's datatype.
-	 */
-	String getDataTypeName();
-
-	/**
-	 * Return a Java-appropriate version of the column's name.
-	 */
-	String getJavaFieldName();
-
-	/**
-	 * Return whether the column's name matches the specified Java identifier,
-	 * respecting the database's case-sensitivity.
-	 */
-	boolean matchesJavaFieldName(String javaFieldName);
-
-	/**
-	 * Return a Java type declaration that is reasonably
-	 * similar to the column's data type and suitable for use as a
-	 * primary key field.
-	 */
-	String getPrimaryKeyJavaTypeDeclaration();
-
-	/**
-	 * Return a Java type that is reasonably
-	 * similar to the column's data type and suitable for use as a
-	 * primary key field.
-	 */
-	JavaType getPrimaryKeyJavaType();
-
-	/**
-	 * Return a Java type declaration that is reasonably
-	 * similar to the column's data type.
-	 */
-	String getJavaTypeDeclaration();
-
-	/**
-	 * Return a Java type that is reasonably
-	 * similar to the column's data type.
-	 */
-	JavaType getJavaType();
-
-	/**
-	 * Return whether the column's datatype is a LOB type
-	 * (i.e. BLOB, CLOB, or NCLOB).
-	 */
-	boolean dataTypeIsLOB();
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionAdapter.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionAdapter.java
deleted file mode 100644
index 9728489..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionAdapter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 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;
-
-
-/**
- * An empty implementation of ConnectionListener.
- * 
- * Provisional API: This class is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- */
-public class ConnectionAdapter implements ConnectionListener {
-
-	public void aboutToClose(ConnectionProfile profile) {
-		// do nothing
-	}
-
-	public void closed(ConnectionProfile profile) {
-		// do nothing
-	}
-
-	public void databaseChanged(ConnectionProfile profile, Database database) {
-		// do nothing
-	}
-
-	public void modified(ConnectionProfile profile) {
-		// do nothing
-	}
-
-	public boolean okToClose(ConnectionProfile profile) {
-		return true;
-	}
-
-	public void opened(ConnectionProfile profile) {
-		// do nothing
-	}
-
-	public void catalogChanged(ConnectionProfile profile, Catalog catalog) {
-		// do nothing
-	}
-
-	public void schemaChanged(ConnectionProfile profile, Schema schema) {
-		// do nothing
-	}
-
-	public void sequenceChanged(ConnectionProfile profile, Sequence sequence) {
-		// do nothing
-	}
-
-	public void tableChanged(ConnectionProfile profile, Table table) {
-		// do nothing
-	}
-
-	public void columnChanged(ConnectionProfile profile, Column column) {
-		// do nothing
-	}
-
-	public void foreignKeyChanged(ConnectionProfile profile, ForeignKey foreignKey) {
-		// do nothing
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionListener.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionListener.java
deleted file mode 100644
index 879ba1b..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionListener.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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;
-
-
-/**
- * A ConnectionListener is notified of any changes to a connection.
- * 
- * @see org.eclipse.datatools.connectivity.IManagedConnectionListener
- * 
- * Provisional API: This interface is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- */
-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 databaseChanged(ConnectionProfile profile, Database database);
-	public void catalogChanged(ConnectionProfile profile, Catalog catalog);
-	public void schemaChanged(ConnectionProfile profile, Schema schema);
-	public void sequenceChanged(ConnectionProfile profile, Sequence sequence);
-	public void tableChanged(ConnectionProfile profile, Table table);
-	public void columnChanged(ConnectionProfile profile, Column column);
-	public void foreignKeyChanged(ConnectionProfile profile, ForeignKey foreignKey);
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionProfile.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionProfile.java
deleted file mode 100644
index 8388f58..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionProfile.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 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;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.datatools.connectivity.drivers.jdbc.IJDBCDriverDefinitionConstants;
-
-/**
- * Database connection profile
- * 
- * Provisional API: This interface is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- * 
- * This interface is not intended to be implemented by clients.
- */
-public interface ConnectionProfile extends Comparable<ConnectionProfile> {
-
-	/**
-	 * Return the connection profile's name.
-	 */
-	String getName();
-
-	/**
-	 * Return the connection profile's database.
-	 * Return a "null" database if the connection profile is inactive.
-	 */
-	Database getDatabase();
-
-	/**
-	 * Return the connection profile's "default" catalog.
-	 * Return null if the connection profile's database does not support
-	 * catalogs.
-	 */
-	Catalog getDefaultCatalog();
-
-	/**
-	 * Return the connection profile's default schema.
-	 * In most cases the default schema's name will match the user name.
-	 * It may be null.
-	 */
-	Schema getDefaultSchema();
-
-	/**
-	 * Return ID of the provider managing the DTP profile.
-	 */
-	String getProviderID();
-
-	/**
-	 * Return the connection profile's static ID.
-	 */
-	String getInstanceID();
-
-	/**
-	 * Return the default database name.
-	 */
-	String getDatabaseName();
-
-	/**
-	 * Return the database product name.
-	 */
-	String getDatabaseProduct();
-
-	/**
-	 * Return the database vendor.
-	 */
-	String getDatabaseVendor();
-
-	/**
-	 * Return the database version.
-	 */
-	String getDatabaseVersion();
-
-	/**
-	 * Return the driver class name.
-	 */
-	String getDriverClassName();
-
-	/**
-	 * Return the default connection URL.
-	 */
-	String getUrl();
-
-	/**
-	 * Return the default user name.
-	 */
-	String getUserName();
-
-	/**
-	 * Return the default user password.
-	 */
-	String getUserPassword();
-
-	/**
-	 * Return the driver definition ID.
-	 */
-	String getDriverDefinitionID();
-
-	/**
-	 * Return the jar list for the driver instance as a 
-	 * comma-delimited string.
-	 */
-	String getDriverJarList();
-
-	/**
-	 * Return whether the profile is either connected to a live database
-	 * session or working off-line (i.e. it has access to meta-data).
-	 * @see isConnected()
-	 * @see isWorkingOfflin()
-	 */
-	boolean isActive();
-
-	/**
-	 * Return whether the profile is connected to a live database session
-	 * (i.e. the meta-data comes from the database), as opposed to working
-	 * off-line.
-	 * @see #isActive()
-	 */
-	boolean isConnected();
-
-	/**
-	 * Connect to the database.
-	 */
-	void connect();
-
-	/**
-	 * Disconnect from the database.
-	 */
-	void disconnect();
-
-	/**
-	 * Return whether the profile is working off-line (i.e. the meta-data
-	 * comes from a local cache), as opposed to connected to a live
-	 * database session.
-	 * @see #isActive()
-	 */
-	boolean isWorkingOffline();
-
-	/**
-	 * Return whether the connection factories associated with the
-	 * connection profile's provider support working offline.
-	 */
-	boolean supportsWorkOfflineMode();
-
-	/**
-	 * Save 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.
-	 */
-	IStatus saveWorkOfflineData();
-
-	/**
-	 * Return whether the connection profile supports working offline and data
-	 * has been saved for working offline.
-	 */
-	boolean canWorkOffline();
-
-	/**
-	 * Begin working off-line.
-	 */
-	IStatus workOffline();
-
-	/**
-	 * Return whether the connection profile is a "null" connection profile.
-	 */
-	boolean isNull();
-
-	/**
-	 * Add the specified connection listener to the connection profile.
-	 */
-	void addConnectionListener(ConnectionListener listener);
-
-	/**
-	 * Remove the specified connection listener from the connection profile.
-	 */
-	void removeConnectionListener(ConnectionListener listener);
-
-	String CONNECTION_PROFILE_TYPE = "org.eclipse.datatools.connectivity.db.generic.connectionProfile";  //$NON-NLS-1$
-	String DRIVER_DEFINITION_PROP_ID = "org.eclipse.datatools.connectivity.driverDefinitionID";  //$NON-NLS-1$
-	String DRIVER_DEFINITION_TYPE_PROP_ID = "org.eclipse.datatools.connectivity.drivers.defnType";  //$NON-NLS-1$
-	String DRIVER_JAR_LIST_PROP_ID = "jarList";  //$NON-NLS-1$
-	String DATABASE_SAVE_PWD_PROP_ID = IJDBCDriverDefinitionConstants.PROP_PREFIX + "savePWD";  //$NON-NLS-1$
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionProfileAdapter.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionProfileAdapter.java
deleted file mode 100644
index fb5c601..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionProfileAdapter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 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;
-
-/**
- * An empty implementation of ProfileListener.
- * 
- * Provisional API: This class is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- */
-public class ConnectionProfileAdapter implements ConnectionProfileListener {
-
-	public void connectionProfileChanged(ConnectionProfile profile) {
-		// do nothing
-	}
-
-	public void connectionProfileReplaced(ConnectionProfile oldProfile, ConnectionProfile newProfile) {
-		// do nothing
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionProfileListener.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionProfileListener.java
deleted file mode 100644
index 89f6207..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionProfileListener.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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;
-
-/**
- * A ProfileListener is notified of any changes to the connection profiles.
- * 
- * @see org.eclipse.datatools.connectivity.IProfileListener
- * 
- * Provisional API: This interface is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- */
-public interface ConnectionProfileListener {
-
-	/**
-	 * The specified old profile has been replaced with the specified
-	 * new profile. The old profile is a "null" profile when a profile is
-	 * added. The new profile is a "null" profile when a profile is
-	 * removed.
-	 */
-	public void connectionProfileReplaced(ConnectionProfile oldProfile, ConnectionProfile newProfile);
-
-	/**
-	 * The specified profile has been modified. Modification includes
-	 * changes to any properties, the name, auto-connect flag, etc.
-	 */
-	public void connectionProfileChanged(ConnectionProfile profile);
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionProfileRepository.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionProfileRepository.java
deleted file mode 100644
index 8f37291..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ConnectionProfileRepository.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 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;
-
-import java.util.Iterator;
-
-/**
- * Database connection profile repository
- * 
- * Provisional API: This interface is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- * 
- * This interface is not intended to be implemented by clients.
- */
-public interface ConnectionProfileRepository {
-
-	/**
-	 * Return the repository's connection profiles.
-	 */
-	Iterator<ConnectionProfile> connectionProfiles();
-
-	/**
-	 * Return the number of connection profiles in the repository.
-	 */
-	int connectionProfilesSize();
-
-	/**
-	 * Return the repository's connection profile names.
-	 */
-	Iterator<String> connectionProfileNames();
-
-	/**
-	 * Return whether the repository contains a connection profile
-	 * with the specified name.
-	 */
-	boolean containsConnectionProfileNamed(String name);
-
-	/**
-	 * Return the connection profile with the specified name.
-	 * Return a "null" connection profile if the repository does not
-	 * have a connection profile with the specified name.
-	 */
-	ConnectionProfile connectionProfileNamed(String name);
-
-	/**
-	 * Add a listener that will be notified of changes to the repository's
-	 * connection profiles.
-	 */
-	void addConnectionProfileListener(ConnectionProfileListener listener);
-
-	/**
-	 * Remove the specified listener.
-	 */
-	void removeConnectionProfileListener(ConnectionProfileListener listener);
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Database.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Database.java
deleted file mode 100644
index e4e19ba..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Database.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 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;
-
-import java.util.Iterator;
-import org.eclipse.datatools.connectivity.sqm.core.definition.DatabaseDefinition;
-
-/**
- * Database
- * 
- * Provisional API: This interface is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- * 
- * This interface is not intended to be implemented by clients.
- */
-public interface Database extends SchemaContainer, Comparable<Database> {
-
-	/**
-	 * Return the database's name.
-	 */
-	String getName();
-
-	/**
-	 * Return the database's vendor.
-	 */
-	String getVendor();
-
-	/**
-	 * Return the database's version.
-	 */
-	String getVersion();
-
-	/**
-	 * Return whether the database's identifiers are case-sensitive.
-	 */
-	boolean isCaseSensitive();
-
-	/**
-	 * Return the database's DTP database definition.
-	 */
-	DatabaseDefinition getDtpDefinition();
-
-	/**
-	 * Return whether the database supports catalogs.
-	 */
-	boolean supportsCatalogs();
-
-	/**
-	 * Return the database's catalogs.
-	 */
-	Iterator<Catalog> catalogs();
-
-	/**
-	 * Return the number of catalogs the database contains.
-	 */
-	int catalogsSize();
-
-	/**
-	 * Return the names of the database's catalogs.
-	 */
-	Iterator<String> catalogNames();
-
-	/**
-	 * Return whether the database contains a catalog with the specified name,
-	 * respecting the database's case-sensitivity.
-	 */
-	boolean containsCatalogNamed(String name);
-
-	/**
-	 * Return the catalog in the database with the specified name,
-	 * respecting the database's case-sensitivity.
-	 */
-	Catalog catalogNamed(String name);
-
-	/**
-	 * Return the database's "default" catalog.
-	 */
-	Catalog getDefaultCatalog();
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ForeignKey.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ForeignKey.java
deleted file mode 100644
index 3215cfd..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/ForeignKey.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 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;
-
-import java.util.Iterator;
-
-/**
- * Database foreign key
- * 
- * Provisional API: This interface is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- * 
- * This interface is not intended to be implemented by clients.
- */
-public interface ForeignKey extends Comparable<ForeignKey> {
-
-	/**
-	 * Return the foreign key's name.
-	 */
-	String getName();
-
-	/**
-	 * Return the foreign key's "base" table.
-	 */
-	Table getBaseTable();
-
-	/**
-	 * Return the foreign key's "referenced" table.
-	 */
-	Table getReferencedTable();
-
-	/**
-	 * Return the foreign key's column pairs.
-	 * @see ColumnPair
-	 */
-	Iterator<ColumnPair> columnPairs();
-
-	/**
-	 * Return the foreign key's single column pair. Throw an
-	 * IllegalStateException if the foreign key has more than one column pair.
-	 */
-	ColumnPair columnPair();
-
-	/**
-	 * Return the size of the foreign key's column pairs.
-	 * @see ColumnPair
-	 */
-	int columnPairsSize();
-
-	/**
-	 * Return the foreign key's "base" columns.
-	 * @see ColumnPair
-	 */
-	Iterator<Column> baseColumns();
-
-	/**
-	 * Return the foreign key's "base" columns that are not part of
-	 * the base table's primary key.
-	 * @see ColumnPair
-	 */
-	Iterator<Column> nonPrimaryKeyBaseColumns();
-
-	/**
-	 * Return the foreign key's "referenced" columns.
-	 * @see ColumnPair
-	 */
-	Iterator<Column> referencedColumns();
-
-	/**
-	 * Return a Java-appropriate name for a field that holds the entity
-	 * mapped to the foreign key's "referenced" table.
-	 */
-	String getJavaFieldName();
-
-	/**
-	 * Return whether the foreign key's default Java field name matches the
-	 * specified Java identifier, respecting the database's case-sensitivity.
-	 */
-	boolean defaultMatchesJavaFieldName(String javaFieldName);
-
-	/**
-	 * Return whether the foreign key is the default for the specified Java
-	 * field name, respecting the database's case-sensitivity.
-	 */
-	boolean isDefaultFor(String javaFieldName);
-
-	/**
-	 * Return whether the foreign key references the primary key of the
-	 * "referenced" table and that primary key has only a single column.
-	 */
-	boolean referencesSingleColumnPrimaryKey();
-
-
-	/**
-	 * Pair up the foreign key's column pairs, matching each "base" column with
-	 * the appropriate "referenced" column.
-	 * @see #columnPairs()
-	 */
-	interface ColumnPair extends Comparable<ColumnPair> {
-
-		/**
-		 * Return the column pair's "base" column.
-		 */
-		Column baseColumn();
-
-		/**
-		 * Return the column pair's "referenced" column.
-		 */
-		Column referencedColumn();
-
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/JptDbPlugin.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/JptDbPlugin.java
deleted file mode 100644
index 00aa478..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/JptDbPlugin.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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;
-
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.jpt.db.internal.DTPConnectionProfileRepository;
-import org.osgi.framework.BundleContext;
-
-/**
- * The JPT DB plug-in lifecycle implementation.
- * Globally available connection profile repository.
- * 
- * Provisional API: This class is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- */
-public class JptDbPlugin extends Plugin {
-	private DTPConnectionProfileRepository connectionProfileRepository;
-
-	private static JptDbPlugin INSTANCE;  // sorta-final
-
-	/**
-	 * Return the singleton JPT DB plug-in.
-	 */
-	public static JptDbPlugin instance() {
-		return INSTANCE;
-	}
-
-	/**
-	 * The constructor
-	 */
-	public JptDbPlugin() {
-		super();
-		INSTANCE = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	@Override
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		this.connectionProfileRepository = DTPConnectionProfileRepository.instance();
-        this.connectionProfileRepository.start();
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		this.connectionProfileRepository.stop();
-		this.connectionProfileRepository = null;
-		INSTANCE = null;
-		super.stop(context);
-	}
-
-	public ConnectionProfileRepository getConnectionProfileRepository() {
-		return this.connectionProfileRepository;
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Schema.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Schema.java
deleted file mode 100644
index 2b13ece..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Schema.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 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;
-
-import java.util.Iterator;
-
-
-/**
- * Database schema
- * 
- * Provisional API: This interface is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- * 
- * This interface is not intended to be implemented by clients.
- */
-public interface Schema extends Comparable<Schema> {
-
-	/**
-	 * Return the schema's name.
-	 */
-	String getName();
-
-	/**
-	 * Return the schema's tables.
-	 */
-	Iterator<Table> tables();
-
-	/**
-	 * Return the number of tables the schema contains.
-	 */
-	int tablesSize();
-
-	/**
-	 * Return the names of the schema's tables.
-	 */
-	Iterator<String> tableNames();
-
-	/**
-	 * Return whether the schema contains a table with the specified name,
-	 * respecting the database's case-sensitivity.
-	 */
-	boolean containsTableNamed(String name);
-
-	/**
-	 * Return the table in the schema with the specified name,
-	 * respecting the database's case-sensitivity.
-	 */
-	Table tableNamed(String name);
-
-	/**
-	 * Return the schema's sequences.
-	 */
-	Iterator<Sequence> sequences();
-
-	/**
-	 * Return the number of sequences the schema contains.
-	 */
-	int sequencesSize();
-
-	/**
-	 * Return the names of the schema's sequences.
-	 */
-	Iterator<String> sequenceNames();
-
-	/**
-	 * Return whether the schema contains a sequence with the specified name,
-	 * respecting the database's case-sensitivity.
-	 */
-	boolean containsSequenceNamed(String name);
-
-	/**
-	 * Return the sequence in the schema with the specified name,
-	 * respecting the database's case-sensitivity.
-	 */
-	Sequence sequenceNamed(String name);
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/SchemaContainer.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/SchemaContainer.java
deleted file mode 100644
index 5289561..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/SchemaContainer.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 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;
-
-import java.util.Iterator;
-
-/**
- * Schema "container" (i.e. Database or Catalog)
- * 
- * Provisional API: This interface is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- * 
- * This interface is not intended to be implemented by clients.
- */
-public interface SchemaContainer {
-
-	/**
-	 * Return the container's schemata.
-	 */
-	Iterator<Schema> schemata();
-
-	/**
-	 * Return the number of schemata in the container.
-	 */
-	int schemataSize();
-
-	/**
-	 * Return the names of the container's schemata.
-	 */
-	Iterator<String> schemaNames();
-
-	/**
-	 * Return whether the container contains a schema with the specified name,
-	 * respecting the database's case-sensitivity.
-	 */
-	boolean containsSchemaNamed(String name);
-
-	/**
-	 * Return the schema in the container with the specified name,
-	 * respecting the database's case-sensitivity.
-	 */
-	Schema schemaNamed(String name);
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Sequence.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Sequence.java
deleted file mode 100644
index bd024a0..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Sequence.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 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;
-
-/**
- * Database sequence
- * 
- * Provisional API: This interface is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- * 
- * This interface is not intended to be implemented by clients.
- */
-public interface Sequence extends Comparable<Sequence> {
-
-	/**
-	 * Return the sequence's name.
-	 */
-	String getName();
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Table.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Table.java
deleted file mode 100644
index 2273973..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/Table.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 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;
-
-import java.util.Iterator;
-
-/**
- * Database table
- * 
- * Provisional API: This interface is part of an interim API that is still
- * under development and expected to change significantly before reaching
- * stability. It is available at this early stage to solicit feedback from
- * pioneering adopters on the understanding that any code that uses this API
- * will almost certainly be broken (repeatedly) as the API evolves.
- * 
- * This interface is not intended to be implemented by clients.
- */
-public interface Table extends Comparable<Table> {
-
-	/**
-	 * Return the table's name.
-	 */
-	String getName();
-
-	/**
-	 * Return the table's columns.
-	 */
-	Iterator<Column> columns();
-
-	/**
-	 * Return the number of columns the table contains.
-	 */
-	int columnsSize();
-
-	/**
-	 * Return the names of the table's columns.
-	 */
-	Iterator<String> columnNames();
-
-	/**
-	 * Return whether the table contains a column with the specified name,
-	 * respecting the database's case-sensitivity.
-	 */
-	boolean containsColumnNamed(String name);
-
-	/**
-	 * Return the column in the table with the specified name,
-	 * respecting the database's case-sensitivity.
-	 */
-	Column columnNamed(String name);
-
-	/**
-	 * Return the table's primary key columns.
-	 */
-	Iterator<Column> primaryKeyColumns();
-
-	/**
-	 * Return the table's single primary key column. Throw an
-	 * IllegalStateException if the table has more than one primary key column.
-	 */
-	Column primaryKeyColumn();
-
-	/**
-	 * Return the number of primary key columns the table contains.
-	 */
-	int primaryKeyColumnsSize();
-
-	/**
-	 * Return whether the specified column is one of the table's primary key
-	 * columns.
-	 */
-	boolean primaryKeyColumnsContains(Column column);
-
-	/**
-	 * Return the table's foreign keys.
-	 */
-	Iterator<ForeignKey> foreignKeys();
-
-	/**
-	 * Return the number of foreign keys the table contains.
-	 */
-	int foreignKeysSize();
-
-	/**
-	 * Return whether the specified column is a "base" column
-	 * for any of the table's foreign keys.
-	 */
-	boolean foreignKeyBaseColumnsContains(Column column);
-
-	/**
-	 * Return the table's name, converted to a Java-appropriate class
-	 * identifier, respecting the database's case-sensitivity.
-	 */
-	String getShortJavaClassName();
-
-	/**
-	 * Return whether the table's name matches the specified Java-appropriate
-	 * identifier, respecting the database's case-sensitivity.
-	 */
-	boolean matchesShortJavaClassName(String shortJavaClassName);
-
-	/**
-	 * Return the table's name, converted to a Java-appropriate field
-	 * identifier, respecting the database's case-sensitivity.
-	 */
-	public String getJavaFieldName();
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/ConnectionProfileHolder.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/ConnectionProfileHolder.java
deleted file mode 100644
index f106e91..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/ConnectionProfileHolder.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 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.internal;
-
-/**
- * Provide a way for clients to access the connection profile.
- */
-interface ConnectionProfileHolder {
-	DTPConnectionProfileWrapper getConnectionProfile();
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPCatalogWrapper.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPCatalogWrapper.java
deleted file mode 100644
index 1319675..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPCatalogWrapper.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 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.internal;
-
-import java.text.Collator;
-import java.util.List;
-
-import org.eclipse.jpt.db.Catalog;
-
-/**
- * Wrap a DTP Catalog
- */
-final class DTPCatalogWrapper
-	extends DTPSchemaContainerWrapper
-	implements Catalog
-{
-	// backpointer to parent
-	private final DTPDatabaseWrapper database;
-
-	// the wrapped DTP catalog
-	private final org.eclipse.datatools.modelbase.sql.schema.Catalog dtpCatalog;
-
-
-	// ********** constructor **********
-
-	DTPCatalogWrapper(DTPDatabaseWrapper database, org.eclipse.datatools.modelbase.sql.schema.Catalog dtpCatalog) {
-		super(database, dtpCatalog);
-		this.database = database;
-		this.dtpCatalog = dtpCatalog;
-	}
-
-
-	// ********** DTPWrapper implementation **********
-
-	@Override
-	synchronized void catalogObjectChanged(int eventType) {
-		super.catalogObjectChanged(eventType);
-		this.getConnectionProfile().catalogChanged(this, eventType);
-	}
-
-
-	// ********** Catalog implementation **********
-
-	@Override
-	public String getName() {
-		return this.dtpCatalog.getName();
-	}
-
-
-	// ***** schemata
-
-	@Override
-	@SuppressWarnings("unchecked")
-	List<org.eclipse.datatools.modelbase.sql.schema.Schema> dtpSchemata() {
-		return this.dtpCatalog.getSchemas();
-	}
-
-
-	// ********** internal methods **********
-
-	boolean wraps(org.eclipse.datatools.modelbase.sql.schema.Catalog catalog) {
-		return this.dtpCatalog == catalog;
-	}
-
-	@Override
-	boolean isCaseSensitive() {
-		return this.database.isCaseSensitive();
-	}
-
-	@Override
-	DTPDatabaseWrapper database() {
-		return this.database;
-	}
-
-
-	// ********** Comparable implementation **********
-
-	public int compareTo(Catalog catalog) {
-		return Collator.getInstance().compare(this.getName(), catalog.getName());
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPColumnWrapper.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPColumnWrapper.java
deleted file mode 100644
index 2c32477..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPColumnWrapper.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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.internal;
-
-import java.text.Collator;
-
-import org.eclipse.datatools.modelbase.dbdefinition.PredefinedDataTypeDefinition;
-import org.eclipse.datatools.modelbase.sql.datatypes.DataType;
-import org.eclipse.datatools.modelbase.sql.datatypes.PredefinedDataType;
-import org.eclipse.datatools.modelbase.sql.datatypes.PrimitiveType;
-import org.eclipse.jpt.db.Column;
-import org.eclipse.jpt.utility.JavaType;
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.internal.NameTools;
-import org.eclipse.jpt.utility.internal.SimpleJavaType;
-
-/**
- *  Wrap a DTP Column
- */
-final class DTPColumnWrapper
-	extends DTPWrapper
-	implements Column
-{
-	// backpointer to parent
-	private final DTPTableWrapper table;
-
-	// the wrapped DTP column
-	private final org.eclipse.datatools.modelbase.sql.tables.Column dtpColumn;
-
-
-	// ***** some constants used when converting the column to a Java field
-	// TODO Object is the default?
-	private static final JavaType DEFAULT_JAVA_TYPE = new SimpleJavaType(java.lang.Object.class);
-
-	private static final JavaType BLOB_JAVA_TYPE = new SimpleJavaType(java.sql.Blob.class);
-	private static final JavaType BYTE_ARRAY_JAVA_TYPE = new SimpleJavaType(byte[].class);
-
-	private static final JavaType CLOB_JAVA_TYPE = new SimpleJavaType(java.sql.Clob.class);
-	private static final JavaType STRING_JAVA_TYPE = new SimpleJavaType(java.lang.String.class);
-
-	private static final JavaType UTIL_DATE_JAVA_TYPE = new SimpleJavaType(java.util.Date.class);
-	private static final JavaType SQL_DATE_JAVA_TYPE = new SimpleJavaType(java.sql.Date.class);
-	private static final JavaType SQL_TIME_JAVA_TYPE = new SimpleJavaType(java.sql.Time.class);
-	private static final JavaType SQL_TIMESTAMP_JAVA_TYPE = new SimpleJavaType(java.sql.Timestamp.class);
-
-	private static final JavaType BIG_DECIMAL_JAVA_TYPE = new SimpleJavaType(java.math.BigDecimal.class);
-	private static final JavaType LONG_JAVA_TYPE = new SimpleJavaType(long.class);
-
-
-	// ********** constructor **********
-
-	DTPColumnWrapper(DTPTableWrapper table, org.eclipse.datatools.modelbase.sql.tables.Column dtpColumn) {
-		super(table, dtpColumn);
-		this.table = table;
-		this.dtpColumn = dtpColumn;
-	}
-
-
-	// ********** DTPWrapper implementation **********
-
-	@Override
-	synchronized void catalogObjectChanged(int eventType) {
-		this.getConnectionProfile().columnChanged(this, eventType);
-	}
-
-
-	// ********** Column implementation **********
-
-	@Override
-	public String getName() {
-		return this.dtpColumn.getName();
-	}
-
-	public String getDataTypeName() {
-		DataType dataType = this.dtpColumn.getDataType();
-		return (dataType == null) ? null : dataType.getName();
-	}
-
-	public String getJavaFieldName() {
-		String jName = this.getName();
-		if ( ! this.isCaseSensitive()) {
-			jName = jName.toLowerCase();
-		}
-		return NameTools.convertToJavaIdentifier(jName);
-	}
-
-	public boolean matchesJavaFieldName(String javaFieldName) {
-		return this.isCaseSensitive() ?
-			this.getName().equals(javaFieldName)
-		:
-			this.getName().equalsIgnoreCase(javaFieldName);
-	}
-
-	public String getPrimaryKeyJavaTypeDeclaration() {
-		return this.getPrimaryKeyJavaType().declaration();
-	}
-
-	public JavaType getPrimaryKeyJavaType() {
-		return this.jpaSpecCompliantPrimaryKeyJavaType(this.getJavaType());
-	}
-
-	/**
-	 * The JPA spec [2.1.4] says only the following types are allowed in
-	 * primary key fields:
-	 *     [variable] primitives
-	 *     [variable] primitive wrappers
-	 *     java.lang.String
-	 *     java.util.Date
-	 *     java.sql.Date
-	 */
-	private JavaType jpaSpecCompliantPrimaryKeyJavaType(JavaType javaType) {
-		if (javaType.isVariablePrimitive()
-				|| javaType.isVariablePrimitiveWrapper()
-				|| javaType.equals(STRING_JAVA_TYPE)
-				|| javaType.equals(UTIL_DATE_JAVA_TYPE)
-				|| javaType.equals(SQL_DATE_JAVA_TYPE)) {
-			return javaType;
-		}
-		if (javaType.equals(BIG_DECIMAL_JAVA_TYPE)) {
-			return LONG_JAVA_TYPE;  // ??
-		}
-		if (javaType.equals(SQL_TIME_JAVA_TYPE)) {
-			return UTIL_DATE_JAVA_TYPE;  // ???
-		}
-		if (javaType.equals(SQL_TIMESTAMP_JAVA_TYPE)) {
-			return UTIL_DATE_JAVA_TYPE;  // ???
-		}
-		// all the other typical types are pretty much un-mappable - return String(?)
-		return STRING_JAVA_TYPE;
-	}
-
-	public String getJavaTypeDeclaration() {
-		return this.getJavaType().declaration();
-	}
-
-	public JavaType getJavaType() {
-		DataType dataType = this.dtpColumn.getDataType();
-		return (dataType instanceof PredefinedDataType) ?
-			this.jpaSpecCompliantJavaType(this.javaType((PredefinedDataType) dataType))
-		:
-			DEFAULT_JAVA_TYPE;
-	}
-
-	private JavaType javaType(PredefinedDataType dataType) {
-		// this is just a bit hacky: moving from a type declaration to a class name to a type declaration...
-		String dtpJavaClassName = this.predefinedDataTypeDefinition(dataType).getJavaClassName();
-		return new SimpleJavaType(ClassTools.classNameForTypeDeclaration(dtpJavaClassName));
-	}
-
-	private PredefinedDataTypeDefinition predefinedDataTypeDefinition(PredefinedDataType dataType) {
-		return this.database().getDtpDefinition().getPredefinedDataTypeDefinition(dataType.getName());
-	}
-
-	/**
-	 * The JDBC spec says JDBC drivers should be able to map BLOBs and CLOBs
-	 * directly, but the JPA spec does not allow them.
-	 */
-	private JavaType jpaSpecCompliantJavaType(JavaType javaType) {
-		if (javaType.equals(BLOB_JAVA_TYPE)) {
-			return BYTE_ARRAY_JAVA_TYPE;
-		}
-		if (javaType.equals(CLOB_JAVA_TYPE)) {
-			return STRING_JAVA_TYPE;
-		}
-		return javaType;
-	}
-
-	public boolean dataTypeIsLOB() {
-		DataType dataType = this.dtpColumn.getDataType();
-		return (dataType instanceof PredefinedDataType) ?
-			this.primitiveTypeIsLob(((PredefinedDataType) dataType).getPrimitiveType())
-		:
-			false;
-	}
-
-	private boolean primitiveTypeIsLob(PrimitiveType primitiveType) {
-		return (primitiveType == PrimitiveType.BINARY_LARGE_OBJECT_LITERAL)
-				|| (primitiveType == PrimitiveType.CHARACTER_LARGE_OBJECT_LITERAL)
-				|| (primitiveType == PrimitiveType.NATIONAL_CHARACTER_LARGE_OBJECT_LITERAL);
-	}
-
-
-	// ********** Comparable implementation **********
-
-	public int compareTo(Column column) {
-		return Collator.getInstance().compare(this.getName(), column.getName());
-	}
-
-
-	// ********** internal methods **********
-
-	boolean wraps(org.eclipse.datatools.modelbase.sql.tables.Column column) {
-		return this.dtpColumn == column;
-	}
-
-	boolean isCaseSensitive() {
-		return this.table.isCaseSensitive();
-	}
-
-	DTPDatabaseWrapper database() {
-		return this.table.database();
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPConnectionProfileRepository.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPConnectionProfileRepository.java
deleted file mode 100644
index eebb5a1..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPConnectionProfileRepository.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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.internal;
-
-import java.util.Iterator;
-import java.util.Vector;
-
-import org.eclipse.datatools.connectivity.IConnectionProfile;
-import org.eclipse.datatools.connectivity.IProfileListener;
-import org.eclipse.datatools.connectivity.ProfileManager;
-import org.eclipse.jpt.db.ConnectionProfile;
-import org.eclipse.jpt.db.ConnectionProfileRepository;
-import org.eclipse.jpt.db.ConnectionProfileListener;
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.internal.iterators.CloneIterator;
-import org.eclipse.jpt.utility.internal.iterators.TransformationIterator;
-
-/**
- * Wrap the DTP ProfileManager.
- */
-public final class DTPConnectionProfileRepository
-	implements ConnectionProfileRepository
-{
-	private ProfileManager dtpProfileManager;
-
-	private LocalProfileListener profileListener;
-
-	private Vector<DTPConnectionProfileWrapper> connectionProfiles;
-
-
-	// ********** singleton **********
-
-	private static final DTPConnectionProfileRepository INSTANCE = new DTPConnectionProfileRepository();
-
-	public static DTPConnectionProfileRepository instance() {
-		return INSTANCE;
-	}
-
-	/**
-	 * 'private' to ensure singleton
-	 */
-	private DTPConnectionProfileRepository() {
-		super();
-	}
-
-
-	// ********** lifecycle **********
-
-	/**
-	 * called by plug-in
-	 */
-	public synchronized void start() {
-		this.dtpProfileManager = ProfileManager.getInstance();
-		this.profileListener = new LocalProfileListener();
-	}
-
-	/**
-	 * called by plug-in
-	 */
-	public synchronized void stop() {
-		if (this.connectionProfiles != null) {
-			for (DTPConnectionProfileWrapper profile : this.connectionProfiles) {
-				profile.dispose();
-			}
-			this.dtpProfileManager.removeProfileListener(this.profileListener);
-			this.connectionProfiles = null;
-		}
-		this.profileListener = null;
-		this.dtpProfileManager = null;
-	}
-
-
-	// ********** profiles **********
-
-	private synchronized Vector<DTPConnectionProfileWrapper> getConnectionProfiles() {
-		if (this.connectionProfiles == null) {
-			this.connectionProfiles = this.buildConnectionProfiles();
-			//Add the profile listener after initializing the profiles; otherwise we end up
-			//with duplicate connection profiles.  The DTP #loadProfiles() method both
-			//loads the profiles and fires event notification for each added profile.
-			//This is a temporary measure for bug 246948 and we can hopefully get DTP
-			//to fix the underlying issue.
-			this.dtpProfileManager.addProfileListener(this.profileListener);
-		}
-		return this.connectionProfiles;
-	}
-
-	private Vector<DTPConnectionProfileWrapper> buildConnectionProfiles() {
-		Vector<DTPConnectionProfileWrapper> profiles = new Vector<DTPConnectionProfileWrapper>();
-		for (IConnectionProfile dtpProfile : this.dtpProfileManager.getProfiles()) {
-			profiles.add(new DTPConnectionProfileWrapper(dtpProfile));
-		}
-		return profiles;
-	}
-
-	public synchronized Iterator<ConnectionProfile> connectionProfiles() {
-		return new CloneIterator<ConnectionProfile>(this.getConnectionProfiles());  // read-only
-	}
-
-	private synchronized Iterator<DTPConnectionProfileWrapper> connectionProfileWrappers() {
-		return new CloneIterator<DTPConnectionProfileWrapper>(this.getConnectionProfiles());  // read-only
-	}
-
-	public int connectionProfilesSize() {
-		return this.getConnectionProfiles().size();
-	}
-
-	public Iterator<String> connectionProfileNames() {
-		return new TransformationIterator<DTPConnectionProfileWrapper, String>(this.connectionProfileWrappers()) {
-			@Override
-			protected String transform(DTPConnectionProfileWrapper profile) {
-				 return profile.getName();
-			}
-		};
-	}
-
-	public boolean containsConnectionProfileNamed(String name) {
-		return ! this.connectionProfileNamed(name).isNull();
-	}
-
-	public ConnectionProfile connectionProfileNamed(String name) {
-		for (Iterator<DTPConnectionProfileWrapper> stream = this.connectionProfileWrappers(); stream.hasNext(); ) {
-			DTPConnectionProfileWrapper profile = stream.next();
-			if (profile.getName().equals(name)) {
-				return profile;
-			}
-		}
-		return NullConnectionProfile.instance();
-	}
-
-	synchronized DTPConnectionProfileWrapper addConnectionProfile(IConnectionProfile dtpConnectionProfile) {
-		for (DTPConnectionProfileWrapper wrapper : this.getConnectionProfiles()) {
-			if (wrapper.wraps(dtpConnectionProfile)) {
-				throw new IllegalStateException("duplicate connection profile: " + dtpConnectionProfile.getName());  //$NON-NLS-1$
-			}
-		}
-		DTPConnectionProfileWrapper wrapper = new DTPConnectionProfileWrapper(dtpConnectionProfile);
-		this.getConnectionProfiles().add(wrapper);
-		return wrapper;
-	}
-
-	synchronized DTPConnectionProfileWrapper removeConnectionProfile(IConnectionProfile dtpConnectionProfile) {
-		for (Iterator<DTPConnectionProfileWrapper> stream = this.getConnectionProfiles().iterator(); stream.hasNext(); ) {
-			DTPConnectionProfileWrapper wrapper = stream.next();
-			if (wrapper.wraps(dtpConnectionProfile)) {
-				stream.remove();
-				return wrapper;
-			}
-		}
-		throw new IllegalStateException("invalid connection profile: " + dtpConnectionProfile.getName());  //$NON-NLS-1$
-	}
-
-	synchronized DTPConnectionProfileWrapper connectionProfile(IConnectionProfile dtpConnectionProfile) {
-		for (DTPConnectionProfileWrapper wrapper : this.getConnectionProfiles()) {
-			if (wrapper.wraps(dtpConnectionProfile)) {
-				return wrapper;
-			}
-		}
-		throw new IllegalStateException("invalid connection profile: " + dtpConnectionProfile.getName());  //$NON-NLS-1$
-	}
-
-
-	// ********** Object overrides **********
-
-	@Override
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		sb.append(ClassTools.toStringClassNameForObject(this));
-		sb.append((this.connectionProfiles != null) ? this.connectionProfiles : "<'connectionProfiles' uninitialized>");  //$NON-NLS-1$
-		return sb.toString();
-	}
-
-
-	// ********** listeners **********
-
-	public void addConnectionProfileListener(ConnectionProfileListener listener) {
-		this.profileListener.addConnectionProfileListener(listener);
-	}
-
-	public void removeConnectionProfileListener(ConnectionProfileListener listener) {
-		this.profileListener.removeConnectionProfileListener(listener);
-	}
-
-
-	// ********** listener **********
-
-	/**
-	 * Keep the repository in synch with the DTP profile manager
-	 * and forward events to the repository's listeners.
-	 */
-	private class LocalProfileListener implements IProfileListener {
-		private Vector<ConnectionProfileListener> listeners = new Vector<ConnectionProfileListener>();
-
-		LocalProfileListener() {
-			super();
-		}
-
-		void addConnectionProfileListener(ConnectionProfileListener listener) {
-			this.listeners.add(listener);
-		}
-
-		void removeConnectionProfileListener(ConnectionProfileListener listener) {
-			this.listeners.remove(listener);
-		}
-
-		private Iterator<ConnectionProfileListener> listeners() {
-			return new CloneIterator<ConnectionProfileListener>(this.listeners);
-		}
-
-		// ********** IProfileListener implementation **********
-
-		public void profileAdded(IConnectionProfile dtpProfile) {
-			// synch the repository then notify listeners
-			DTPConnectionProfileWrapper profile = DTPConnectionProfileRepository.this.addConnectionProfile(dtpProfile);
-			for (Iterator<ConnectionProfileListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().connectionProfileReplaced(NullConnectionProfile.instance(), profile);
-			}
-		}
-
-		public void profileChanged(IConnectionProfile dtpProfile) {
-			DTPConnectionProfileWrapper profile = DTPConnectionProfileRepository.this.connectionProfile(dtpProfile);
-			for (Iterator<ConnectionProfileListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().connectionProfileChanged(profile);
-			}
-		}
-
-		public void profileDeleted(IConnectionProfile dtpProfile) {
-			// synch the repository then notify listeners
-			DTPConnectionProfileWrapper profile = DTPConnectionProfileRepository.this.removeConnectionProfile(dtpProfile);
-			for (Iterator<ConnectionProfileListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().connectionProfileReplaced(profile, NullConnectionProfile.instance());
-			}
-		}
-
-	}
-
-}
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
deleted file mode 100644
index 742f344..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPConnectionProfileWrapper.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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.internal;
-
-import java.text.Collator;
-import java.util.Iterator;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.datatools.connectivity.ConnectEvent;
-import org.eclipse.datatools.connectivity.IConnectionProfile;
-import org.eclipse.datatools.connectivity.IManagedConnection;
-import org.eclipse.datatools.connectivity.IManagedConnectionOfflineListener;
-import org.eclipse.datatools.connectivity.drivers.DriverManager;
-import org.eclipse.datatools.connectivity.drivers.jdbc.IJDBCDriverDefinitionConstants;
-import org.eclipse.datatools.connectivity.sqm.core.connection.ConnectionInfo;
-import org.eclipse.datatools.sqltools.core.DatabaseIdentifier;
-import org.eclipse.datatools.sqltools.core.profile.ProfileUtil;
-import org.eclipse.jpt.db.ConnectionListener;
-import org.eclipse.jpt.db.ConnectionProfile;
-import org.eclipse.jpt.db.Schema;
-import org.eclipse.jpt.utility.internal.StringTools;
-import org.eclipse.jpt.utility.internal.iterators.CloneIterator;
-
-/**
- *  Wrap a DTP ConnectionProfile
- */
-final class DTPConnectionProfileWrapper
-	implements ConnectionProfile, ConnectionProfileHolder
-{
-	// the wrapped DTP connection profile
-	private final IConnectionProfile dtpConnectionProfile;
-
-	// the DTP managed connection we listen to
-	private final IManagedConnection dtpManagedConnection;
-
-	// forward events from the DTP connection profile's managed connections
-	private final LocalConnectionListener connectionListener;
-
-	// lazy-initialized - can be a "null" database
-	private InternalDatabase database;
-
-
-	// ********** constants **********
-
-	public static final String LIVE_DTP_CONNECTION_TYPE = "java.sql.Connection";  //$NON-NLS-1$
-
-	public static final String OFFLINE_DTP_CONNECTION_TYPE = ConnectionInfo.class.getName();
-
-	public static final String DATABASE_PRODUCT_PROP_ID = "org.eclipse.datatools.connectivity.server.version";  //$NON-NLS-1$
-
-	public static final String POSTGRESQL_VENDOR = "postgres";  //$NON-NLS-1$
-
-	public static final String POSTGRESQL_DEFAULT_SCHEMA_NAME = "public";  //$NON-NLS-1$
-
-
-	// ********** constructor **********
-
-	DTPConnectionProfileWrapper(IConnectionProfile dtpConnectionProfile) {
-		super();
-		this.dtpConnectionProfile = dtpConnectionProfile;
-		this.dtpManagedConnection = this.buildDTPManagedConnection();
-		this.connectionListener = new LocalConnectionListener();
-		this.dtpManagedConnection.addConnectionListener(this.connectionListener);
-	}
-
-	private IManagedConnection buildDTPManagedConnection() {
-		String connectionType = this.dtpConnectionProfile.supportsWorkOfflineMode() ?
-				OFFLINE_DTP_CONNECTION_TYPE : LIVE_DTP_CONNECTION_TYPE;
-		return this.dtpConnectionProfile.getManagedConnection(connectionType);
-	}
-
-
-	// ********** ConnectionProfileHolder implementation **********
-
-	public DTPConnectionProfileWrapper getConnectionProfile() {
-		return this;
-	}
-
-
-	// ********** ConnectionProfile implementation **********
-
-	public String getName() {
-		return this.dtpConnectionProfile.getName();
-	}
-
-	public boolean isNull() {
-		return false;
-	}
-
-	public void connect() {
-		if (this.isDisconnected()) {
-			this.checkStatus(this.dtpConnectionProfile.connect());
-		}
-	}
-	
-	public void disconnect() {
-		this.checkStatus(this.dtpConnectionProfile.disconnect());
-	}
-
-	public boolean isActive() {
-		return this.isConnected() || this.isWorkingOffline();
-	}
-
-	public boolean isInactive() {
-		return ! this.isActive();
-	}
-
-	public boolean isConnected() {
-		return this.dtpManagedConnection.isConnected()
-				&& ! this.dtpManagedConnection.isWorkingOffline();
-	}
-
-	public boolean isDisconnected() {
-		return ! this.isConnected();
-	}
-
-	public boolean isWorkingOffline() {
-		return this.dtpManagedConnection.isWorkingOffline();
-	}
-
-	public boolean supportsWorkOfflineMode() {
-		return this.dtpConnectionProfile.supportsWorkOfflineMode();
-	}
-
-	public boolean canWorkOffline() {
-		return this.dtpConnectionProfile.canWorkOffline();
-	}
-
-	public IStatus saveWorkOfflineData() {
-		return this.dtpConnectionProfile.saveWorkOfflineData();
-	}
-	
-	public IStatus workOffline() {
-		return this.dtpConnectionProfile.workOffline();
-	}
-	
-	public String getDatabaseVendor() {
-		return this.getProperty(IJDBCDriverDefinitionConstants.DATABASE_VENDOR_PROP_ID);
-	}
-
-	public String getDatabaseName() {
-		return this.getProperty(IJDBCDriverDefinitionConstants.DATABASE_NAME_PROP_ID);
-	}
-
-	public String getDatabaseProduct() {
-		return this.getProperty(DATABASE_PRODUCT_PROP_ID);
-	}
-
-	public String getDatabaseVersion() {
-		return this.getProperty(IJDBCDriverDefinitionConstants.DATABASE_VERSION_PROP_ID);
-	}
-
-	public String getUserName() {
-		String userName = this.getProperty(IJDBCDriverDefinitionConstants.USERNAME_PROP_ID);
-		if (userName.contains(" ")){
-			return userName.split("\\s")[0];
-		}
-		return userName;
-	}
-
-	public String getUserPassword() {
-		return this.getProperty(IJDBCDriverDefinitionConstants.PASSWORD_PROP_ID);
-	}
-
-	public synchronized InternalDatabase getDatabase() {
-		if (this.database == null) {
-			this.database = this.buildDatabase();
-		}
-		return this.database;
-	}
-
-	public DTPCatalogWrapper getDefaultCatalog() {
-		return this.getDatabase().getDefaultCatalog();
-	}
-
-	public void addConnectionListener(ConnectionListener listener) {
-		this.connectionListener.addConnectionListener(listener);
-	}
-
-	public void removeConnectionListener(ConnectionListener listener) {
-		this.connectionListener.removeConnectionListener(listener);
-	}
-
-	public Schema getDefaultSchema() {
-		return this.getDatabase().schemaNamed(this.getDefaultSchemaName());
-	}
-
-	public String getDriverClassName() {
-		return this.getProperty(IJDBCDriverDefinitionConstants.DRIVER_CLASS_PROP_ID);
-	}
-
-	public String getUrl() {
-		return this.getProperty(IJDBCDriverDefinitionConstants.URL_PROP_ID);
-	}
-
-	public String getInstanceID() {
-		return this.dtpConnectionProfile.getInstanceID();
-	}
-
-	public String getProviderID() {
-		return this.dtpConnectionProfile.getProviderId();
-	}
-
-	public String getDriverDefinitionID() {
-		return this.getProperty(DRIVER_DEFINITION_PROP_ID);
-	}
-
-	public String getDriverJarList() {
-		return DriverManager.getInstance().getDriverInstanceByID(this.getDriverDefinitionID()).getJarList();
-	}
-
-
-	// ********** internal methods **********
-
-	private void checkStatus(IStatus status) {
-		if (status.isOK()) {
-			return;
-		}
-		if (status.isMultiStatus()) {
-			status = status.getChildren()[0];  // take the first one?
-		}
-		throw new RuntimeException(status.getMessage(), status.getException());
-	}
-
-	private InternalDatabase buildDatabase() {
-		if (this.isInactive()) {
-			return NullDatabase.instance();
-		}
-
-		if (this.isWorkingOffline()) {
-			ConnectionInfo connectionInfo = (ConnectionInfo) this.dtpManagedConnection.getConnection().getRawConnection();
-			return new DTPDatabaseWrapper(this, connectionInfo.getSharedDatabase());
-		}
-
-		// 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 to handle hackery there
-		return new DTPDatabaseWrapper(this, ProfileUtil.getDatabase(new DatabaseIdentifier(this.getName(), this.getDatabaseName()), true));
-	}
-	
-	boolean wraps(IConnectionProfile dtpCP) {
-		return this.dtpConnectionProfile == dtpCP;
-	}
-
-	void databaseChanged(DTPDatabaseWrapper db, int eventType) {
-		this.connectionListener.databaseChanged(db, eventType);
-	}
-
-	void catalogChanged(DTPCatalogWrapper catalog, int eventType) {
-		this.connectionListener.catalogChanged(catalog, eventType);
-	}
-
-	void schemaChanged(DTPSchemaWrapper schema, int eventType) {
-		this.connectionListener.schemaChanged(schema, eventType);
-	}
-
-	void sequenceChanged(DTPSequenceWrapper sequence, int eventType) {
-		this.connectionListener.sequenceChanged(sequence, eventType);
-	}
-
-	void tableChanged(DTPTableWrapper table, int eventType) {
-		this.connectionListener.tableChanged(table, eventType);
-	}
-
-	void columnChanged(DTPColumnWrapper column, int eventType) {
-		this.connectionListener.columnChanged(column, eventType);
-	}
-
-	void foreignKeyChanged(DTPForeignKeyWrapper foreignKey, int eventType) {
-		this.connectionListener.foreignKeyChanged(foreignKey, eventType);
-	}
-
-	/**
-	 * private - use #getDefaultSchema() : Schema instead
-	 */
-	private String getDefaultSchemaName() {
-		if (this.getDatabase().getVendor().equalsIgnoreCase(POSTGRESQL_VENDOR)) {
-			return POSTGRESQL_DEFAULT_SCHEMA_NAME;
-		}
-		return this.getUserName();
-	}
-
-	private String getProperty(String propertyName) {
-		return this.dtpConnectionProfile.getBaseProperties().getProperty(propertyName);
-	}
-
-
-	// ********** disposal **********
-
-	synchronized void dispose() {
-		this.disposeDatabase();
-		this.dtpManagedConnection.removeConnectionListener(this.connectionListener);
-	}
-
-	synchronized void disposeDatabase() {
-		if (this.database != null) {
-			this.database.dispose();
-			this.database = null;
-		}
-	}
-
-
-	// ********** Comparable implementation **********
-
-	public int compareTo(ConnectionProfile connectionProfile) {
-		return Collator.getInstance().compare(this.getName(), connectionProfile.getName());
-	}
-
-
-	// ********** overrides **********
-
-	@Override
-	public String toString() {
-		return StringTools.buildToStringFor(this, this.getName());
-	}
-
-
-	// ********** DTP connection listener **********
-
-	/**
-	 * This listener translates and forwards IManagedConnectionListener and
-	 * IManagedConnectionOfflineListener events to ConnectionListeners.
-	 */
-	private class LocalConnectionListener implements IManagedConnectionOfflineListener {
-		private Vector<ConnectionListener> listeners = new Vector<ConnectionListener>();
-
-		LocalConnectionListener() {
-			super();
-		}
-
-		void addConnectionListener(ConnectionListener listener) {
-			this.listeners.add(listener);
-		}
-
-		void removeConnectionListener(ConnectionListener listener) {
-			this.listeners.remove(listener);
-		}
-
-		private Iterator<ConnectionListener> listeners() {
-			return new CloneIterator<ConnectionListener>(this.listeners);
-		}
-
-
-		// ********** IManagedConnectionListener implementation **********
-
-		public void opened(ConnectEvent event) {
-			// clear the (possibly "null") database so it will be rebuilt with the "live" data
-			DTPConnectionProfileWrapper.this.disposeDatabase();
-			// forward event to listeners
-			for (Iterator<ConnectionListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().opened(DTPConnectionProfileWrapper.this);
-			}
-		}
-
-		/**
-		 * This method is never called from the base DTP code.
-		 * Perhaps DTP extenders call it....
-		 * @see ManagedConnection#fireModifiedEvent(Object)
-		 *     which is never called...
-		 */
-		public void modified(ConnectEvent event) {
-			// forward event to listeners
-			for (Iterator<ConnectionListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().modified(DTPConnectionProfileWrapper.this);
-			}
-		}
-
-		public boolean okToClose(ConnectEvent event) {
-			// forward event to listeners
-			for (Iterator<ConnectionListener> stream = this.listeners(); stream.hasNext(); ) {
-				if ( ! stream.next().okToClose(DTPConnectionProfileWrapper.this)) {
-					return false;
-				}
-			}
-			return true;
-		}
-
-		public void aboutToClose(ConnectEvent event) {
-			// forward event to listeners
-			for (Iterator<ConnectionListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().aboutToClose(DTPConnectionProfileWrapper.this);
-			}
-		}
-
-		public void closed(ConnectEvent event) {
-			// clear the database
-			DTPConnectionProfileWrapper.this.disposeDatabase();
-			// forward event to listeners
-			for (Iterator<ConnectionListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().closed(DTPConnectionProfileWrapper.this);
-			}
-		}
-
-
-		// ********** IManagedConnectionOfflineListener implementation **********
-
-		// live => off-line
-		public boolean okToDetach(ConnectEvent event) {
-			// don't forward the event to listeners (?)
-			return true;
-		}
-		
-		// live => off-line
-		public void aboutToDetach(ConnectEvent event) {
-			// don't forward the event; the database will be cleared and
-			// listeners will be notified once the "offline" connection is "opened/workingOffline"
-		}
-
-		// live => off-line
-		public void workingOffline(ConnectEvent event) {
-			// clear the (possibly null) database so it will be rebuilt with the "off-line" data
-			DTPConnectionProfileWrapper.this.disposeDatabase();
-			// convert the event to an "open" event and forward it to listeners
-			for (Iterator<ConnectionListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().opened(DTPConnectionProfileWrapper.this);
-			}
-		}
-
-		// off-line => live
-		public void aboutToAttach(ConnectEvent event) {
-			// don't forward the event; the database will be cleared and
-			// listeners will be notified once the "live" connection is "opened"
-		}
-
-
-		// ********** internal methods **********
-
-		void databaseChanged(DTPDatabaseWrapper db, int eventType) {
-			for (Iterator<ConnectionListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().databaseChanged(DTPConnectionProfileWrapper.this, db);
-			}
-		}
-
-		void catalogChanged(DTPCatalogWrapper catalog, int eventType) {
-			for (Iterator<ConnectionListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().catalogChanged(DTPConnectionProfileWrapper.this, catalog);
-			}
-		}
-
-		void schemaChanged(DTPSchemaWrapper schema, int eventType) {
-			for (Iterator<ConnectionListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().schemaChanged(DTPConnectionProfileWrapper.this, schema);
-			}
-		}
-
-		void sequenceChanged(DTPSequenceWrapper sequence, int eventType) {
-			for (Iterator<ConnectionListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().sequenceChanged(DTPConnectionProfileWrapper.this, sequence);
-			}
-		}
-
-		void tableChanged(DTPTableWrapper table, int eventType) {
-			for (Iterator<ConnectionListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().tableChanged(DTPConnectionProfileWrapper.this, table);
-			}
-		}
-
-		void columnChanged(DTPColumnWrapper column, int eventType) {
-			for (Iterator<ConnectionListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().columnChanged(DTPConnectionProfileWrapper.this, column);
-			}
-		}
-
-		void foreignKeyChanged(DTPForeignKeyWrapper foreignKey, int eventType) {
-			for (Iterator<ConnectionListener> stream = this.listeners(); stream.hasNext(); ) {
-				stream.next().foreignKeyChanged(DTPConnectionProfileWrapper.this, foreignKey);
-			}
-		}
-
-	}
-
-}
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
deleted file mode 100644
index 911d334..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPDatabaseWrapper.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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.internal;
-
-import java.text.Collator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.datatools.connectivity.sqm.core.definition.DatabaseDefinition;
-import org.eclipse.datatools.connectivity.sqm.internal.core.RDBCorePlugin;
-import org.eclipse.jpt.db.Catalog;
-import org.eclipse.jpt.db.Database;
-import org.eclipse.jpt.utility.internal.StringTools;
-import org.eclipse.jpt.utility.internal.iterators.ArrayIterator;
-import org.eclipse.jpt.utility.internal.iterators.TransformationIterator;
-
-/**
- * Wrap a DTP Database.
- * Sometimes the database will directly hold schemata; but if the database
- * supports catalogs, it will not hold the schemata directly, but will delegate
- * to the "default" catalog.
- */
-final class DTPDatabaseWrapper
-	extends DTPSchemaContainerWrapper
-	implements InternalDatabase
-{
-	// backpointer to parent
-	private final DTPConnectionProfileWrapper connectionProfile;
-
-	// the wrapped DTP database
-	private final org.eclipse.datatools.modelbase.sql.schema.Database dtpDatabase;
-
-	// lazy-initialized
-	private DTPCatalogWrapper[] catalogs;
-
-	// lazy-initialized
-	private DTPCatalogWrapper defaultCatalog;
-	private boolean defaultCatalogCalculated = false;
-
-	// TODO allow user to configure?
-	private boolean caseSensitive = false;
-
-
-	private static final DTPCatalogWrapper[] EMPTY_CATALOGS = new DTPCatalogWrapper[0];
-
-
-	// ********** constructor **********
-
-	DTPDatabaseWrapper(DTPConnectionProfileWrapper connectionProfile, org.eclipse.datatools.modelbase.sql.schema.Database dtpDatabase) {
-		super(connectionProfile, dtpDatabase);
-		this.connectionProfile = connectionProfile;
-		this.dtpDatabase = dtpDatabase;
-	}
-
-
-	// ********** DTPWrapper implementation **********
-
-	@Override
-	synchronized void catalogObjectChanged(int eventType) {
-		super.catalogObjectChanged(eventType);
-		this.getConnectionProfile().databaseChanged(this, eventType);
-	}
-
-
-	// ********** Database implementation **********
-
-	@Override
-	public String getName() {
-		return this.dtpDatabase.getName();
-	}
-
-	public String getVendor() {
-		return this.dtpDatabase.getVendor();
-	}
-
-	public String getVersion() {
-		return this.dtpDatabase.getVersion();
-	}
-
-	public DatabaseDefinition getDtpDefinition() {
-		return RDBCorePlugin.getDefault().getDatabaseDefinitionRegistry().getDefinition(this.dtpDatabase);
-	}
-
-	// ***** caseSensitive
-
-	@Override
-	public boolean isCaseSensitive() {
-		return this.caseSensitive;
-	}
-
-	// TODO
-	public void setCaseSensitive(boolean caseSensitive) {
-		this.caseSensitive = caseSensitive;
-	}
-
-	// ***** catalogs
-
-	public boolean supportsCatalogs() {
-		// if the DTP database does not have any schemata, it must have catalogs...
-		List<org.eclipse.datatools.modelbase.sql.schema.Schema> dtpSchemata = this.dtpSchemata();
-		return (dtpSchemata == null) || dtpSchemata.isEmpty();
-	}
-
-	public Iterator<Catalog> catalogs() {
-		return new ArrayIterator<Catalog>(this.catalogs_());
-	}
-
-	private Iterator<DTPCatalogWrapper> catalogWrappers() {
-		return new ArrayIterator<DTPCatalogWrapper>(this.catalogs_());
-	}
-
-	private synchronized DTPCatalogWrapper[] catalogs_() {
-		if (this.catalogs == null) {
-			this.catalogs = this.buildCatalogs();
-		}
-		return this.catalogs;
-	}
-
-	private DTPCatalogWrapper[] buildCatalogs() {
-		List<org.eclipse.datatools.modelbase.sql.schema.Catalog> dtpCatalogs = this.dtpCatalogs();
-		if ((dtpCatalogs == null) || dtpCatalogs.isEmpty()) {
-			return EMPTY_CATALOGS;
-		}
-		DTPCatalogWrapper[] result = new DTPCatalogWrapper[dtpCatalogs.size()];
-		for (int i = result.length; i-- > 0;) {
-			result[i] = new DTPCatalogWrapper(this, dtpCatalogs.get(i));
-		}
-		return result;
-	}
-
-	// minimize scope of suppressed warnings
-	@SuppressWarnings("unchecked")
-	private List<org.eclipse.datatools.modelbase.sql.schema.Catalog> dtpCatalogs() {
-		return this.dtpDatabase.getCatalogs();
-	}
-
-	public int catalogsSize() {
-		return this.catalogs_().length;
-	}
-
-	public Iterator<String> catalogNames() {
-		return new TransformationIterator<DTPCatalogWrapper, String>(this.catalogWrappers()) {
-			@Override
-			protected String transform(DTPCatalogWrapper catalog) {
-				 return catalog.getName();
-			}
-		};
-	}
-
-	public boolean containsCatalogNamed(String name) {
-		return this.catalogNamed(name) != null;
-	}
-
-	public DTPCatalogWrapper catalogNamed(String name) {
-		return this.isCaseSensitive() ? this.catalogNamedCaseSensitive(name) : this.catalogNamedIgnoreCase(name);
-	}
-	
-	private DTPCatalogWrapper catalogNamedCaseSensitive(String name) {
-		for (Iterator<DTPCatalogWrapper> stream = this.catalogWrappers(); stream.hasNext(); ) {
-			DTPCatalogWrapper catalog = stream.next();
-			if (catalog.getName().equals(name)) {
-				return catalog;
-			}
-		}
-		return null;
-	}
-	
-	private DTPCatalogWrapper catalogNamedIgnoreCase(String name) {
-		for (Iterator<DTPCatalogWrapper> stream = this.catalogWrappers(); stream.hasNext(); ) {
-			DTPCatalogWrapper catalog = stream.next();
-			if (StringTools.stringsAreEqualIgnoreCase(catalog.getName(), name)) {
-				return catalog;
-			}
-		}
-		return null;
-	}
-
-	public synchronized DTPCatalogWrapper getDefaultCatalog() {
-		if ( ! this.defaultCatalogCalculated) {
-			this.defaultCatalogCalculated = true;
-			this.defaultCatalog = this.buildDefaultCatalog();
-		}
-		return this.defaultCatalog;
-	}
-
-	private DTPCatalogWrapper buildDefaultCatalog() {
-		if ( ! this.supportsCatalogs()) {
-			return null;
-		}
-		String userName = this.connectionProfile.getUserName();
-		for (Iterator<DTPCatalogWrapper> stream = this.catalogWrappers(); stream.hasNext(); ) {
-			DTPCatalogWrapper catalog = stream.next();
-			if (catalog.getName().length() == 0) {
-				return catalog;  // special catalog that contains all schemata
-			}
-			if (catalog.getName().equals(userName)) {
-				return catalog;  // user name is default catalog
-			}
-			if (catalog.getName().equals(this.getName())) {
-				return catalog;  // special catalog with same name as DB (PostgreSQL)
-			}
-		}
-		throw new IllegalStateException("unknown default catalog");  //$NON-NLS-1$
-	}
-
-	/**
-	 * return the catalog for the specified DTP catalog
-	 */
-	DTPCatalogWrapper catalog(org.eclipse.datatools.modelbase.sql.schema.Catalog dtpCatalog) {
-		for (Iterator<DTPCatalogWrapper> stream = this.catalogWrappers(); stream.hasNext(); ) {
-			DTPCatalogWrapper catalog = stream.next();
-			if (catalog.wraps(dtpCatalog)) {
-				return catalog;
-			}
-		}
-		throw new IllegalArgumentException("invalid DTP catalog: " + dtpCatalog);  //$NON-NLS-1$
-	}
-
-	// ***** schemata
-
-	@Override
-	@SuppressWarnings("unchecked")
-	List<org.eclipse.datatools.modelbase.sql.schema.Schema> dtpSchemata() {
-		return this.dtpDatabase.getSchemas();
-	}
-
-	@Override
-	synchronized DTPSchemaWrapper[] schemata_() {
-		return (this.supportsCatalogs()) ?
-			this.getDefaultCatalog().schemata_()
-		:
-			super.schemata_();
-	}
-
-
-	// ********** Comparable implementation **********
-
-	public int compareTo(Database database) {
-		return Collator.getInstance().compare(this.getName(), database.getName());
-	}
-
-
-	// ********** internal methods **********
-
-	boolean wraps(org.eclipse.datatools.modelbase.sql.schema.Database database) {
-		return this.dtpDatabase == database;
-	}
-
-	/**
-	 * return the table for the specified DTP table
-	 */
-	DTPTableWrapper table(org.eclipse.datatools.modelbase.sql.tables.Table dtpTable) {
-		return this.schema(dtpTable.getSchema()).table(dtpTable);
-	}
-
-	/**
-	 * return the column for the specified DTP column
-	 */
-	DTPColumnWrapper column(org.eclipse.datatools.modelbase.sql.tables.Column dtpColumn) {
-		return this.table(dtpColumn.getTable()).column(dtpColumn);
-	}
-
-	@Override
-	DTPDatabaseWrapper database() {
-		return this;
-	}
-	
-
-	// ********** disposal **********
-
-	// must be public because it is defined in InternalDatabase interface
-	@Override
-	public synchronized void dispose() {
-		super.dispose();
-	}
-
-	@Override
-	void dispose_() {
-		this.defaultCatalogCalculated = false;
-		this.defaultCatalog = null;
-		this.disposeCatalogs();
-		super.dispose_();
-	}
-
-	private void disposeCatalogs() {
-		if (this.catalogs != null) {
-			for (DTPCatalogWrapper catalog : this.catalogs) {
-				catalog.dispose();
-			}
-			this.catalogs = null;
-		}
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPForeignKeyWrapper.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPForeignKeyWrapper.java
deleted file mode 100644
index 74478ae..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPForeignKeyWrapper.java
+++ /dev/null
@@ -1,362 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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.internal;
-
-import java.text.Collator;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jpt.db.Column;
-import org.eclipse.jpt.db.ForeignKey;
-import org.eclipse.jpt.utility.internal.CollectionTools;
-import org.eclipse.jpt.utility.internal.StringTools;
-import org.eclipse.jpt.utility.internal.iterators.ArrayIterator;
-import org.eclipse.jpt.utility.internal.iterators.FilteringIterator;
-import org.eclipse.jpt.utility.internal.iterators.TransformationIterator;
-
-/**
- *  Wrap a DTP ForeignKey
- */
-final class DTPForeignKeyWrapper
-	extends DTPWrapper
-	implements ForeignKey
-{
-	// backpointer to parent
-	private final DTPTableWrapper baseTable;
-
-	// the wrapped DTP foreign key
-	private final org.eclipse.datatools.modelbase.sql.constraints.ForeignKey dtpForeignKey;
-
-	// lazy-initialized
-	private DTPTableWrapper referencedTable;
-
-	// lazy-initialized
-	private LocalColumnPair[] columnPairs;
-
-	// lazy-initialized
-	private String defaultEntityFieldName;
-	private boolean defaultEntityFieldNameCalculated = false;
-
-
-	// ********** constructor **********
-
-	DTPForeignKeyWrapper(DTPTableWrapper baseTable, org.eclipse.datatools.modelbase.sql.constraints.ForeignKey dtpForeignKey) {
-		super(baseTable, dtpForeignKey);
-		this.baseTable = baseTable;
-		this.dtpForeignKey = dtpForeignKey;
-	}
-
-
-	// ********** DTPWrapper implementation **********
-
-	@Override
-	synchronized void catalogObjectChanged(int eventType) {
-		// clear stuff so it will be rebuilt
-		this.dispose_();
-		this.getConnectionProfile().foreignKeyChanged(this, eventType);
-	}
-
-
-	// ********** ForeignKey implementation **********
-
-	@Override
-	public String getName() {
-		return this.dtpForeignKey.getName();
-	}
-
-	public DTPTableWrapper getBaseTable() {
-		return this.baseTable;
-	}
-
-	public synchronized DTPTableWrapper getReferencedTable() {
-		if (this.referencedTable == null) {
-			this.referencedTable = this.baseTable.table(this.dtpForeignKey.getUniqueConstraint().getBaseTable());
-		}
-		return this.referencedTable;
-	}
-
-	// ***** column pairs
-
-	public Iterator<ColumnPair> columnPairs() {
-		return new ArrayIterator<ColumnPair>(this.columnPairs_());
-	}
-
-	public LocalColumnPair columnPair() {
-		LocalColumnPair[] pairs = this.columnPairs_();
-		if (pairs.length != 1) {
-			throw new IllegalStateException("multiple column pairs: " + pairs.length);  //$NON-NLS-1$
-		}
-		return pairs[0];
-	}
-
-	private Iterator<LocalColumnPair> localColumnPairs() {
-		return new ArrayIterator<LocalColumnPair>(this.columnPairs_());
-	}
-
-	private synchronized LocalColumnPair[] columnPairs_() {
-		if (this.columnPairs == null) {
-			this.columnPairs = this.buildColumnPairs();
-		}
-		return this.columnPairs;
-	}
-
-	private LocalColumnPair[] buildColumnPairs() {
-		List<org.eclipse.datatools.modelbase.sql.tables.Column> baseColumns = this.dtpBaseColumns();
-		int size = baseColumns.size();
-		List<org.eclipse.datatools.modelbase.sql.tables.Column> refColumns = this.dtpRefColumns();
-		if (refColumns.size() != size) {
-			throw new IllegalStateException(this.getBaseTable().getName() + "." + this.getName() +  //$NON-NLS-1$
-								" - mismatched sizes: " + size + " vs. " + refColumns.size());  //$NON-NLS-1$  //$NON-NLS-2$
-		}
-		LocalColumnPair[] result = new LocalColumnPair[baseColumns.size()];
-		for (int i = baseColumns.size(); i-- > 0; ) {
-			DTPColumnWrapper baseColumn = this.baseTable.column(baseColumns.get(i));
-			DTPColumnWrapper refColumn = this.baseTable.column(refColumns.get(i));
-			result[i] = new LocalColumnPair(baseColumn, refColumn);
-		}
-		return result;
-	}
-
-	// minimize scope of suppressed warnings
-	@SuppressWarnings("unchecked")
-	private List<org.eclipse.datatools.modelbase.sql.tables.Column> dtpBaseColumns() {
-		return this.dtpForeignKey.getMembers();
-	}
-
-	// minimize scope of suppressed warnings
-	@SuppressWarnings("unchecked")
-	private List<org.eclipse.datatools.modelbase.sql.tables.Column> dtpRefColumns() {
-		return this.dtpForeignKey.getUniqueConstraint().getMembers();
-	}
-
-	public int columnPairsSize() {
-		return this.columnPairs_().length;
-	}
-
-	public Iterator<Column> baseColumns() {
-		return new TransformationIterator<LocalColumnPair, Column>(this.localColumnPairs()) {
-			@Override
-			protected Column transform(LocalColumnPair pair) {
-				return pair.baseColumn();
-			}
-		};
-	}
-
-	boolean baseColumnsContains(Column column) {
-		return CollectionTools.contains(this.baseColumns(), column);
-	}
-
-	public Iterator<Column> nonPrimaryKeyBaseColumns() {
-		return new FilteringIterator<Column, Column>(this.baseColumns()) {
-			@Override
-			protected boolean accept(Column column) {
-				return ! DTPForeignKeyWrapper.this.getBaseTable().primaryKeyColumnsContains(column);
-			}
-		};
-	}
-
-	public Iterator<Column> referencedColumns() {
-		return new TransformationIterator<LocalColumnPair, Column>(this.localColumnPairs()) {
-			@Override
-			protected Column transform(LocalColumnPair columnPair) {
-				return columnPair.referencedColumn();
-			}
-		};
-	}
-
-	// ***** default entity field name
-
-	/**
-	 * If the name of the "base" column adheres to the EJB standard for a
-	 * default mapping (i.e. it ends with an underscore followed by the name
-	 * of the "referenced" column, and the "referenced" column is the single
-	 * primary key column of the "referenced" table), return the corresponding
-	 * default entity field name:
-	 *     ForeignKey(EMP.CUBICLE_ID => CUBICLE.ID) => "CUBICLE"
-	 * Return a null if it does not adhere to the EJB standard:
-	 *     ForeignKey(EMP.CUBICLE_ID => CUBICLE.CUBICLE_ID) => null
-	 */
-	private synchronized String defaultEntityFieldName() {
-		if ( ! this.defaultEntityFieldNameCalculated) {
-			this.defaultEntityFieldNameCalculated = true;
-			this.defaultEntityFieldName = this.buildDefaultEntityFieldName();
-		}
-		return this.defaultEntityFieldName;
-	}
-
-	/**
-	 * @see #defaultEntityFieldName()
-	 */
-	private String buildDefaultEntityFieldName() {
-		if ( ! this.referencesSingleColumnPrimaryKey()) {
-			return null;
-		}
-		LocalColumnPair columnPair = this.columnPairs_()[0];
-		String baseColName = columnPair.baseColumn().getName();
-		String refColName = columnPair.referencedColumn().getName();
-		if (baseColName.length() <= (refColName.length() + 1)) {
-			return null;
-		}
-		if ( ! baseColName.endsWith(refColName)) {
-			return null;
-		}
-		int _index = baseColName.length() - refColName.length() - 1;
-		if (baseColName.charAt(_index) != '_') {
-			return null;
-		}
-		String name = baseColName.substring(0, _index);
-		return this.isCaseSensitive() ? name : name.toLowerCase();
-	}
-
-	// ***** miscellaneous
-
-	public String getJavaFieldName() {
-		String fieldName = this.defaultEntityFieldName();
-		return (fieldName != null) ? fieldName : this.nonDefaultEntityFieldName();
-	}
-
-	public boolean defaultMatchesJavaFieldName(String javaFieldName) {
-		return this.isCaseSensitive() ?
-			javaFieldName.equals(this.defaultEntityFieldName())
-		:
-			javaFieldName.equalsIgnoreCase(this.defaultEntityFieldName());
-	}
-
-	public boolean isDefaultFor(String javaFieldName) {
-		if (this.columnPairsSize() != 1) {
-			return false;
-		}
-
-		if (this.getReferencedTable().primaryKeyColumnsSize() != 1) {
-			return false;
-		}
-
-		LocalColumnPair columnPair = this.columnPairs_()[0];
-		Column pkColumn = this.getReferencedTable().primaryKeyColumn();
-		if (columnPair.referencedColumn() != pkColumn) {
-			return false;
-		}
-
-		return columnPair.baseColumn().matchesJavaFieldName(javaFieldName + "_" + pkColumn.getName());  //$NON-NLS-1$
-	}
-
-	public boolean referencesSingleColumnPrimaryKey() {
-		if (this.columnPairsSize() != 1) {
-			return false;
-		}
-		if (this.getReferencedTable().primaryKeyColumnsSize() != 1) {
-			return false;
-		}
-
-		return this.columnPair().referencedColumn() == this.getReferencedTable().primaryKeyColumn();
-	}
-
-	/**
-	 * If this is a simple (single-column) foreign key, return the java field
-	 * name of the single base column. If this is a compound foreign key,
-	 * return the java field name of the referenced table.
-	 */
-	// TODO if there is only one FK to a given table, use the table's name instead of the column's name?
-	// TODO if the FK column name ends with the PK column name, strip the PK column name?
-	private String nonDefaultEntityFieldName() {
-		return (this.columnPairsSize() == 1) ?
-			this.columnPair().baseColumn().getJavaFieldName()
-		:
-			this.getReferencedTable().getJavaFieldName();
-	}
-
-
-	// ********** Comparable implementation **********
-
-	public int compareTo(ForeignKey foreignKey) {
-		return Collator.getInstance().compare(this.getName(), foreignKey.getName());
-	}
-
-
-	// ********** internal methods **********
-
-	boolean wraps(org.eclipse.datatools.modelbase.sql.constraints.ForeignKey foreignKey) {
-		return this.dtpForeignKey == foreignKey;
-	}
-
-	boolean isCaseSensitive() {
-		return this.baseTable.isCaseSensitive();
-	}
-
-	DTPDatabaseWrapper database() {
-		return this.baseTable.database();
-	}
-
-	@Override
-	public String toString() {
-		return StringTools.buildToStringFor(this, this.getName() + ": " + Arrays.asList(this.columnPairs_()));  //$NON-NLS-1$
-	}
-
-
-	// ********** disposal **********
-
-	@Override
-	synchronized void dispose() {
-		this.dispose_();
-		super.dispose();
-	}
-
-	private void dispose_() {
-		// the foreign key does not "contain" any other objects,
-		// so we don't need to forward the #dispose()
-		this.defaultEntityFieldNameCalculated = false;
-		this.defaultEntityFieldName = null;
-		this.columnPairs =  null;
-		this.referencedTable = null;
-	}
-
-
-	// ********** column pair implementation **********
-
-	private static class LocalColumnPair implements ColumnPair {
-		private final DTPColumnWrapper baseColumn;
-		private final DTPColumnWrapper referencedColumn;
-
-		LocalColumnPair(DTPColumnWrapper baseColumn, DTPColumnWrapper referencedColumn) {
-			super();
-			this.baseColumn = baseColumn;
-			this.referencedColumn = referencedColumn;
-		}
-
-
-		// ********** ColumnPair implementation **********
-
-		public DTPColumnWrapper baseColumn() {
-			return this.baseColumn;
-		}
-
-		public DTPColumnWrapper referencedColumn() {
-			return this.referencedColumn;
-		}
-
-
-		// ********** Comparable implementation **********
-
-		public int compareTo(ColumnPair columnPair) {
-			return Collator.getInstance().compare(this.baseColumn().getName(), columnPair.baseColumn().getName());
-		}
-
-
-		// ********** Object overrides **********
-
-		@Override
-		public String toString() {
-			return StringTools.buildToStringFor(this, this.baseColumn.getName() + "=>" + this.referencedColumn.getName());  //$NON-NLS-1$
-		}
-
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPSchemaContainerWrapper.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPSchemaContainerWrapper.java
deleted file mode 100644
index 21a1355..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPSchemaContainerWrapper.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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.internal;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jpt.db.Schema;
-import org.eclipse.jpt.db.SchemaContainer;
-import org.eclipse.jpt.utility.internal.StringTools;
-import org.eclipse.jpt.utility.internal.iterators.ArrayIterator;
-import org.eclipse.jpt.utility.internal.iterators.TransformationIterator;
-
-/**
- * Coalesce behavior for a schema container (i.e. database or catalog).
- */
-abstract class DTPSchemaContainerWrapper
-	extends DTPWrapper
-	implements SchemaContainer
-{
-	// lazy-initialized
-	private DTPSchemaWrapper[] schemata;
-
-
-	// ********** constructor **********
-
-	DTPSchemaContainerWrapper(ConnectionProfileHolder connectionProfileHolder, Object dtpObject) {
-		super(connectionProfileHolder, dtpObject);
-	}
-
-
-	// ********** DTPWrapper implementation **********
-
-	@Override
-	synchronized void catalogObjectChanged(int eventType) {
-		// clear stuff so it will be rebuilt
-		this.dispose_();
-	}
-
-
-	// ********** abstract methods **********
-
-	abstract DTPDatabaseWrapper database();
-
-	abstract boolean isCaseSensitive();
-
-	abstract List<org.eclipse.datatools.modelbase.sql.schema.Schema> dtpSchemata();
-
-
-	// ********** schemata **********
-
-	public Iterator<Schema> schemata() {
-		return new ArrayIterator<Schema>(this.schemata_());
-	}
-
-	private Iterator<DTPSchemaWrapper> schemaWrappers() {
-		return new ArrayIterator<DTPSchemaWrapper>(this.schemata_());
-	}
-
-	synchronized DTPSchemaWrapper[] schemata_() {
-		if (this.schemata == null) {
-			this.schemata = this.buildSchemata();
-		}
-		return this.schemata;
-	}
-
-	private DTPSchemaWrapper[] buildSchemata() {
-		List<org.eclipse.datatools.modelbase.sql.schema.Schema> dtpSchemata = this.dtpSchemata();
-		DTPSchemaWrapper[] result = new DTPSchemaWrapper[dtpSchemata.size()];
-		for (int i = result.length; i-- > 0;) {
-			result[i] = new DTPSchemaWrapper(this, dtpSchemata.get(i));
-		}
-		return result;
-	}
-
-	public int schemataSize() {
-		return this.schemata_().length;
-	}
-
-	public Iterator<String> schemaNames() {
-		return new TransformationIterator<DTPSchemaWrapper, String>(this.schemaWrappers()) {
-			@Override
-			protected String transform(DTPSchemaWrapper schema) {
-				 return schema.getName();
-			}
-		};
-	}
-
-	public boolean containsSchemaNamed(String name) {
-		return this.schemaNamed(name) != null;
-	}
-
-	public DTPSchemaWrapper schemaNamed(String name) {
-		return this.isCaseSensitive() ? this.schemaNamedCaseSensitive(name) : this.schemaNamedIgnoreCase(name);
-	}
-
-	private DTPSchemaWrapper schemaNamedCaseSensitive(String name) {
-		for (Iterator<DTPSchemaWrapper> stream = this.schemaWrappers(); stream.hasNext(); ) {
-			DTPSchemaWrapper schema = stream.next();
-			if (schema.getName().equals(name)) {
-				return schema;
-			}
-		}
-		return null;
-	}
-	
-	private DTPSchemaWrapper schemaNamedIgnoreCase(String name) {
-		for (Iterator<DTPSchemaWrapper> stream = this.schemaWrappers(); stream.hasNext(); ) {
-			DTPSchemaWrapper schema = stream.next();
-			if (StringTools.stringsAreEqualIgnoreCase(schema.getName(), name)) {
-				return schema;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * return the schema for the specified DTP schema
-	 */
-	DTPSchemaWrapper schema(org.eclipse.datatools.modelbase.sql.schema.Schema dtpSchema) {
-		for (Iterator<DTPSchemaWrapper> stream = this.schemaWrappers(); stream.hasNext(); ) {
-			DTPSchemaWrapper schema = stream.next();
-			if (schema.wraps(dtpSchema)) {
-				return schema;
-			}
-		}
-		throw new IllegalArgumentException("invalid DTP schema: " + dtpSchema);  //$NON-NLS-1$
-	}
-
-
-	// ********** disposal **********
-
-	@Override
-	synchronized void dispose() {
-		this.dispose_();
-		super.dispose();
-	}
-
-	void dispose_() {
-		this.disposeSchemata();
-	}
-
-	private void disposeSchemata() {
-		if (this.schemata != null) {
-			for (DTPSchemaWrapper schema : this.schemata) {
-				schema.dispose();
-			}
-			this.schemata = null;
-		}
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPSchemaWrapper.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPSchemaWrapper.java
deleted file mode 100644
index fa30166..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPSchemaWrapper.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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.internal;
-
-import java.text.Collator;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.datatools.modelbase.sql.tables.SQLTablesPackage;
-import org.eclipse.jpt.db.Schema;
-import org.eclipse.jpt.db.Sequence;
-import org.eclipse.jpt.db.Table;
-import org.eclipse.jpt.utility.internal.StringTools;
-import org.eclipse.jpt.utility.internal.iterators.ArrayIterator;
-import org.eclipse.jpt.utility.internal.iterators.TransformationIterator;
-
-/**
- *  Wrap a DTP Schema
- */
-final class DTPSchemaWrapper
-	extends DTPWrapper
-	implements Schema
-{
-	//used for adopter product customization
-	private static final String PERSISTENT_AND_VIEW_TABLES_ONLY = "supportPersistentAndViewTablesOnly";
-	
-	// backpointer to parent
-	private final DTPSchemaContainerWrapper container;
-
-	// the wrapped DTP schema
-	private final org.eclipse.datatools.modelbase.sql.schema.Schema dtpSchema;
-
-	// lazy-initialized
-	private DTPTableWrapper[] tables;
-
-	// lazy-initialized
-	private DTPSequenceWrapper[] sequences;
-
-
-	// ********** constructor **********
-
-	DTPSchemaWrapper(DTPSchemaContainerWrapper container, org.eclipse.datatools.modelbase.sql.schema.Schema dtpSchema) {
-		super(container, dtpSchema);
-		this.container = container;
-		this.dtpSchema = dtpSchema;
-	}
-
-
-	// ********** DTPWrapper implementation **********
-
-	@Override
-	synchronized void catalogObjectChanged(int eventType) {
-		// clear stuff so it can be rebuilt
-		this.dispose_();
-		this.getConnectionProfile().schemaChanged(this, eventType);
-	}
-
-
-	// ********** Schema implementation **********
-
-	@Override
-	public String getName() {
-		return this.dtpSchema.getName();
-	}
-
-	// ***** tables
-
-	public Iterator<Table> tables() {
-		return new ArrayIterator<Table>(this.tables_());
-	}
-
-	private Iterator<DTPTableWrapper> tableWrappers() {
-		return new ArrayIterator<DTPTableWrapper>(this.tables_());
-	}
-
-	private synchronized DTPTableWrapper[] tables_() {
-		if (this.tables == null) {
-			this.tables = this.buildTables();
-		}
-		return this.tables;
-	}
-
-	private DTPTableWrapper[] buildTables() {
-		List<org.eclipse.datatools.modelbase.sql.tables.Table> dtpTables = this.dtpTables();
-		DTPTableWrapper[] result = new DTPTableWrapper[dtpTables.size()];
-		for (int i = result.length; i-- > 0;) {
-			result[i] = new DTPTableWrapper(this, dtpTables.get(i));
-		}
-		return result;
-	}
-
-	// minimize scope of suppressed warnings
-	@SuppressWarnings("unchecked")
-	private List<org.eclipse.datatools.modelbase.sql.tables.Table> dtpTables() {
-		
-		//return persistent and view tables only - this filters out synonyms where they are not
-		//fully supported and potentially other problematic table types - see bug 269057
-		String supportPersistentAndViewTablesOnly = Platform.getProduct().getProperty(PERSISTENT_AND_VIEW_TABLES_ONLY);
-		if ( supportPersistentAndViewTablesOnly != null && supportPersistentAndViewTablesOnly.equals("true") ) {
-            List<org.eclipse.datatools.modelbase.sql.tables.Table> result =
-            	new ArrayList<org.eclipse.datatools.modelbase.sql.tables.Table>();
-            for (Iterator iterT = this.dtpSchema.getTables().iterator();iterT.hasNext();) {
-                    org.eclipse.datatools.modelbase.sql.tables.Table table
-                    	= (org.eclipse.datatools.modelbase.sql.tables.Table) iterT.next();
-                    if (SQLTablesPackage.eINSTANCE.getPersistentTable().isSuperTypeOf(table.eClass()) ||
-                    	 SQLTablesPackage.eINSTANCE.getViewTable().isSuperTypeOf(table.eClass()) ) {
-                            result.add(table);
-                    }
-            }
-            return result;
-		}
-		else {
-			return this.dtpSchema.getTables();
-		}
-	}
-
-	public int tablesSize() {
-		return this.tables_().length;
-	}
-
-	public Iterator<String> tableNames() {
-		return new TransformationIterator<DTPTableWrapper, String>(this.tableWrappers()) {
-			@Override
-			protected String transform(DTPTableWrapper table) {
-				 return table.getName();
-			}
-		};
-	}
-
-	public boolean containsTableNamed(String name) {
-		return this.tableNamed(name) != null;
-	}
-
-	public DTPTableWrapper tableNamed(String name) {
-		return this.isCaseSensitive() ? this.tableNamedCaseSensitive(name) : this.tableNamedIgnoreCase(name);
-	}
-
-	private DTPTableWrapper tableNamedCaseSensitive(String name) {
-		for (Iterator<DTPTableWrapper> stream = this.tableWrappers(); stream.hasNext(); ) {
-			DTPTableWrapper table = stream.next();
-			if (table.getName().equals(name)) {
-				return table;
-			}
-		}
-		return null;
-	}
-
-	private DTPTableWrapper tableNamedIgnoreCase(String name) {
-		for (Iterator<DTPTableWrapper> stream = this.tableWrappers(); stream.hasNext(); ) {
-			DTPTableWrapper table = stream.next();
-			if (StringTools.stringsAreEqualIgnoreCase(table.getName(), name)) {
-				return table;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * return the table for the specified DTP table
-	 */
-	DTPTableWrapper table(org.eclipse.datatools.modelbase.sql.tables.Table dtpTable) {
-		if (dtpTable.getSchema() != this.dtpSchema) {
-			return this.database().table(dtpTable);
-		}
-		for (Iterator<DTPTableWrapper> stream = this.tableWrappers(); stream.hasNext(); ) {
-			DTPTableWrapper table = stream.next();
-			if (table.wraps(dtpTable)) {
-				return table;
-			}
-		}
-		throw new IllegalArgumentException("invalid DTP table: " + dtpTable);  //$NON-NLS-1$
-	}
-
-	// ***** sequences
-
-	public Iterator<Sequence> sequences() {
-		return new ArrayIterator<Sequence>(this.sequences_());
-	}
-
-	private Iterator<DTPSequenceWrapper> sequenceWrappers() {
-		return new ArrayIterator<DTPSequenceWrapper>(this.sequences_());
-	}
-
-	private synchronized DTPSequenceWrapper[] sequences_() {
-		if (this.sequences == null) {
-			this.sequences = this.buildSequences();
-		}
-		return this.sequences;
-	}
-
-	private DTPSequenceWrapper[] buildSequences() {
-		List<org.eclipse.datatools.modelbase.sql.schema.Sequence> dtpSequences = this.dtpSequences();
-		DTPSequenceWrapper[] result = new DTPSequenceWrapper[dtpSequences.size()];
-		for (int i = result.length; i-- > 0;) {
-			result[i] = new DTPSequenceWrapper(this, dtpSequences.get(i));
-		}
-		return result;
-	}
-
-	// minimize scope of suppressed warnings
-	@SuppressWarnings("unchecked")
-	private List<org.eclipse.datatools.modelbase.sql.schema.Sequence> dtpSequences() {
-		return this.dtpSchema.getSequences();
-	}
-
-	public int sequencesSize() {
-		return this.sequences_().length;
-	}
-
-	public Iterator<String> sequenceNames() {
-		return new TransformationIterator<DTPSequenceWrapper, String>(this.sequenceWrappers()) {
-			@Override
-			protected String transform(DTPSequenceWrapper sequence) {
-				 return sequence.getName();
-			}
-		};
-	}
-
-	public boolean containsSequenceNamed(String name) {
-		return this.sequenceNamed(name) != null;
-	}
-
-	public DTPSequenceWrapper sequenceNamed(String name) {
-		return this.isCaseSensitive() ? this.sequenceNamedCaseSensitive(name) : this.sequenceNamedIgnoreCase(name);
-	}
-	
-	private DTPSequenceWrapper sequenceNamedCaseSensitive(String name) {
-		for (Iterator<DTPSequenceWrapper> stream = this.sequenceWrappers(); stream.hasNext(); ) {
-			DTPSequenceWrapper sequence = stream.next();
-			if (sequence.getName().equals(name)) {
-				return sequence;
-			}
-		}
-		return null;
-	}
-
-	private DTPSequenceWrapper sequenceNamedIgnoreCase(String name) {
-		for (Iterator<DTPSequenceWrapper> stream = this.sequenceWrappers(); stream.hasNext(); ) {
-			DTPSequenceWrapper sequence = stream.next();
-			if (sequence.getName().equalsIgnoreCase(name)) {
-				return sequence;
-			}
-		}
-		return null;
-	}
-
-
-	// ********** Comparable implementation **********
-
-	public int compareTo(Schema schema) {
-		return Collator.getInstance().compare(this.getName(), schema.getName());
-	}
-
-
-	// ********** internal methods **********
-
-	boolean wraps(org.eclipse.datatools.modelbase.sql.schema.Schema schema) {
-		return this.dtpSchema == schema;
-	}
-
-	boolean isCaseSensitive() {
-		return this.database().isCaseSensitive();
-	}
-
-	DTPColumnWrapper column(org.eclipse.datatools.modelbase.sql.tables.Column dtpColumn) {
-		return this.database().column(dtpColumn);
-	}
-
-	DTPDatabaseWrapper database() {
-		return this.container.database();
-	}
-
-
-	// ********** disposal **********
-
-	@Override
-	synchronized void dispose() {
-		this.dispose_();
-		super.dispose();
-	}
-
-	private void dispose_() {
-		this.disposeSequences();
-		this.disposeTables();
-	}
-
-	private void disposeSequences() {
-		if (this.sequences != null) {
-			for (DTPSequenceWrapper sequence : this.sequences) {
-				sequence.dispose();
-			}
-			this.sequences = null;
-		}
-	}
-
-	private void disposeTables() {
-		if (this.tables != null) {
-			for (DTPTableWrapper table : this.tables) {
-				table.dispose();
-			}
-			this.tables = null;
-		}
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPSequenceWrapper.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPSequenceWrapper.java
deleted file mode 100644
index b1e546b..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPSequenceWrapper.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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.internal;
-
-import java.text.Collator;
-
-import org.eclipse.jpt.db.Sequence;
-
-/**
- *  Wrap a DTP Sequence
- */
-final class DTPSequenceWrapper
-	extends DTPWrapper
-	implements Sequence
-{
-	// backpointer to parent
-	private final DTPSchemaWrapper schema;
-
-	// the wrapped DTP sequence
-	private final org.eclipse.datatools.modelbase.sql.schema.Sequence dtpSequence;
-
-
-	// ********** constructor **********
-
-	DTPSequenceWrapper(DTPSchemaWrapper schema, org.eclipse.datatools.modelbase.sql.schema.Sequence dtpSequence) {
-		super(schema, dtpSequence);
-		this.schema = schema;
-		this.dtpSequence = dtpSequence;
-	}
-
-
-	// ********** DTPWrapper implementation **********
-
-	@Override
-	synchronized void catalogObjectChanged(int eventType) {
-		this.getConnectionProfile().sequenceChanged(this, eventType);
-	}
-
-
-	// ********** Sequence implementation **********
-
-	@Override
-	public String getName() {
-		return this.dtpSequence.getName();
-	}
-
-
-	// ********** Comparable implementation **********
-
-	public int compareTo(Sequence sequence) {
-		return Collator.getInstance().compare(this.getName(), sequence.getName());
-	}
-
-
-	// ********** internal methods **********
-
-	boolean wraps(org.eclipse.datatools.modelbase.sql.schema.Sequence sequence) {
-		return this.dtpSequence == sequence;
-	}
-
-	boolean isCaseSensitive() {
-		return this.schema.isCaseSensitive();
-	}
-
-	DTPDatabaseWrapper database() {
-		return this.schema.database();
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPTableWrapper.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPTableWrapper.java
deleted file mode 100644
index f5db4d6..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPTableWrapper.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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.internal;
-
-import java.text.Collator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.datatools.modelbase.sql.constraints.PrimaryKey;
-import org.eclipse.datatools.modelbase.sql.tables.BaseTable;
-import org.eclipse.jpt.db.Column;
-import org.eclipse.jpt.db.ForeignKey;
-import org.eclipse.jpt.db.Table;
-import org.eclipse.jpt.utility.internal.CollectionTools;
-import org.eclipse.jpt.utility.internal.NameTools;
-import org.eclipse.jpt.utility.internal.StringTools;
-import org.eclipse.jpt.utility.internal.iterators.ArrayIterator;
-import org.eclipse.jpt.utility.internal.iterators.TransformationIterator;
-
-/**
- *  Wrap a DTP Table
- */
-final class DTPTableWrapper
-	extends DTPWrapper
-	implements Table
-{
-	// backpointer to parent
-	private final DTPSchemaWrapper schema;
-
-	// the wrapped DTP table
-	private final org.eclipse.datatools.modelbase.sql.tables.Table dtpTable;
-
-	// lazy-initialized
-	private DTPColumnWrapper[] columns;
-
-	// lazy-initialized
-	private DTPColumnWrapper[] primaryKeyColumns;
-
-	// lazy-initialized
-	private DTPForeignKeyWrapper[] foreignKeys;
-
-
-	private static final DTPColumnWrapper[] EMPTY_COLUMNS = new DTPColumnWrapper[0];
-	private static final DTPForeignKeyWrapper[] EMPTY_FOREIGN_KEYS = new DTPForeignKeyWrapper[0];
-
-
-	// ********** constructor **********
-
-	DTPTableWrapper(DTPSchemaWrapper schema, org.eclipse.datatools.modelbase.sql.tables.Table dtpTable) {
-		super(schema, dtpTable);
-		this.schema = schema;
-		this.dtpTable = dtpTable;
-	}
-
-
-	// ********** DTPWrapper implementation **********
-
-	@Override
-	synchronized void catalogObjectChanged(int eventType) {
-		// clear stuff so it can be rebuilt
-		this.dispose_();
-		this.getConnectionProfile().tableChanged(this, eventType);
-	}
-
-
-	// ********** Table implementation **********
-
-	@Override
-	public String getName() {
-		return this.dtpTable.getName();
-	}
-
-	public String getShortJavaClassName() {
-		String jName = this.getName();
-		if ( ! this.isCaseSensitive()) {
-			jName = StringTools.capitalize(jName.toLowerCase());
-		}
-		return NameTools.convertToJavaIdentifier(jName);
-	}
-
-	public boolean matchesShortJavaClassName(String shortJavaClassName) {
-		return this.isCaseSensitive() ?
-			this.getName().equals(shortJavaClassName)
-		:
-			this.getName().equalsIgnoreCase(shortJavaClassName);
-	}
-
-	public String getJavaFieldName() {
-		String jName = this.getName();
-		if ( ! this.isCaseSensitive()) {
-			jName = jName.toLowerCase();
-		}
-		return NameTools.convertToJavaIdentifier(jName);
-	}
-
-	// ***** columns
-
-	public Iterator<Column> columns() {
-		return new ArrayIterator<Column>(this.columns_());
-	}
-
-	private Iterator<DTPColumnWrapper> columnWrappers() {
-		return new ArrayIterator<DTPColumnWrapper>(this.columns_());
-	}
-
-	private synchronized DTPColumnWrapper[] columns_() {
-		if (this.columns == null) {
-			this.columns = this.buildColumns();
-		}
-		return this.columns;
-	}
-
-	private DTPColumnWrapper[] buildColumns() {
-		List<org.eclipse.datatools.modelbase.sql.tables.Column> dtpColumns = this.dtpColumns();
-		DTPColumnWrapper[] result = new DTPColumnWrapper[dtpColumns.size()];
-		for (int i = result.length; i-- > 0;) {
-			result[i] = new DTPColumnWrapper(this, dtpColumns.get(i));
-		}
-		return result;
-	}
-
-	// minimize scope of suppressed warnings
-	@SuppressWarnings("unchecked")
-	private List<org.eclipse.datatools.modelbase.sql.tables.Column> dtpColumns() {
-		return this.dtpTable.getColumns();
-	}
-
-	public int columnsSize() {
-		return this.columns_().length;
-	}
-
-	public Iterator<String> columnNames() {
-		return new TransformationIterator<DTPColumnWrapper, String>(this.columnWrappers()) {
-			@Override
-			protected String transform(DTPColumnWrapper next) {
-				 return next.getName();
-			}
-		};
-	}
-
-	public boolean containsColumnNamed(String name) {
-		return this.columnNamed(name) != null;
-	}
-
-	public DTPColumnWrapper columnNamed(String name) {
-		return this.isCaseSensitive() ? this.columnNamedCaseSensitive(name) : this.columnNamedIgnoreCase(name);
-	}
-
-	private DTPColumnWrapper columnNamedCaseSensitive(String name) {
-		for (Iterator<DTPColumnWrapper> stream = this.columnWrappers(); stream.hasNext(); ) {
-			DTPColumnWrapper column = stream.next();
-			if (column.getName().equals(name)) {
-				return column;
-			}
-		}
-		return null;
-	}
-
-	private DTPColumnWrapper columnNamedIgnoreCase(String name) {
-		for (Iterator<DTPColumnWrapper> stream = this.columnWrappers(); stream.hasNext(); ) {
-			DTPColumnWrapper column = stream.next();
-			if (StringTools.stringsAreEqualIgnoreCase(column.getName(), name)) {
-				return column;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * return the column for the specified DTP column
-	 */
-	DTPColumnWrapper column(org.eclipse.datatools.modelbase.sql.tables.Column dtpColumn) {
-		if (dtpColumn.getTable() != this.dtpTable) {
-			return this.schema.column(dtpColumn);
-		}
-		for (DTPColumnWrapper column : this.columns_()) {
-			if (column.wraps(dtpColumn)) {
-				return column;
-			}
-		}
-		throw new IllegalArgumentException("invalid DTP column: " + dtpColumn);  //$NON-NLS-1$
-	}
-
-	// ***** primaryKeyColumns
-
-	public Iterator<Column> primaryKeyColumns() {
-		return new ArrayIterator<Column>(this.primaryKeyColumns_());
-	}
-
-	public DTPColumnWrapper primaryKeyColumn() {
-		DTPColumnWrapper[] pkColumns = this.primaryKeyColumns_();
-		if (pkColumns.length != 1) {
-			throw new IllegalStateException("multiple primary key columns: " + pkColumns.length);  //$NON-NLS-1$
-		}
-		return pkColumns[0];
-	}
-
-	private synchronized DTPColumnWrapper[] primaryKeyColumns_() {
-		if (this.primaryKeyColumns == null) {
-			this.primaryKeyColumns = this.buildPrimaryKeyColumns();
-		}
-		return this.primaryKeyColumns;
-	}
-
-	private DTPColumnWrapper[] buildPrimaryKeyColumns() {
-		if ( ! (this.dtpTable instanceof BaseTable)) {
-			return EMPTY_COLUMNS;
-		}
-		PrimaryKey pk = ((BaseTable) this.dtpTable).getPrimaryKey();
-		if (pk == null) {
-			// no PK was defined
-			return EMPTY_COLUMNS;
-		}
-		List<org.eclipse.datatools.modelbase.sql.tables.Column> pkColumns = this.columns(pk);
-		DTPColumnWrapper[] result = new DTPColumnWrapper[pkColumns.size()];
-		for (int i = result.length; i-- > 0;) {
-			result[i] = this.column(pkColumns.get(i));
-		}
-		return result;
-	}
-
-	// minimize scope of suppressed warnings
-	@SuppressWarnings("unchecked")
-	private List<org.eclipse.datatools.modelbase.sql.tables.Column> columns(PrimaryKey pk) {
-		return pk.getMembers();
-	}
-
-	public int primaryKeyColumnsSize() {
-		return this.primaryKeyColumns_().length;
-	}
-
-	public boolean primaryKeyColumnsContains(Column column) {
-		return CollectionTools.contains(this.primaryKeyColumns_(), column);
-	}
-
-	// ***** foreignKeys
-
-	public Iterator<ForeignKey> foreignKeys() {
-		return new ArrayIterator<ForeignKey>(this.foreignKeys_());
-	}
-
-	private Iterator<DTPForeignKeyWrapper> foreignKeyWrappers() {
-		return new ArrayIterator<DTPForeignKeyWrapper>(this.foreignKeys_());
-	}
-
-	private synchronized DTPForeignKeyWrapper[] foreignKeys_() {
-		if (this.foreignKeys == null) {
-			this.foreignKeys = this.buildForeignKeys();
-		}
-		return this.foreignKeys;
-	}
-
-	private DTPForeignKeyWrapper[] buildForeignKeys() {
-		if ( ! (this.dtpTable instanceof BaseTable)) {
-			return EMPTY_FOREIGN_KEYS;
-		}
-		List<org.eclipse.datatools.modelbase.sql.constraints.ForeignKey> dtpForeignKeys = this.dtpForeignKeys();
-		DTPForeignKeyWrapper[] result = new DTPForeignKeyWrapper[dtpForeignKeys.size()];
-		for (int i = result.length; i-- > 0;) {
-			result[i] = new DTPForeignKeyWrapper(this, dtpForeignKeys.get(i));
-		}
-		return result;
-	}
-
-	@SuppressWarnings("unchecked")
-	private List<org.eclipse.datatools.modelbase.sql.constraints.ForeignKey> dtpForeignKeys() {
-		return ((BaseTable) this.dtpTable).getForeignKeys();
-	}
-
-	public int foreignKeysSize() {
-		return this.foreignKeys_().length;
-	}
-
-	public boolean foreignKeyBaseColumnsContains(Column column) {
-		for (Iterator<DTPForeignKeyWrapper> stream = this.foreignKeyWrappers(); stream.hasNext(); ) {
-			DTPForeignKeyWrapper foreignKey = stream.next();
-			if (foreignKey.baseColumnsContains(column)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-
-	// ********** Comparable implementation **********
-
-	public int compareTo(Table table) {
-		return Collator.getInstance().compare(this.getName(), table.getName());
-	}
-
-
-	// ********** internal methods **********
-
-	boolean wraps(org.eclipse.datatools.modelbase.sql.tables.Table table) {
-		return this.dtpTable == table;
-	}
-
-	boolean isCaseSensitive() {
-		return this.schema.isCaseSensitive();
-	}
-
-	DTPTableWrapper table(org.eclipse.datatools.modelbase.sql.tables.Table table) {
-		return this.schema.table(table);
-	}
-
-	DTPDatabaseWrapper database() {
-		return this.schema.database();
-	}
-
-
-	// ********** disposal **********
-
-	@Override
-	synchronized void dispose() {
-		this.dispose_();
-		super.dispose();
-	}
-
-	private void dispose_() {
-		this.disposeForeignKeys();
-		// the table does not "contain" the pk columns, so no need to forward #dispose()
-		this.primaryKeyColumns = null;
-		this.disposeColumns();
-	}
-
-	private void disposeForeignKeys() {
-		if (this.foreignKeys != null) {
-			for (DTPForeignKeyWrapper foreignKey : this.foreignKeys) {
-				foreignKey.dispose();
-			}
-	    	this.foreignKeys = null;
-		}
-	}
-
-	private void disposeColumns() {
-		if (this.columns != null) {
-			for (DTPColumnWrapper column : this.columns) {
-				column.dispose();
-			}
-	    	this.columns = null;
-		}
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPWrapper.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPWrapper.java
deleted file mode 100644
index cbe702a..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/DTPWrapper.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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.internal;
-
-import org.eclipse.datatools.connectivity.sqm.core.rte.ICatalogObject;
-import org.eclipse.datatools.connectivity.sqm.core.rte.ICatalogObjectListener;
-import org.eclipse.datatools.connectivity.sqm.core.rte.RefreshManager;
-import org.eclipse.jpt.utility.internal.StringTools;
-
-/**
- *  DTP Catalog Object Wrapper base class
- */
-abstract class DTPWrapper
-	implements ConnectionProfileHolder
-{
-	// we need a way to get to the connection profile
-	private final ConnectionProfileHolder connectionProfileHolder;
-
-	// listen for the "catalog object" being refreshed
-	private final ICatalogObjectListener catalogObjectListener;
-
-	// we only listen to "live" connections
-	private final boolean connectionIsLive;
-
-	// listen for this to refresh
-	final ICatalogObject catalogObject;
-
-
-	DTPWrapper(ConnectionProfileHolder connectionProfileHolder, Object dtpObject) {
-		super();
-		this.connectionProfileHolder = connectionProfileHolder;
-		this.connectionIsLive = this.getConnectionProfile().isConnected();
-		if (this.connectionIsLive) {
-			this.catalogObject = (ICatalogObject) dtpObject;
-			this.catalogObjectListener = this.buildCatalogObjectListener();
-			RefreshManager.getInstance().AddListener(this.catalogObject, this.catalogObjectListener);
-		} else {
-			this.catalogObject = null;
-			this.catalogObjectListener = null;
-		}
-	}
-
-	private ICatalogObjectListener buildCatalogObjectListener() {
-		return new ICatalogObjectListener() {
-			public void notifyChanged(ICatalogObject dmElement, int eventType) {
-				if (dmElement == DTPWrapper.this.catalogObject) {
-					DTPWrapper.this.catalogObjectChanged(eventType);
-				}
-			}
-		};
-	}
-
-	// typically, notify the connection profile something has changed
-	abstract void catalogObjectChanged(int eventType);
-
-	public DTPConnectionProfileWrapper getConnectionProfile() {
-		return this.connectionProfileHolder.getConnectionProfile();
-	}
-
-	void dispose() {
-		if (this.connectionIsLive) {
-	        RefreshManager.getInstance().removeListener(this.catalogObject, this.catalogObjectListener);
-		}
-	}
-
-	// all the subclasses can implement this method
-	abstract String getName();
-
-	@Override
-	public String toString() {
-		return StringTools.buildToStringFor(this, this.getName());
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/InternalDatabase.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/InternalDatabase.java
deleted file mode 100644
index aa61c60..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/InternalDatabase.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 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.internal;
-
-import org.eclipse.jpt.db.Database;
-
-/**
- * "internal" database
- */
-interface InternalDatabase extends Database {
-	DTPCatalogWrapper getDefaultCatalog();
-	void dispose();
-}
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
deleted file mode 100644
index 5673dfb..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/NullConnectionProfile.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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.internal;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jpt.db.Catalog;
-import org.eclipse.jpt.db.ConnectionListener;
-import org.eclipse.jpt.db.ConnectionProfile;
-import org.eclipse.jpt.db.Database;
-import org.eclipse.jpt.db.Schema;
-import org.eclipse.jpt.utility.internal.ClassTools;
-
-/**
- *  "null" connection profile
- */
-final class NullConnectionProfile
-	implements ConnectionProfile
-{
-	private static final String EMPTY_STRING = "";  //$NON-NLS-1$
-
-
-	// ********** singleton **********
-
-	private static final NullConnectionProfile INSTANCE = new NullConnectionProfile();
-
-	static ConnectionProfile instance() {
-		return INSTANCE;
-	}
-
-	/**
-	 * 'private' to ensure singleton
-	 */
-	private NullConnectionProfile() {
-		super();
-	}
-
-
-	// ********** ConnectionProfile implementation **********
-
-	public void connect() {
-		// do nothing
-	}
-
-	public void disconnect() {
-		// do nothing
-	}
-
-	public IStatus saveWorkOfflineData() {
-		return Status.CANCEL_STATUS;
-	}
-
-	public IStatus workOffline() {
-		return Status.CANCEL_STATUS;
-	}
-
-	public Database getDatabase() {
-		return NullDatabase.instance();
-	}
-
-	public String getName() {
-		return ClassTools.shortClassNameForObject(this);
-	}
-
-	public String getDatabaseName() {
-		return EMPTY_STRING;
-	}
-
-	public String getDatabaseProduct() {
-		return EMPTY_STRING;
-	}
-
-	public String getDatabaseVendor() {
-		return EMPTY_STRING;
-	}
-
-	public String getDatabaseVersion() {
-		return EMPTY_STRING;
-	}
-
-	public String getUserName() {
-		return EMPTY_STRING;
-	}
-
-	public String getUserPassword() {
-		return EMPTY_STRING;
-	}
-
-	public String getDriverClassName() {
-		return EMPTY_STRING;
-	}
-
-	public String getUrl() {
-		return EMPTY_STRING;
-	}
-
-	public String getInstanceID() {
-		return EMPTY_STRING;
-	}
-
-	public String getProviderID() {
-		return EMPTY_STRING;
-	}
-
-	public String getDriverDefinitionID() {
-		return EMPTY_STRING;
-	}
-
-	public String getDriverJarList() {
-		return EMPTY_STRING;
-	}
-
-	public boolean isActive() {
-		return false;
-	}
-
-	public boolean isWorkingOffline() {
-		return false;
-	}
-
-	public boolean isConnected() {
-		return false;
-	}
-
-	public boolean supportsWorkOfflineMode() {
-		return false;
-	}
-
-	public boolean canWorkOffline() {
-		return false;
-	}
-
-	public void addConnectionListener( ConnectionListener listener) {
-		// do nothing
-	}
-
-	public void removeConnectionListener( ConnectionListener listener) {
-		// do nothing
-	}
-
-	public Schema getDefaultSchema() {
-		return null;
-	}
-
-	public Catalog getDefaultCatalog() {
-		return null;
-	}
-
-	public boolean isNull() {
-		return true;
-	}
-
-
-	// ********** Comparable implementation **********
-
-	public int compareTo(ConnectionProfile o) {
-		throw new UnsupportedOperationException("the \"null\" connection profile should not be in a sorted list");  //$NON-NLS-1$
-	}
-
-
-	// ********** Object overrides **********
-
-	@Override
-	public String toString() {
-		return ClassTools.toStringClassNameForObject(this);
-	}
-
-}
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/NullDatabase.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/NullDatabase.java
deleted file mode 100644
index 8ff4139..0000000
--- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/NullDatabase.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 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.internal;
-
-import java.util.Iterator;
-
-import org.eclipse.datatools.connectivity.sqm.core.definition.DatabaseDefinition;
-import org.eclipse.jpt.db.Catalog;
-import org.eclipse.jpt.db.Database;
-import org.eclipse.jpt.db.Schema;
-import org.eclipse.jpt.utility.internal.ClassTools;
-import org.eclipse.jpt.utility.internal.iterators.EmptyIterator;
-
-/**
- *  "null" database
- *  This is used when the connection profile is inactive (i.e. it is neither
- *  connected to the database nor working off-line).
- */
-final class NullDatabase
-	implements InternalDatabase
-{
-	private static final String EMPTY_STRING = "";  //$NON-NLS-1$
-
-
-	// ********** singleton **********
-
-	private static final NullDatabase INSTANCE = new NullDatabase();
-
-	static synchronized InternalDatabase instance() {
-		return INSTANCE;
-	}
-
-	/**
-	 * 'private' to ensure singleton
-	 */
-	private NullDatabase() {
-		super();
-	}
-
-
-	// ********** Database implementation **********
-
-	public String getName() {
-		return ClassTools.shortClassNameForObject(this);
-	}
-
-	public String getVendor() {
-		return EMPTY_STRING;
-	}
-
-	public String getVersion() {
-		return EMPTY_STRING;
-	}
-
-	public boolean isCaseSensitive() {
-		return false;
-	}
-
-	public DatabaseDefinition getDtpDefinition() {
-		return null;
-	}
-
-	// ***** catalogs
-
-	public boolean supportsCatalogs() {
-		return false;
-	}
-
-	public Iterator<Catalog> catalogs() {
-		return EmptyIterator.<Catalog>instance();
-	}
-
-	public int catalogsSize() {
-		return 0;
-	}
-
-	public Iterator<String> catalogNames() {
-		return EmptyIterator.<String>instance();
-	}
-
-	public boolean containsCatalogNamed(String name) {
-		return false;
-	}
-
-	public Catalog catalogNamed(String name) {
-		return null;
-	}
-
-	public String defaultCatalogName() {
-		return EMPTY_STRING;
-	}
-
-	public DTPCatalogWrapper getDefaultCatalog() {
-		return null;
-	}
-
-	// ***** schemata
-
-	public Iterator<Schema> schemata() {
-		return EmptyIterator.<Schema>instance();
-	}
-
-	public int schemataSize() {
-		return 0;
-	}
-
-	public Iterator<String> schemaNames() {
-		return EmptyIterator.<String>instance();
-	}
-
-	public boolean containsSchemaNamed(String name) {
-		return false;
-	}
-
-	public Schema schemaNamed(String name) {
-		return null;
-	}
-
-
-	// ********** InternalDatabase implementation **********
-
-	public void dispose() {
-		// do nothing
-	}
-
-
-	// ********** Comparable implementation **********
-
-	public int compareTo(Database o) {
-		throw new UnsupportedOperationException("the \"null\" database should not be in a sorted list");  //$NON-NLS-1$
-	}
-
-
-	// ********** Object overrides **********
-
-	@Override
-	public String toString() {
-		return ClassTools.toStringClassNameForObject(this);
-	}
-
-}
