refactoring UI in preparation for adding join-table support to 2.0 association overrides
diff --git a/jpa/plugins/org.eclipse.jpt.ui/property_files/jpt_ui_mappings.properties b/jpa/plugins/org.eclipse.jpt.ui/property_files/jpt_ui_mappings.properties
index 965c421..bd29441 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/property_files/jpt_ui_mappings.properties
+++ b/jpa/plugins/org.eclipse.jpt.ui/property_files/jpt_ui_mappings.properties
@@ -195,14 +195,14 @@
 PrimaryKeyJoinColumnDialog_editDescriptionTitle=Edit Primary Key Join Column
 PrimaryKeyJoinColumnDialog_editTitle=Edit Primary Key Join Column
 
-AttributeOverridesComposite_attributeOverridesSection=Attribute Overrides
-AttributeOverridesComposite_attributeOverridesGroup=Attribute overrides
-AttributeOverridesComposite_overrideDefault=Override default
+OverridesComposite_attributeOverridesSection=Attribute Overrides
+OverridesComposite_attributeOverridesGroup=Attribute overrides
+OverridesComposite_overrideDefault=Override default
 
 OverridesComposite_association=Association Override
 OverridesComposite_attribute=Attribute Override
 OverridesComposite_noName=<Name not set>
-OverridesComposite_joinColumn=Join columns
+AssociationOverridesComposite_joinColumn=Join columns
 
 InheritanceComposite_detailsGroupBox=Details
 InheritanceComposite_discriminatorColumnGroupBox=Discriminator column
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/JptUiMappingsMessages.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/JptUiMappingsMessages.java
index 7c924a7..267d179 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/JptUiMappingsMessages.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/JptUiMappingsMessages.java
@@ -31,9 +31,9 @@
 	public static String QueryStateObject_typeMustBeSpecified;
 	public static String NamedQueryComposite_nameTextLabel;
 
-	public static String AttributeOverridesComposite_attributeOverridesGroup;
-	public static String AttributeOverridesComposite_attributeOverridesSection;
-	public static String AttributeOverridesComposite_overrideDefault;
+	public static String OverridesComposite_attributeOverridesGroup;
+	public static String OverridesComposite_attributeOverridesSection;
+	public static String OverridesComposite_overrideDefault;
 	public static String BasicGeneralSection_enumeratedLabel;
 	public static String BasicGeneralSection_fetchLabel;
 	public static String BasicGeneralSection_lobLabel;
@@ -228,7 +228,7 @@
 	public static String OrmSecondaryTablesComposite_defineInXml;
 	public static String OverridesComposite_association;
 	public static String OverridesComposite_attribute;
-	public static String OverridesComposite_joinColumn;
+	public static String AssociationOverridesComposite_joinColumn;
 	public static String OverridesComposite_noName;
 	public static String PrimaryKeyJoinColumnDialog_addDescriptionTitle;
 	public static String PrimaryKeyJoinColumnDialog_addTitle;
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractEntityComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractEntityComposite.java
index f7394e3..4aee5d4 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractEntityComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractEntityComposite.java
@@ -136,10 +136,14 @@
 			JptUiMappingsMessages.EntityComposite_queries
 		);
 
-		new QueriesComposite(this, buildQueryContainer(), container);
+		addQueriesComposite(container, buildQueryContainerHolder());
 	}
 	
-	private PropertyValueModel<QueryContainer> buildQueryContainer() {
+	protected void addQueriesComposite(Composite container, PropertyValueModel<QueryContainer> queryContainerHolder) {
+		new QueriesComposite(this, queryContainerHolder, container);
+	}
+	
+	private PropertyValueModel<QueryContainer> buildQueryContainerHolder() {
 		return new PropertyAspectAdapter<Entity, QueryContainer>(getSubjectHolder()) {
 			@Override
 			protected QueryContainer buildValue_() {
@@ -152,9 +156,13 @@
 
 		container = addCollapsableSection(
 			container,
-			JptUiMappingsMessages.AttributeOverridesComposite_attributeOverridesSection
+			JptUiMappingsMessages.OverridesComposite_attributeOverridesSection
 		);
 
+		addAttributeOverridesComposite(container);
+	}
+	
+	protected void addAttributeOverridesComposite(Composite container) {
 		new OverridesComposite(this, container);
 	}
 
@@ -175,7 +183,11 @@
 			JptUiMappingsMessages.IdMappingComposite_primaryKeyGenerationSection
 		);
 
-		new GeneratorsComposite(this, buildGeneratorContainer(), container);
+		addGeneratorsComposite(container, buildGeneratorContainer());
+	}
+	
+	protected void addGeneratorsComposite(Composite container, PropertyValueModel<GeneratorContainer> generatorContainerHolder) {
+		new GeneratorsComposite(this, generatorContainerHolder, container);
 	}
 	
 	private PropertyValueModel<GeneratorContainer> buildGeneratorContainer() {
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractOverridesComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractOverridesComposite.java
new file mode 100644
index 0000000..b5fa2f3
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractOverridesComposite.java
@@ -0,0 +1,432 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.ui.internal.mappings.details;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jpt.core.context.AssociationOverride;
+import org.eclipse.jpt.core.context.AttributeOverride;
+import org.eclipse.jpt.core.context.BaseOverride;
+import org.eclipse.jpt.core.context.Entity;
+import org.eclipse.jpt.ui.WidgetFactory;
+import org.eclipse.jpt.ui.internal.JpaHelpContextIds;
+import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.util.ControlSwitcher;
+import org.eclipse.jpt.ui.internal.util.PaneEnabler;
+import org.eclipse.jpt.ui.internal.utility.swt.SWTTools;
+import org.eclipse.jpt.ui.internal.widgets.FormPane;
+import org.eclipse.jpt.ui.internal.widgets.AddRemoveListPane;
+import org.eclipse.jpt.ui.internal.widgets.Pane;
+import org.eclipse.jpt.ui.internal.widgets.AddRemovePane.Adapter;
+import org.eclipse.jpt.utility.internal.StringTools;
+import org.eclipse.jpt.utility.internal.Transformer;
+import org.eclipse.jpt.utility.internal.model.value.CachingTransformationPropertyValueModel;
+import org.eclipse.jpt.utility.internal.model.value.CachingTransformationWritablePropertyValueModel;
+import org.eclipse.jpt.utility.internal.model.value.CompositeListValueModel;
+import org.eclipse.jpt.utility.internal.model.value.ItemPropertyListValueModelAdapter;
+import org.eclipse.jpt.utility.internal.model.value.ListAspectAdapter;
+import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel;
+import org.eclipse.jpt.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.utility.internal.model.value.TransformationWritablePropertyValueModel;
+import org.eclipse.jpt.utility.internal.model.value.swing.ObjectListSelectionModel;
+import org.eclipse.jpt.utility.model.value.ListValueModel;
+import org.eclipse.jpt.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.part.PageBook;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * |                                                                           |
+ * | - Attribute Overrides --------------------------------------------------- |
+ * | | --------------------------------------------------------------------- | |
+ * | | |                                                                   | | |
+ * | | | AddRemoveListPane                                                 | | |
+ * | | |                                                                   | | |
+ * | | --------------------------------------------------------------------- | |
+ * | |                                                                       | |
+ * | |   x Override Default                                                  | |
+ * | |                                                                       | |
+ * | | --------------------------------------------------------------------- | |
+ * | | |                                                                   | | |
+ * | | | PageBook (attribute/association override composite)               | | |
+ * | | |                                                                   | | |
+ * | | --------------------------------------------------------------------- | |
+ * | ------------------------------------------------------------------------- |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see Entity
+ * @see EntityComposite - The parent container
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+@SuppressWarnings("nls")
+public abstract class AbstractOverridesComposite extends FormPane<Entity>
+{
+	private Pane<AttributeOverride> attributeOverridePane;
+	private Pane<AssociationOverride> associationOverridePane;
+	
+	private WritablePropertyValueModel<BaseOverride> selectedOverrideHolder;
+	private WritablePropertyValueModel<Boolean> overrideVirtualOverrideHolder;
+
+	/**
+	 * Creates a new <code>OverridesComposite</code>.
+	 *
+	 * @param parentPane The parent controller of this one
+	 * @param parent The parent container
+	 */
+	protected AbstractOverridesComposite(FormPane<? extends Entity> parentPane,
+	                          Composite parent) {
+
+		super(parentPane, parent, false);
+	}
+
+	/**
+	 * Creates a new <code>OverridesComposite</code>.
+	 *
+	 * @param subjectHolder The holder of the subject <code>Entity</code>
+	 * @param parent The parent container
+	 * @param widgetFactory The factory used to create various common widgets
+	 */
+	protected AbstractOverridesComposite(PropertyValueModel<? extends Entity> subjectHolder,
+	                          Composite parent,
+	                          WidgetFactory widgetFactory) {
+
+		super(subjectHolder, parent, widgetFactory);
+	}
+
+	@Override
+	protected void initialize() {
+		super.initialize();
+		this.selectedOverrideHolder = buildSelectedOverrideHolder();
+	}
+
+	private WritablePropertyValueModel<BaseOverride> buildSelectedOverrideHolder() {
+		return new SimplePropertyValueModel<BaseOverride>();
+	}
+
+
+	@Override
+	protected void initializeLayout(Composite container) {
+
+		// Overrides group pane
+		container = addTitledGroup(
+			container,
+			JptUiMappingsMessages.OverridesComposite_attributeOverridesGroup
+		);
+
+		// Overrides list pane
+		initializeOverridesList(container);
+
+		int groupBoxMargin = getGroupBoxMargin();
+		
+		// Override Default check box
+		Button overrideCheckBox = addCheckBox(
+			addSubPane(container, 0, groupBoxMargin, 0, groupBoxMargin),
+			JptUiMappingsMessages.OverridesComposite_overrideDefault,
+			getOverrideVirtualOverrideHolder(),
+			null
+		);
+		SWTTools.controlVisibleState(buildSelectedOverrideBooleanHolder(), overrideCheckBox);
+		
+		// Property pane
+		PageBook pageBook = addPageBook(container);
+		initializeAttributeOverridePane(pageBook);
+		initializeAssociationOverridePane(pageBook);
+		installOverrideControlSwitcher(this.selectedOverrideHolder, pageBook);
+	}
+
+	private PropertyValueModel<Boolean> buildSelectedOverrideBooleanHolder() {
+		return new TransformationPropertyValueModel<BaseOverride, Boolean>(this.selectedOverrideHolder) {
+			@Override
+			protected Boolean transform(BaseOverride value) {
+				return Boolean.valueOf(value != null);
+			}
+		};
+	}
+	
+	private AddRemoveListPane<Entity> initializeOverridesList(Composite container) {
+
+		return new AddRemoveListPane<Entity>(
+			this,
+			addSubPane(container, 8),
+			buildOverridesAdapter(),
+			buildOverridesListModel(),
+			this.selectedOverrideHolder,
+			buildOverrideLabelProvider(),
+			JpaHelpContextIds.ENTITY_ATTRIBUTE_OVERRIDES
+		)
+		{
+			@Override
+			protected void initializeButtonPane(Composite container, String helpId) {
+				//no buttons: no way to add/remove/edit overrides, they are all defaulted in
+			}
+
+			@Override
+			protected void updateButtons() {
+				//no buttons: no way to add/remove/edit overrides, they are all defaulted in
+			}
+		};
+	}
+	
+	private void initializeAttributeOverridePane(PageBook pageBook) {
+		PropertyValueModel<AttributeOverride>  attributeOverrideHolder = buildAttributeOverrideHolder();
+		this.attributeOverridePane = buildAttributeOverridePane(pageBook, attributeOverrideHolder);
+		installAttributeOverridePaneEnabler(this.attributeOverridePane, attributeOverrideHolder);
+	}
+
+	protected abstract Pane<AttributeOverride> buildAttributeOverridePane(PageBook pageBook, PropertyValueModel<AttributeOverride> attributeOverrideHolder);
+	
+	private void installAttributeOverridePaneEnabler(Pane<AttributeOverride> pane, PropertyValueModel<AttributeOverride> overrideHolder) {
+		new PaneEnabler(
+			buildOverrideBooleanHolder(overrideHolder),
+			pane
+		);
+	}
+
+	private PropertyValueModel<Boolean> buildOverrideBooleanHolder(PropertyValueModel<? extends BaseOverride> overrideHolder) {
+		return new CachingTransformationPropertyValueModel<BaseOverride, Boolean>(overrideHolder) {
+			@Override
+			protected Boolean transform_(BaseOverride value) {
+				return Boolean.valueOf(!value.isVirtual());
+			}
+		};
+	}
+	
+	private void initializeAssociationOverridePane(PageBook pageBook) {
+		PropertyValueModel<AssociationOverride>  associationOverrideHolder = buildAssociationOverrideHolder();
+		this.associationOverridePane = buildAssociationOverridePane(pageBook, associationOverrideHolder);
+		installAssociationOverridePaneEnabler(this.associationOverridePane, associationOverrideHolder);
+	}
+
+	protected abstract Pane<AssociationOverride> buildAssociationOverridePane(PageBook pageBook, PropertyValueModel<AssociationOverride> associationOverrideHolder);
+
+	private void installAssociationOverridePaneEnabler(Pane<AssociationOverride> pane, PropertyValueModel<AssociationOverride> overrideHolder) {
+		new PaneEnabler(
+			buildOverrideBooleanHolder(overrideHolder),
+			pane
+		);
+	}
+
+	private void installOverrideControlSwitcher(PropertyValueModel<BaseOverride> overrideHolder,
+	                                            PageBook pageBook) {
+
+		new ControlSwitcher(
+			overrideHolder,
+			buildPaneTransformer(),
+			pageBook
+		);
+	}
+	
+	private WritablePropertyValueModel<AssociationOverride> buildAssociationOverrideHolder() {
+		return new TransformationWritablePropertyValueModel<BaseOverride, AssociationOverride>(this.selectedOverrideHolder) {
+			@Override
+			protected AssociationOverride transform_(BaseOverride value) {
+				return (value instanceof AssociationOverride) ? (AssociationOverride) value : null;
+			}
+		};
+	}
+	
+	private WritablePropertyValueModel<AttributeOverride> buildAttributeOverrideHolder() {
+		return new TransformationWritablePropertyValueModel<BaseOverride, AttributeOverride>(this.selectedOverrideHolder) {
+			@Override
+			protected AttributeOverride transform_(BaseOverride value) {
+				return (value instanceof AttributeOverride) ? (AttributeOverride) value : null;
+			}
+		};
+	}
+	
+	private ListValueModel<AssociationOverride> buildDefaultAssociationOverridesListHolder() {
+		return new ListAspectAdapter<Entity, AssociationOverride>(getSubjectHolder(), Entity.VIRTUAL_ASSOCIATION_OVERRIDES_LIST) {
+			@Override
+			protected ListIterator<AssociationOverride> listIterator_() {
+				return this.subject.virtualAssociationOverrides();
+			}
+
+			@Override
+			protected int size_() {
+				return this.subject.virtualAssociationOverridesSize();
+			}
+		};
+	}
+
+	private ListValueModel<AttributeOverride> buildDefaultAttributeOverridesListHolder() {
+		return new ListAspectAdapter<Entity, AttributeOverride>(getSubjectHolder(), Entity.VIRTUAL_ATTRIBUTE_OVERRIDES_LIST) {
+			@Override
+			protected ListIterator<AttributeOverride> listIterator_() {
+				return this.subject.virtualAttributeOverrides();
+			}
+
+			@Override
+			protected int size_() {
+				return this.subject.virtualAttributeOverridesSize();
+			}
+		};
+	}
+
+	protected WritablePropertyValueModel<Boolean> getOverrideVirtualOverrideHolder() {
+		if (this.overrideVirtualOverrideHolder == null) {
+			this.overrideVirtualOverrideHolder = buildOverrideVirtualOverrideHolder();
+		}
+		return this.overrideVirtualOverrideHolder;
+	}
+
+
+	private WritablePropertyValueModel<Boolean> buildOverrideVirtualOverrideHolder() {
+		return new CachingTransformationWritablePropertyValueModel<BaseOverride, Boolean>(this.selectedOverrideHolder) {
+			@Override
+			public void setValue(Boolean value) {
+				updateOverride(value.booleanValue());
+			}
+
+			@Override
+			protected Boolean transform_(BaseOverride value) {
+				return Boolean.valueOf(!value.isVirtual());
+			}
+		};
+	}
+
+	private String buildOverrideDisplayString(BaseOverride override) {
+		String overrideType;
+
+		// Retrieve the type
+		if (override instanceof AssociationOverride) {
+			overrideType = JptUiMappingsMessages.OverridesComposite_association;
+		}
+		else {
+			overrideType = JptUiMappingsMessages.OverridesComposite_attribute;
+		}
+
+		// Format the name
+		String name = override.getName();
+
+		if (StringTools.stringIsEmpty(name)) {
+			name = JptUiMappingsMessages.OverridesComposite_noName;
+		}
+
+		// Format: <name> (Attribute/Association Override)
+		StringBuilder sb = new StringBuilder();
+		sb.append(name);
+		sb.append(" (");
+		sb.append(overrideType);
+		sb.append(") ");
+		return sb.toString();
+	}
+
+	private ILabelProvider buildOverrideLabelProvider() {
+		return new LabelProvider() {
+			@Override
+			public String getText(Object element) {
+				return buildOverrideDisplayString((BaseOverride) element);
+			}
+		};
+	}
+
+	private Adapter buildOverridesAdapter() {
+		return new AddRemoveListPane.AbstractAdapter() {
+
+			public void addNewItem(ObjectListSelectionModel listSelectionModel) {
+				//no way to add/remove/edit overrides, they are all defaulted in
+			}
+
+			public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
+				//no way to add/remove/edit overrides, they are all defaulted in
+			}
+		};
+	}
+
+	private ListValueModel<BaseOverride> buildOverridesListHolder() {
+		List<ListValueModel<? extends BaseOverride>> list = new ArrayList<ListValueModel<? extends BaseOverride>>();
+		list.add(buildSpecifiedAttributeOverridesListHolder());
+		list.add(buildDefaultAttributeOverridesListHolder());
+		list.add(buildSpecifiedAssociationOverridesListHolder());
+		list.add(buildDefaultAssociationOverridesListHolder());
+		return new CompositeListValueModel<ListValueModel<? extends BaseOverride>, BaseOverride>(list);
+	}
+
+	private ListValueModel<BaseOverride> buildOverridesListModel() {
+		return new ItemPropertyListValueModelAdapter<BaseOverride>(
+			buildOverridesListHolder(),
+			BaseOverride.NAME_PROPERTY
+		);
+	}
+
+	private Transformer<BaseOverride, Control> buildPaneTransformer() {
+		return new Transformer<BaseOverride, Control>() {
+			public Control transform(BaseOverride override) {
+
+				if (override instanceof AttributeOverride) {
+					return AbstractOverridesComposite.this.attributeOverridePane.getControl();
+				}
+
+				if (override instanceof AssociationOverride) {
+					return AbstractOverridesComposite.this.associationOverridePane.getControl();
+				}
+
+				return null;
+			}
+		};
+	}
+
+	private ListValueModel<AssociationOverride> buildSpecifiedAssociationOverridesListHolder() {
+		return new ListAspectAdapter<Entity, AssociationOverride>(getSubjectHolder(), Entity.SPECIFIED_ASSOCIATION_OVERRIDES_LIST) {
+			@Override
+			protected ListIterator<AssociationOverride> listIterator_() {
+				return this.subject.specifiedAssociationOverrides();
+			}
+
+			@Override
+			protected int size_() {
+				return this.subject.specifiedAssociationOverridesSize();
+			}
+		};
+	}
+
+	private ListValueModel<AttributeOverride> buildSpecifiedAttributeOverridesListHolder() {
+		return new ListAspectAdapter<Entity, AttributeOverride>(getSubjectHolder(), Entity.SPECIFIED_ATTRIBUTE_OVERRIDES_LIST) {
+			@Override
+			protected ListIterator<AttributeOverride> listIterator_() {
+				return this.subject.specifiedAttributeOverrides();
+			}
+
+			@Override
+			protected int size_() {
+				return this.subject.specifiedAttributeOverridesSize();
+			}
+		};
+	}
+
+	private void updateOverride(boolean selected) {
+
+		if (isPopulating()) {
+			return;
+		}
+
+		setPopulating(true);
+
+		try {
+			BaseOverride override = this.selectedOverrideHolder.getValue();
+
+			BaseOverride newOverride = override.setVirtual(!selected);
+			this.selectedOverrideHolder.setValue(newOverride);
+		}
+		finally {
+			setPopulating(false);
+		}
+	}
+}
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AssociationOverrideComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AssociationOverrideComposite.java
new file mode 100644
index 0000000..ff510cb
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AssociationOverrideComposite.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.ui.internal.mappings.details;
+
+import java.util.ListIterator;
+import org.eclipse.jpt.core.context.AssociationOverride;
+import org.eclipse.jpt.core.context.Entity;
+import org.eclipse.jpt.core.context.JoinColumn;
+import org.eclipse.jpt.core.context.JoinColumnJoiningStrategy;
+import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
+import org.eclipse.jpt.ui.internal.mappings.details.JoinColumnsComposite.JoinColumnsEditor;
+import org.eclipse.jpt.ui.internal.widgets.FormPane;
+import org.eclipse.jpt.ui.internal.widgets.PostExecution;
+import org.eclipse.jpt.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.utility.model.value.PropertyValueModel;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * |                                                                           |
+ * | JoinColumnsComposite                                                      |
+ * |                                                                           |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see AssociationOverride
+ * @see OverridesComposite - The parent container
+ * @see JoinColumnsComposite
+ *
+ * @version 2.2
+ * @since 1.0
+ */
+public class AssociationOverrideComposite extends FormPane<AssociationOverride>
+{
+	private Composite joinColumnsPane;
+	private JoinColumnsComposite<JoinColumnJoiningStrategy> joinColumnsComposite;
+
+	private PropertyValueModel<JoinColumnJoiningStrategy> selectedJoinColumnJoiningStrategyHolder;
+
+	/**
+	 * Creates a new <code>AssociationOverrideComposite</code>.
+	 *
+	 * @param subjectHolder The holder of the subject <code>AssociationOverride</code>
+	 * @param parent The parent container
+	 * @param widgetFactory The factory used to create various common widgets
+	 */
+	public AssociationOverrideComposite(FormPane<?> parentPane, 
+								PropertyValueModel<? extends AssociationOverride> subjectHolder,
+								Composite parent) {
+
+		super(parentPane, subjectHolder, parent);
+	}
+
+	@Override
+	protected void initialize() {
+		super.initialize();
+		this.selectedJoinColumnJoiningStrategyHolder = buildJoinColumnJoiningStrategyHolder();
+	}
+
+	private PropertyValueModel<JoinColumnJoiningStrategy> buildJoinColumnJoiningStrategyHolder() {
+		return new TransformationPropertyValueModel<AssociationOverride, JoinColumnJoiningStrategy>(getSubjectHolder()) {
+			@Override
+			protected JoinColumnJoiningStrategy transform_(AssociationOverride value) {
+				return value.getRelationshipReference().getJoinColumnJoiningStrategy();
+			}
+		};
+	}
+
+	@Override
+	protected void initializeLayout(Composite container) {
+		this.joinColumnsPane = addSubPane(container);
+
+		Group joinColumnsGroupPane = addTitledGroup(
+			this.joinColumnsPane,
+			JptUiMappingsMessages.AssociationOverridesComposite_joinColumn
+		);
+
+		// Join Columns list pane (for AssociationOverride)
+		this.joinColumnsComposite =
+			new JoinColumnsComposite<JoinColumnJoiningStrategy>(
+				this,
+				this.selectedJoinColumnJoiningStrategyHolder,
+				joinColumnsGroupPane,
+				buildJoinColumnsEditor(),
+				false
+			);
+	}
+
+	private JoinColumnsProvider buildJoinColumnsEditor() {
+		return new JoinColumnsProvider();
+	}
+
+	private void addJoinColumn(JoinColumnJoiningStrategy subject) {
+
+		JoinColumnInJoiningStrategyDialog dialog =
+			new JoinColumnInJoiningStrategyDialog(getShell(), subject, null);
+
+		dialog.openDialog(buildAddJoinColumnPostExecution());
+	}
+
+	private PostExecution<JoinColumnInJoiningStrategyDialog> buildAddJoinColumnPostExecution() {
+		return new PostExecution<JoinColumnInJoiningStrategyDialog>() {
+			public void execute(JoinColumnInJoiningStrategyDialog dialog) {
+				if (dialog.wasConfirmed()) {
+					addJoinColumn(dialog.getSubject());
+				}
+			}
+		};
+	}
+
+	private void addJoinColumn(JoinColumnInJoiningStrategyStateObject stateObject) {
+
+		JoinColumnJoiningStrategy joiningStrategy = stateObject.getOwner();
+		int index = joiningStrategy.specifiedJoinColumnsSize();
+
+		JoinColumn joinColumn = joiningStrategy.addSpecifiedJoinColumn(index);
+		stateObject.updateJoinColumn(joinColumn);
+		this.joinColumnsComposite.setSelectedJoinColumn(joinColumn);
+	}
+
+
+	private void editJoinColumn(JoinColumn joinColumn) {
+
+		JoinColumnInJoiningStrategyDialog dialog =
+			new JoinColumnInJoiningStrategyDialog(
+				getShell(),
+				this.selectedJoinColumnJoiningStrategyHolder.getValue(),
+				joinColumn
+			);
+
+		dialog.openDialog(buildEditJoinColumnPostExecution());
+	}
+	
+	private PostExecution<JoinColumnInJoiningStrategyDialog> buildEditJoinColumnPostExecution() {
+		return new PostExecution<JoinColumnInJoiningStrategyDialog>() {
+			public void execute(JoinColumnInJoiningStrategyDialog dialog) {
+				if (dialog.wasConfirmed()) {
+					editJoinColumn(dialog.getSubject());
+				}
+			}
+		};
+	}
+
+	private void editJoinColumn(JoinColumnInJoiningStrategyStateObject stateObject) {
+		stateObject.updateJoinColumn(stateObject.getJoinColumn());
+	}
+	
+	@Override
+	public void enableWidgets(boolean enabled) {
+		super.enableWidgets(enabled);
+		this.joinColumnsComposite.enableWidgets(enabled);
+	}
+
+	private class JoinColumnsProvider implements JoinColumnsEditor<JoinColumnJoiningStrategy> {
+
+		public void addJoinColumn(JoinColumnJoiningStrategy subject) {
+			AssociationOverrideComposite.this.addJoinColumn(subject);
+		}
+
+		public JoinColumn getDefaultJoinColumn(JoinColumnJoiningStrategy subject) {
+			//association overrides have no default join column
+			return null;
+		}
+
+		public String getDefaultPropertyName() {
+			return JoinColumnJoiningStrategy.DEFAULT_JOIN_COLUMN_PROPERTY;
+		}
+
+		public void editJoinColumn(JoinColumnJoiningStrategy subject, JoinColumn joinColumn) {
+			AssociationOverrideComposite.this.editJoinColumn(joinColumn);
+		}
+
+		public boolean hasSpecifiedJoinColumns(JoinColumnJoiningStrategy subject) {
+			return subject.hasSpecifiedJoinColumns();
+		}
+
+		public void removeJoinColumns(JoinColumnJoiningStrategy subject, int[] selectedIndices) {
+			for (int index = selectedIndices.length; --index >= 0; ) {
+				subject.removeSpecifiedJoinColumn(selectedIndices[index]);
+			}
+		}
+
+		public ListIterator<JoinColumn> specifiedJoinColumns(JoinColumnJoiningStrategy subject) {
+			return subject.specifiedJoinColumns();
+		}
+
+		public int specifiedJoinColumnsSize(JoinColumnJoiningStrategy subject) {
+			return subject.specifiedJoinColumnsSize();
+		}
+
+		public String getSpecifiedJoinColumnsListPropertyName() {
+			return JoinColumnJoiningStrategy.SPECIFIED_JOIN_COLUMNS_LIST;
+		}
+	}
+}
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AttributeOverrideComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AttributeOverrideComposite.java
new file mode 100644
index 0000000..48b6b4e
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AttributeOverrideComposite.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.ui.internal.mappings.details;
+
+import org.eclipse.jpt.core.context.AttributeOverride;
+import org.eclipse.jpt.core.context.Column;
+import org.eclipse.jpt.ui.internal.widgets.FormPane;
+import org.eclipse.jpt.utility.internal.model.value.TransformationPropertyValueModel;
+import org.eclipse.jpt.utility.model.value.PropertyValueModel;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Here the layout of this pane:
+ * <pre>
+ * -----------------------------------------------------------------------------
+ * |                                                                           |
+ * | ColumnComposite                                                           |
+ * |                                                                           |
+ * -----------------------------------------------------------------------------</pre>
+ *
+ * @see AttributeOverride
+ * @see OverridesComposite - The parent container
+ * @see ColumnComposite
+ *
+ * @version 2.0
+ * @since 1.0
+ */
+public class AttributeOverrideComposite extends FormPane<AttributeOverride>
+{
+
+	/**
+	 * Creates a new <code>AttributeOverrideComposite</code>.
+	 *
+	 * @param subjectHolder The holder of the subject <code>AttributeOverride</code>
+	 * @param parent The parent container
+	 * @param widgetFactory The factory used to create various common widgets
+	 */
+	public AttributeOverrideComposite(FormPane<?> parentPane, 
+								PropertyValueModel<? extends AttributeOverride> subjectHolder,
+								Composite parent) {
+
+		super(parentPane, subjectHolder, parent);
+	}
+
+	@Override
+	protected void initializeLayout(Composite container) {
+		new ColumnComposite(
+			this,
+			buildColumnHolder(),
+			container,
+			false
+		);
+	}
+	
+	private PropertyValueModel<Column> buildColumnHolder() {
+		return new TransformationPropertyValueModel<AttributeOverride, Column>(getSubjectHolder()) {
+			@Override
+			protected Column transform_(AttributeOverride value) {
+				return value.getColumn();
+			}
+		};
+	}
+}
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedAttributeOverridesComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedAttributeOverridesComposite.java
index f088cac..9892a75 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedAttributeOverridesComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedAttributeOverridesComposite.java
@@ -133,7 +133,7 @@
 		// Attribute Overrides group box
 		container = addTitledGroup(
 			container,
-			JptUiMappingsMessages.AttributeOverridesComposite_attributeOverridesGroup
+			JptUiMappingsMessages.OverridesComposite_attributeOverridesGroup
 		);
 
 		// Attribute Overrides list
@@ -148,7 +148,7 @@
 		// Override Default check box
 		Button overrideDefaultButton = addUnmanagedCheckBox(
 			addSubPane(container, 0, getGroupBoxMargin()),
-			JptUiMappingsMessages.AttributeOverridesComposite_overrideDefault,
+			JptUiMappingsMessages.OverridesComposite_overrideDefault,
 			getOverrideVirtualAttributeOverrideHolder(),
 			null
 		);
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinColumnsComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinColumnsComposite.java
index 50f072b..2b0155f 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinColumnsComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinColumnsComposite.java
@@ -20,7 +20,6 @@
 import org.eclipse.jpt.ui.WidgetFactory;
 import org.eclipse.jpt.ui.internal.JpaHelpContextIds;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
-import org.eclipse.jpt.ui.internal.util.PaneEnabler;
 import org.eclipse.jpt.ui.internal.widgets.AddRemoveListPane;
 import org.eclipse.jpt.ui.internal.widgets.FormPane;
 import org.eclipse.jpt.ui.internal.widgets.AddRemovePane.AbstractAdapter;
@@ -269,8 +268,10 @@
 		};
 	}
 	
-	protected void installJoinColumnsPaneEnabler(PropertyValueModel<Boolean> joinColumnsPaneEnablerHolder) {
-		new PaneEnabler(joinColumnsPaneEnablerHolder, this.listPane);
+	@Override
+	public void enableWidgets(boolean enabled) {
+		super.enableWidgets(enabled);
+		this.listPane.enableWidgets(enabled);
 	}
 	
 	public void setSelectedJoinColumn(JoinColumn joinColumn) {
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinTableComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinTableComposite.java
index 8b5965c..9c7a100 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinTableComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoinTableComposite.java
@@ -23,6 +23,7 @@
 import org.eclipse.jpt.ui.internal.mappings.db.SchemaCombo;
 import org.eclipse.jpt.ui.internal.mappings.db.TableCombo;
 import org.eclipse.jpt.ui.internal.mappings.details.JoinColumnsComposite.JoinColumnsEditor;
+import org.eclipse.jpt.ui.internal.util.PaneEnabler;
 import org.eclipse.jpt.ui.internal.widgets.FormPane;
 import org.eclipse.jpt.ui.internal.widgets.PostExecution;
 import org.eclipse.jpt.utility.internal.model.value.CachingTransformationPropertyValueModel;
@@ -35,9 +36,6 @@
 import org.eclipse.jpt.utility.model.value.ListValueModel;
 import org.eclipse.jpt.utility.model.value.PropertyValueModel;
 import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Group;
@@ -205,11 +203,11 @@
 	}
 
 	private void installInverseJoinColumnsPaneEnabler(JoinColumnsComposite<JoinTable> pane) {
-		pane.installJoinColumnsPaneEnabler(new InverseJoinColumnPaneEnablerHolder());
+		new PaneEnabler(new InverseJoinColumnPaneEnablerHolder(), pane);
 	}
 
 	private void installJoinColumnsPaneEnabler(JoinColumnsComposite<JoinTable> pane) {
-		pane.installJoinColumnsPaneEnabler(new JoinColumnPaneEnablerHolder());
+		new PaneEnabler(new JoinColumnPaneEnablerHolder(), pane);
 	}
 
 	private void addInverseJoinColumn(JoinTable joinTable) {
@@ -340,24 +338,6 @@
 		};
 	}
 
-	private SelectionListener buildOverrideDefaultInverseSelectionListener() {
-		return new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				updateInverseJoinColumns();
-			}
-		};
-	}
-
-	private SelectionListener buildOverrideDefaultSelectionListener() {
-		return new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				updateJoinColumns();
-			}
-		};
-	}
-
 	private Composite addPane(Composite container, int groupBoxMargin) {
 		return addSubPane(container, 0, groupBoxMargin, 10, groupBoxMargin);
 	}
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoiningStrategyJoinColumnsComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoiningStrategyJoinColumnsComposite.java
index 294de1a..96b9d4c 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoiningStrategyJoinColumnsComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/JoiningStrategyJoinColumnsComposite.java
@@ -15,6 +15,7 @@
 import org.eclipse.jpt.core.context.JoinColumnJoiningStrategy;
 import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
 import org.eclipse.jpt.ui.internal.mappings.details.JoinColumnsComposite.JoinColumnsEditor;
+import org.eclipse.jpt.ui.internal.util.PaneEnabler;
 import org.eclipse.jpt.ui.internal.widgets.FormPane;
 import org.eclipse.jpt.ui.internal.widgets.PostExecution;
 import org.eclipse.jpt.utility.internal.model.value.CachingTransformationPropertyValueModel;
@@ -74,7 +75,7 @@
 		
 		this.joinColumnsComposite = new JoinColumnsComposite<JoinColumnJoiningStrategy>(this, container, buildJoinColumnsProvider());
 		
-		this.joinColumnsComposite.installJoinColumnsPaneEnabler(new JoinColumnPaneEnablerHolder());
+		new PaneEnabler(new JoinColumnPaneEnablerHolder(), this.joinColumnsComposite);
 	}
 	
 	private JoinColumnsEditor<JoinColumnJoiningStrategy> buildJoinColumnsProvider() {
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/OverridesComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/OverridesComposite.java
index 3fd91b9..e868e96 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/OverridesComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/OverridesComposite.java
@@ -9,46 +9,14 @@
  ******************************************************************************/
 package org.eclipse.jpt.ui.internal.mappings.details;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ListIterator;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jpt.core.context.AssociationOverride;
 import org.eclipse.jpt.core.context.AttributeOverride;
-import org.eclipse.jpt.core.context.BaseOverride;
-import org.eclipse.jpt.core.context.Column;
 import org.eclipse.jpt.core.context.Entity;
-import org.eclipse.jpt.core.context.JoinColumn;
-import org.eclipse.jpt.core.context.JoinColumnJoiningStrategy;
 import org.eclipse.jpt.ui.WidgetFactory;
-import org.eclipse.jpt.ui.internal.JpaHelpContextIds;
-import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
-import org.eclipse.jpt.ui.internal.mappings.details.JoinColumnsComposite.JoinColumnsEditor;
-import org.eclipse.jpt.ui.internal.util.ControlSwitcher;
-import org.eclipse.jpt.ui.internal.util.PaneEnabler;
-import org.eclipse.jpt.ui.internal.utility.swt.SWTTools;
 import org.eclipse.jpt.ui.internal.widgets.FormPane;
-import org.eclipse.jpt.ui.internal.widgets.AddRemoveListPane;
-import org.eclipse.jpt.ui.internal.widgets.PostExecution;
-import org.eclipse.jpt.ui.internal.widgets.AddRemovePane.Adapter;
-import org.eclipse.jpt.utility.internal.StringTools;
-import org.eclipse.jpt.utility.internal.Transformer;
-import org.eclipse.jpt.utility.internal.model.value.CachingTransformationWritablePropertyValueModel;
-import org.eclipse.jpt.utility.internal.model.value.CompositeListValueModel;
-import org.eclipse.jpt.utility.internal.model.value.ItemPropertyListValueModelAdapter;
-import org.eclipse.jpt.utility.internal.model.value.ListAspectAdapter;
-import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel;
-import org.eclipse.jpt.utility.internal.model.value.TransformationPropertyValueModel;
-import org.eclipse.jpt.utility.internal.model.value.TransformationWritablePropertyValueModel;
-import org.eclipse.jpt.utility.internal.model.value.swing.ObjectListSelectionModel;
-import org.eclipse.jpt.utility.model.value.ListValueModel;
+import org.eclipse.jpt.ui.internal.widgets.Pane;
 import org.eclipse.jpt.utility.model.value.PropertyValueModel;
-import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel;
-import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
 import org.eclipse.ui.part.PageBook;
 
 /**
@@ -67,7 +35,7 @@
  * | |                                                                       | |
  * | | --------------------------------------------------------------------- | |
  * | | |                                                                   | | |
- * | | | PageBook (JoinColumnsComposite or ColumnComposite)                | | |
+ * | | | PageBook (AttributeOverrideComposite/AssociationOverrideComposite)| | |
  * | | |                                                                   | | |
  * | | --------------------------------------------------------------------- | |
  * | ------------------------------------------------------------------------- |
@@ -75,22 +43,15 @@
  *
  * @see Entity
  * @see EntityComposite - The parent container
- * @see ColumnComposite
- * @see JoinColumnsComposite
+ * @see AttributeOverrideComposite
+ * @see AssociationOverrideComposite
  *
  * @version 2.0
  * @since 1.0
  */
-@SuppressWarnings("nls")
-public class OverridesComposite extends FormPane<Entity>
+public class OverridesComposite extends AbstractOverridesComposite
 {
-	private Composite columnPane;
-	private Composite joinColumnsPane;
-	private JoinColumnsComposite<JoinColumnJoiningStrategy> joinColumnsComposite;
-	private WritablePropertyValueModel<BaseOverride> selectedOverrideHolder;
-	private WritablePropertyValueModel<Boolean> overrideVirtualOverrideHolder;
 
-	private WritablePropertyValueModel<JoinColumnJoiningStrategy> selectedJoinColumnJoiningStrategyHolder;
 	/**
 	 * Creates a new <code>OverridesComposite</code>.
 	 *
@@ -100,7 +61,7 @@
 	public OverridesComposite(FormPane<? extends Entity> parentPane,
 	                          Composite parent) {
 
-		super(parentPane, parent, false);
+		super(parentPane, parent);
 	}
 
 	/**
@@ -118,458 +79,12 @@
 	}
 
 	@Override
-	protected void initialize() {
-		super.initialize();
-		this.selectedOverrideHolder = buildSelectedOverrideHolder();
-		this.selectedJoinColumnJoiningStrategyHolder = buildJoinColumnJoiningStrategyHolder();
+	protected Pane<AttributeOverride> buildAttributeOverridePane(PageBook pageBook, PropertyValueModel<AttributeOverride> attributeOverrideHolder) {
+		return new AttributeOverrideComposite(this, attributeOverrideHolder, pageBook);
 	}
 
-	private WritablePropertyValueModel<BaseOverride> buildSelectedOverrideHolder() {
-		return new SimplePropertyValueModel<BaseOverride>();
-	}
-
-
 	@Override
-	protected void initializeLayout(Composite container) {
-
-		// Overrides group pane
-		container = addTitledGroup(
-			container,
-			JptUiMappingsMessages.AttributeOverridesComposite_attributeOverridesGroup
-		);
-
-		// Overrides list pane
-		initializeOverridesList(container);
-
-		int groupBoxMargin = getGroupBoxMargin();
-		
-		// Override Default check box
-		Button overrideCheckBox = addCheckBox(
-			addSubPane(container, 0, groupBoxMargin, 0, groupBoxMargin),
-			JptUiMappingsMessages.AttributeOverridesComposite_overrideDefault,
-			getOverrideVirtualOverrideHolder(),
-			null
-		);
-		SWTTools.controlVisibleState(buildSelectedOverrideBooleanHolder(), overrideCheckBox);
-		
-		// Property pane
-		PageBook pageBook = addPageBook(container);
-		initializeJoinColumnsPane(pageBook);
-		initializeColumnPane(pageBook);
-		installOverrideControlSwitcher(this.selectedOverrideHolder, pageBook);
-	}
-
-	private PropertyValueModel<Boolean> buildSelectedOverrideBooleanHolder() {
-		return new TransformationPropertyValueModel<BaseOverride, Boolean>(this.selectedOverrideHolder) {
-			@Override
-			protected Boolean transform(BaseOverride value) {
-				return Boolean.valueOf(value != null);
-			}
-		};
-	}
-	
-	private AddRemoveListPane<Entity> initializeOverridesList(Composite container) {
-
-		return new AddRemoveListPane<Entity>(
-			this,
-			addSubPane(container, 8),
-			buildOverridesAdapter(),
-			buildOverridesListModel(),
-			this.selectedOverrideHolder,
-			buildOverrideLabelProvider(),
-			JpaHelpContextIds.ENTITY_ATTRIBUTE_OVERRIDES
-		)
-		{
-			@Override
-			protected void initializeButtonPane(Composite container, String helpId) {
-				//no buttons: no way to add/remove/edit overrides, they are all defaulted in
-			}
-
-			@Override
-			protected void updateButtons() {
-				//no buttons: no way to add/remove/edit overrides, they are all defaulted in
-			}
-		};
-	}
-	
-	private void initializeColumnPane(PageBook pageBook) {
-		this.columnPane = addSubPane(pageBook, 5);
-
-		// Column widgets (for IOverrideAttribute)
-		ColumnComposite columnComposite = new ColumnComposite(
-			this,
-			buildColumnHolder(buildAttributeOverrideHolder()),
-			this.columnPane,
-			false
-		);
-
-		installColumnsPaneEnabler(columnComposite, buildAttributeOverrideHolder());
-	}
-
-	private void installColumnsPaneEnabler(ColumnComposite pane, PropertyValueModel<AttributeOverride> overrideHolder) {
-		new PaneEnabler(
-			buildOverrideBooleanHolder(overrideHolder),
-			pane
-		);
-	}
-
-	private PropertyValueModel<Boolean> buildOverrideBooleanHolder(PropertyValueModel<? extends BaseOverride> overrideHolder) {
-		return new TransformationPropertyValueModel<BaseOverride, Boolean>(overrideHolder) {
-			@Override
-			protected Boolean transform_(BaseOverride value) {
-				return Boolean.valueOf(!value.isVirtual());
-			}
-		};
-	}
-
-	private void initializeJoinColumnsPane(PageBook pageBook) {
-		this.joinColumnsPane = addSubPane(pageBook);
-
-		Group joinColumnsGroupPane = addTitledGroup(
-			this.joinColumnsPane,
-			JptUiMappingsMessages.OverridesComposite_joinColumn
-		);
-
-		// Join Columns list pane (for AssociationOverride)
-		this.joinColumnsComposite =
-			new JoinColumnsComposite<JoinColumnJoiningStrategy>(
-				this,
-				this.selectedJoinColumnJoiningStrategyHolder,
-				joinColumnsGroupPane,
-				buildJoinColumnsEditor(),
-				false
-			);
-
-		installJoinColumnsPaneEnabler(this.joinColumnsComposite, buildAssociationOverrideHolder());
-	}
-
-	private void installJoinColumnsPaneEnabler(JoinColumnsComposite<JoinColumnJoiningStrategy> pane, PropertyValueModel<AssociationOverride> overrideHolder) {
-		pane.installJoinColumnsPaneEnabler(buildOverrideBooleanHolder(overrideHolder));
-	}
-
-	private void installOverrideControlSwitcher(PropertyValueModel<BaseOverride> overrideHolder,
-	                                            PageBook pageBook) {
-
-		new ControlSwitcher(
-			overrideHolder,
-			buildPaneTransformer(),
-			pageBook
-		);
-	}
-
-	private void addJoinColumn(JoinColumnJoiningStrategy subject) {
-
-		JoinColumnInJoiningStrategyDialog dialog =
-			new JoinColumnInJoiningStrategyDialog(getShell(), subject, null);
-
-		dialog.openDialog(buildAddJoinColumnPostExecution());
-	}
-
-	private PostExecution<JoinColumnInJoiningStrategyDialog> buildAddJoinColumnPostExecution() {
-		return new PostExecution<JoinColumnInJoiningStrategyDialog>() {
-			public void execute(JoinColumnInJoiningStrategyDialog dialog) {
-				if (dialog.wasConfirmed()) {
-					addJoinColumn(dialog.getSubject());
-				}
-			}
-		};
-	}
-
-	private void addJoinColumn(JoinColumnInJoiningStrategyStateObject stateObject) {
-
-		JoinColumnJoiningStrategy joiningStrategy = stateObject.getOwner();
-		int index = joiningStrategy.specifiedJoinColumnsSize();
-
-		JoinColumn joinColumn = joiningStrategy.addSpecifiedJoinColumn(index);
-		stateObject.updateJoinColumn(joinColumn);
-		this.joinColumnsComposite.setSelectedJoinColumn(joinColumn);
-	}
-
-	private WritablePropertyValueModel<JoinColumnJoiningStrategy> buildJoinColumnJoiningStrategyHolder() {
-		return new TransformationWritablePropertyValueModel<AssociationOverride, JoinColumnJoiningStrategy>(this.buildAssociationOverrideHolder()) {
-			@Override
-			protected JoinColumnJoiningStrategy transform_(AssociationOverride value) {
-				return value.getRelationshipReference().getJoinColumnJoiningStrategy();
-			}
-		};
-	}
-	
-	private WritablePropertyValueModel<AssociationOverride> buildAssociationOverrideHolder() {
-		return new TransformationWritablePropertyValueModel<BaseOverride, AssociationOverride>(this.selectedOverrideHolder) {
-			@Override
-			protected AssociationOverride transform_(BaseOverride value) {
-				return (value instanceof AssociationOverride) ? (AssociationOverride) value : null;
-			}
-		};
-	}
-	
-	private WritablePropertyValueModel<AttributeOverride> buildAttributeOverrideHolder() {
-		return new TransformationWritablePropertyValueModel<BaseOverride, AttributeOverride>(this.selectedOverrideHolder) {
-			@Override
-			protected AttributeOverride transform_(BaseOverride value) {
-				return (value instanceof AttributeOverride) ? (AttributeOverride) value : null;
-			}
-		};
-	}
-	
-	private PropertyValueModel<Column> buildColumnHolder(PropertyValueModel<AttributeOverride> attributeOverrideHolder) {
-		return new TransformationPropertyValueModel<AttributeOverride, Column>(attributeOverrideHolder) {
-			@Override
-			protected Column transform_(AttributeOverride value) {
-				return value.getColumn();
-			}
-		};
-	}
-
-	private ListValueModel<AssociationOverride> buildDefaultAssociationOverridesListHolder() {
-		return new ListAspectAdapter<Entity, AssociationOverride>(getSubjectHolder(), Entity.VIRTUAL_ASSOCIATION_OVERRIDES_LIST) {
-			@Override
-			protected ListIterator<AssociationOverride> listIterator_() {
-				return this.subject.virtualAssociationOverrides();
-			}
-
-			@Override
-			protected int size_() {
-				return this.subject.virtualAssociationOverridesSize();
-			}
-		};
-	}
-
-	private ListValueModel<AttributeOverride> buildDefaultAttributeOverridesListHolder() {
-		return new ListAspectAdapter<Entity, AttributeOverride>(getSubjectHolder(), Entity.VIRTUAL_ATTRIBUTE_OVERRIDES_LIST) {
-			@Override
-			protected ListIterator<AttributeOverride> listIterator_() {
-				return this.subject.virtualAttributeOverrides();
-			}
-
-			@Override
-			protected int size_() {
-				return this.subject.virtualAttributeOverridesSize();
-			}
-		};
-	}
-
-	private PostExecution<JoinColumnInJoiningStrategyDialog> buildEditJoinColumnPostExecution() {
-		return new PostExecution<JoinColumnInJoiningStrategyDialog>() {
-			public void execute(JoinColumnInJoiningStrategyDialog dialog) {
-				if (dialog.wasConfirmed()) {
-					editJoinColumn(dialog.getSubject());
-				}
-			}
-		};
-	}
-
-	private JoinColumnsProvider buildJoinColumnsEditor() {
-		return new JoinColumnsProvider();
-	}
-
-	protected WritablePropertyValueModel<Boolean> getOverrideVirtualOverrideHolder() {
-		if (this.overrideVirtualOverrideHolder == null) {
-			this.overrideVirtualOverrideHolder = buildOverrideVirtualOverrideHolder();
-		}
-		return this.overrideVirtualOverrideHolder;
-	}
-
-
-	private WritablePropertyValueModel<Boolean> buildOverrideVirtualOverrideHolder() {
-		return new CachingTransformationWritablePropertyValueModel<BaseOverride, Boolean>(this.selectedOverrideHolder) {
-			@Override
-			public void setValue(Boolean value) {
-				updateOverride(value.booleanValue());
-			}
-
-			@Override
-			protected Boolean transform_(BaseOverride value) {
-				return Boolean.valueOf(!value.isVirtual());
-			}
-		};
-	}
-
-	private String buildOverrideDisplayString(BaseOverride override) {
-		String overrideType;
-
-		// Retrieve the type
-		if (override instanceof AssociationOverride) {
-			overrideType = JptUiMappingsMessages.OverridesComposite_association;
-		}
-		else {
-			overrideType = JptUiMappingsMessages.OverridesComposite_attribute;
-		}
-
-		// Format the name
-		String name = override.getName();
-
-		if (StringTools.stringIsEmpty(name)) {
-			name = JptUiMappingsMessages.OverridesComposite_noName;
-		}
-
-		// Format: <name> (Attribute/Association Override)
-		StringBuilder sb = new StringBuilder();
-		sb.append(name);
-		sb.append(" (");
-		sb.append(overrideType);
-		sb.append(") ");
-		return sb.toString();
-	}
-
-	private ILabelProvider buildOverrideLabelProvider() {
-		return new LabelProvider() {
-			@Override
-			public String getText(Object element) {
-				return buildOverrideDisplayString((BaseOverride) element);
-			}
-		};
-	}
-
-	private Adapter buildOverridesAdapter() {
-		return new AddRemoveListPane.AbstractAdapter() {
-
-			public void addNewItem(ObjectListSelectionModel listSelectionModel) {
-				//no way to add/remove/edit overrides, they are all defaulted in
-			}
-
-			public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
-				//no way to add/remove/edit overrides, they are all defaulted in
-			}
-		};
-	}
-
-	private ListValueModel<BaseOverride> buildOverridesListHolder() {
-		List<ListValueModel<? extends BaseOverride>> list = new ArrayList<ListValueModel<? extends BaseOverride>>();
-		list.add(buildSpecifiedAttributeOverridesListHolder());
-		list.add(buildDefaultAttributeOverridesListHolder());
-		list.add(buildSpecifiedAssociationOverridesListHolder());
-		list.add(buildDefaultAssociationOverridesListHolder());
-		return new CompositeListValueModel<ListValueModel<? extends BaseOverride>, BaseOverride>(list);
-	}
-
-	private ListValueModel<BaseOverride> buildOverridesListModel() {
-		return new ItemPropertyListValueModelAdapter<BaseOverride>(
-			buildOverridesListHolder(),
-			BaseOverride.NAME_PROPERTY
-		);
-	}
-
-	private Transformer<BaseOverride, Control> buildPaneTransformer() {
-		return new Transformer<BaseOverride, Control>() {
-			public Control transform(BaseOverride override) {
-
-				if (override instanceof AttributeOverride) {
-					return OverridesComposite.this.columnPane;
-				}
-
-				if (override instanceof AssociationOverride) {
-					return OverridesComposite.this.joinColumnsPane;
-				}
-
-				return null;
-			}
-		};
-	}
-
-	private ListValueModel<AssociationOverride> buildSpecifiedAssociationOverridesListHolder() {
-		return new ListAspectAdapter<Entity, AssociationOverride>(getSubjectHolder(), Entity.SPECIFIED_ASSOCIATION_OVERRIDES_LIST) {
-			@Override
-			protected ListIterator<AssociationOverride> listIterator_() {
-				return this.subject.specifiedAssociationOverrides();
-			}
-
-			@Override
-			protected int size_() {
-				return this.subject.specifiedAssociationOverridesSize();
-			}
-		};
-	}
-
-	private ListValueModel<AttributeOverride> buildSpecifiedAttributeOverridesListHolder() {
-		return new ListAspectAdapter<Entity, AttributeOverride>(getSubjectHolder(), Entity.SPECIFIED_ATTRIBUTE_OVERRIDES_LIST) {
-			@Override
-			protected ListIterator<AttributeOverride> listIterator_() {
-				return this.subject.specifiedAttributeOverrides();
-			}
-
-			@Override
-			protected int size_() {
-				return this.subject.specifiedAttributeOverridesSize();
-			}
-		};
-	}
-
-	private void editJoinColumn(JoinColumn joinColumn) {
-
-		JoinColumnInJoiningStrategyDialog dialog =
-			new JoinColumnInJoiningStrategyDialog(
-				getShell(),
-				this.selectedJoinColumnJoiningStrategyHolder.getValue(),
-				joinColumn
-			);
-
-		dialog.openDialog(buildEditJoinColumnPostExecution());
-	}
-
-	private void editJoinColumn(JoinColumnInJoiningStrategyStateObject stateObject) {
-		stateObject.updateJoinColumn(stateObject.getJoinColumn());
-	}
-
-
-	private void updateOverride(boolean selected) {
-
-		if (isPopulating()) {
-			return;
-		}
-
-		setPopulating(true);
-
-		try {
-			BaseOverride override = this.selectedOverrideHolder.getValue();
-
-			BaseOverride newOverride = override.setVirtual(!selected);
-			this.selectedOverrideHolder.setValue(newOverride);
-		}
-		finally {
-			setPopulating(false);
-		}
-	}
-
-	private class JoinColumnsProvider implements JoinColumnsEditor<JoinColumnJoiningStrategy> {
-
-		public void addJoinColumn(JoinColumnJoiningStrategy subject) {
-			OverridesComposite.this.addJoinColumn(subject);
-		}
-
-		public JoinColumn getDefaultJoinColumn(JoinColumnJoiningStrategy subject) {
-			//association overrides have no default join column
-			return null;
-		}
-
-		public String getDefaultPropertyName() {
-			return JoinColumnJoiningStrategy.DEFAULT_JOIN_COLUMN_PROPERTY;
-		}
-
-		public void editJoinColumn(JoinColumnJoiningStrategy subject, JoinColumn joinColumn) {
-			OverridesComposite.this.editJoinColumn(joinColumn);
-		}
-
-		public boolean hasSpecifiedJoinColumns(JoinColumnJoiningStrategy subject) {
-			return subject.hasSpecifiedJoinColumns();
-		}
-
-		public void removeJoinColumns(JoinColumnJoiningStrategy subject, int[] selectedIndices) {
-			for (int index = selectedIndices.length; --index >= 0; ) {
-				subject.removeSpecifiedJoinColumn(selectedIndices[index]);
-			}
-		}
-
-		public ListIterator<JoinColumn> specifiedJoinColumns(JoinColumnJoiningStrategy subject) {
-			return subject.specifiedJoinColumns();
-		}
-
-		public int specifiedJoinColumnsSize(JoinColumnJoiningStrategy subject) {
-			return subject.specifiedJoinColumnsSize();
-		}
-
-		public String getSpecifiedJoinColumnsListPropertyName() {
-			return JoinColumnJoiningStrategy.SPECIFIED_JOIN_COLUMNS_LIST;
-		}
+	protected Pane<AssociationOverride> buildAssociationOverridePane(PageBook pageBook, PropertyValueModel<AssociationOverride> associationOverrideHolder) {
+		return new AssociationOverrideComposite(this, associationOverrideHolder, pageBook);
 	}
 }
\ No newline at end of file