temp (unstaged)
diff --git a/common/plugins/org.eclipse.jpt.common.core/src/org/eclipse/jpt/common/core/internal/gen/AbstractJptGenerator.java b/common/plugins/org.eclipse.jpt.common.core/src/org/eclipse/jpt/common/core/internal/gen/AbstractJptGenerator.java
index 00c5544..bb6003b 100644
--- a/common/plugins/org.eclipse.jpt.common.core/src/org/eclipse/jpt/common/core/internal/gen/AbstractJptGenerator.java
+++ b/common/plugins/org.eclipse.jpt.common.core/src/org/eclipse/jpt/common/core/internal/gen/AbstractJptGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2013 Oracle. All rights reserved.
+ * Copyright (c) 2008, 2016 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.
@@ -365,7 +365,7 @@
 		try {
 			File jarInstallDir = this.getBundleParentDir(JptCommonCorePlugin.instance().getBundle());
 
-			List<File> result = new ArrayList<File>();
+			List<File> result = new ArrayList<>();
 			this.findFileStartingWith(genJarName, jarInstallDir, result);
 			if (result.isEmpty()) {
 				throw new RuntimeException("Could not find: " + genJarName + "#.#.#v###.jar in: " + jarInstallDir);   //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/ModelPropertyAspectAdapter.java b/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/ModelPropertyAspectAdapter.java
index e40ae9a..2227f81 100644
--- a/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/ModelPropertyAspectAdapter.java
+++ b/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/ModelPropertyAspectAdapter.java
@@ -20,6 +20,14 @@
  * pluggable property aspect adapter} to convert one of a {@link Model model's}
  * <em>bound</em> properties to a
  * {@link org.eclipse.jpt.common.utility.model.value.PropertyValueModel property value model}.
+ * <p>
+ * <strong>NB:</strong>
+ * The {@link #propertyTransformer} <em>must</em> transform
+ * a non-<code>null</code> subject into the same value as the value
+ * passed by the correponding change event; i.e. it should invoke a
+ * "standard" getter. The only thing, in addition to calling the property's
+ * getter, the transformer can do is return something other than <code>null</code>
+ * if the subject is <code>null</code>.
  * 
  * @param <V> the type of the adapter's value
  * @param <S> the type of the subject whose <em>bound</em> property is transformed into
@@ -67,6 +75,13 @@
 		return this.propertyTransformer.transform(null);
 	}
 
+	/**
+	 * <strong>NB:</strong>
+	 * The event's new value is passed through <em>untouched</em>;
+	 * i.e. the {@link #propertyTransformer} <em>must</em> transform
+	 * a non-<code>null</code> subject into the same value as the value
+	 * passed to the correponding change event.
+	 */
 	public void propertyChanged(PropertyChangeEvent event) {
 		@SuppressWarnings("unchecked")
 		V newValue = (V) event.getNewValue();
diff --git a/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/PluggablePropertyAspectAdapter.java b/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/PluggablePropertyAspectAdapter.java
index 2709c03..11af565 100644
--- a/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/PluggablePropertyAspectAdapter.java
+++ b/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/PluggablePropertyAspectAdapter.java
@@ -15,7 +15,7 @@
 import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
 
 /**
- * This adapter adapts an subject property value model whose value is another model
+ * This adapter adapts a subject property value model whose value is another model
  * and treats the <em>inner</em> model's value as this adapter's models's value.
  * As a result, this adapter listens for changes to either model
  * (<em>inner</em> or <em>subject</em>).
diff --git a/common/tests/org.eclipse.jpt.common.utility.tests/src/org/eclipse/jpt/common/utility/tests/internal/model/value/CompoundPropertyValueModelTests.java b/common/tests/org.eclipse.jpt.common.utility.tests/src/org/eclipse/jpt/common/utility/tests/internal/model/value/CompoundPropertyValueModelTests.java
index 1f126b3..dd70260 100644
--- a/common/tests/org.eclipse.jpt.common.utility.tests/src/org/eclipse/jpt/common/utility/tests/internal/model/value/CompoundPropertyValueModelTests.java
+++ b/common/tests/org.eclipse.jpt.common.utility.tests/src/org/eclipse/jpt/common/utility/tests/internal/model/value/CompoundPropertyValueModelTests.java
@@ -13,7 +13,6 @@
 import org.eclipse.jpt.common.utility.internal.model.AbstractModel;
 import org.eclipse.jpt.common.utility.internal.model.value.PropertyValueModelTools;
 import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
-import org.eclipse.jpt.common.utility.internal.transformer.TransformerAdapter;
 import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent;
 import org.eclipse.jpt.common.utility.model.listener.ChangeAdapter;
 import org.eclipse.jpt.common.utility.model.listener.ChangeListener;
@@ -49,16 +48,7 @@
 	}
 
 	protected PropertyValueModel<SimplePropertyValueModel<String>> buildValueModelModel() {
-		return PropertyValueModelTools.transform(this.keyModel, new KeyTransformer());
-	}
-
-	public class KeyTransformer
-		extends TransformerAdapter<String, SimplePropertyValueModel<String>>
-	{
-		@Override
-		public SimplePropertyValueModel<String> transform(String key) {
-			return CompoundPropertyValueModelTests.this.getValueModel(key);
-		}
+		return PropertyValueModelTools.transform(this.keyModel, key -> this.getValueModel(key));
 	}
 
 	protected SimplePropertyValueModel<String> getValueModel(String key) {
diff --git a/common/tests/org.eclipse.jpt.common.utility.tests/src/org/eclipse/jpt/common/utility/tests/internal/model/value/PropertyAspectAdapterTests.java b/common/tests/org.eclipse.jpt.common.utility.tests/src/org/eclipse/jpt/common/utility/tests/internal/model/value/PropertyAspectAdapterTests.java
index cb4d7c4..f0df86a 100644
--- a/common/tests/org.eclipse.jpt.common.utility.tests/src/org/eclipse/jpt/common/utility/tests/internal/model/value/PropertyAspectAdapterTests.java
+++ b/common/tests/org.eclipse.jpt.common.utility.tests/src/org/eclipse/jpt/common/utility/tests/internal/model/value/PropertyAspectAdapterTests.java
@@ -10,6 +10,7 @@
 package org.eclipse.jpt.common.utility.tests.internal.model.value;
 
 import org.eclipse.jpt.common.utility.closure.BiClosure;
+import org.eclipse.jpt.common.utility.internal.ObjectTools;
 import org.eclipse.jpt.common.utility.internal.closure.BiClosureAdapter;
 import org.eclipse.jpt.common.utility.internal.model.AbstractModel;
 import org.eclipse.jpt.common.utility.internal.model.value.PropertyValueModelTools;
@@ -30,7 +31,7 @@
 	extends TestCase
 {
 	private TestSubject subject1;
-	private ModifiablePropertyValueModel<TestSubject> subjectHolder1;
+	private ModifiablePropertyValueModel<TestSubject> subjectModel1;
 	private ModifiablePropertyValueModel<String> aa1;
 	private PropertyChangeEvent event1;
 	private PropertyChangeListener listener1;
@@ -48,8 +49,8 @@
 	protected void setUp() throws Exception {
 		super.setUp();
 		this.subject1 = new TestSubject("foo", "test subject 1");
-		this.subjectHolder1 = new SimplePropertyValueModel<>(this.subject1);
-		this.aa1 = this.buildAspectAdapter(this.subjectHolder1);
+		this.subjectModel1 = new SimplePropertyValueModel<>(this.subject1);
+		this.aa1 = this.buildAspectAdapter(this.subjectModel1);
 		this.listener1 = this.buildValueChangeListener1();
 		this.aa1.addPropertyChangeListener(PropertyValueModel.VALUE, this.listener1);
 		this.event1 = null;
@@ -57,9 +58,9 @@
 		this.subject2 = new TestSubject("bar", "test subject 2");
 	}
 
-	private ModifiablePropertyValueModel<String> buildAspectAdapter(PropertyValueModel<TestSubject> subjectHolder) {
+	private ModifiablePropertyValueModel<String> buildAspectAdapter(PropertyValueModel<TestSubject> subjectModel) {
 		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter(
-				subjectHolder,
+				subjectModel,
 				TestSubject.NAME_PROPERTY,
 				TestSubject.NAME_TRANSFORMER,
 				TestSubject.SET_NAME_CLOSURE
@@ -85,11 +86,11 @@
 		super.tearDown();
 	}
 
-	public void testSubjectHolder() {
+	public void testSubjectModel() {
 		assertEquals("foo", this.aa1.getValue());
 		assertNull(this.event1);
 
-		this.subjectHolder1.setValue(this.subject2);
+		this.subjectModel1.setValue(this.subject2);
 		assertNotNull(this.event1);
 		assertEquals(this.aa1, this.event1.getSource());
 		assertEquals(PropertyValueModel.VALUE, this.event1.getPropertyName());
@@ -98,7 +99,7 @@
 		assertEquals("bar", this.aa1.getValue());
 		
 		this.event1 = null;
-		this.subjectHolder1.setValue(null);
+		this.subjectModel1.setValue(null);
 		assertNotNull(this.event1);
 		assertEquals(this.aa1, this.event1.getSource());
 		assertEquals(PropertyValueModel.VALUE, this.event1.getPropertyName());
@@ -107,7 +108,7 @@
 		assertNull(this.aa1.getValue());
 		
 		this.event1 = null;
-		this.subjectHolder1.setValue(this.subject1);
+		this.subjectModel1.setValue(this.subject1);
 		assertNotNull(this.event1);
 		assertEquals(this.aa1, this.event1.getSource());
 		assertEquals(PropertyValueModel.VALUE, this.event1.getPropertyName());
@@ -163,7 +164,7 @@
 		assertEquals("foo", this.aa1.getValue());
 
 		this.aa1.removePropertyChangeListener(PropertyValueModel.VALUE, this.listener1);
-		this.subjectHolder1.setValue(this.subject2);
+		this.subjectModel1.setValue(this.subject2);
 		assertEquals(null, this.aa1.getValue());
 
 		this.aa1.addPropertyChangeListener(PropertyValueModel.VALUE, this.listener1);
@@ -193,15 +194,16 @@
 	}
 
 	/**
-	 * test a bug where we would call #buildValue() in
-	 * #engageNonNullSubject(), when we needed to call
-	 * it in #engageSubject(), so the cached value would
-	 * be rebuilt when the this.subject was set to null
+	 * Test a bug:
+	 * we would call <code>buildValue()</code> in
+	 * <code>engageNonNullSubject()</code>, when we needed to call
+	 * it in <code>engageSubject()</code>, so the cached value would
+	 * be rebuilt when the the <code>subject</code> was set to <code>null</code>
 	 */
 	public void testCustomBuildValueWithNullSubject() {
 		TestSubject customSubject = new TestSubject("fred", "laborer");
-		ModifiablePropertyValueModel<TestSubject> customSubjectHolder = new SimplePropertyValueModel<>(customSubject);
-		ModifiablePropertyValueModel<String> customAA = this.buildCustomAspectAdapter(customSubjectHolder);
+		ModifiablePropertyValueModel<TestSubject> customSubjectModel = new SimplePropertyValueModel<>(customSubject);
+		ModifiablePropertyValueModel<String> customAA = this.buildCustomAspectAdapter(customSubjectModel);
 		PropertyChangeListener customListener = this.buildCustomValueChangeListener();
 		customAA.addPropertyChangeListener(PropertyValueModel.VALUE, customListener);
 		assertEquals("fred", customAA.getValue());
@@ -213,7 +215,7 @@
 		assertEquals("wilma", this.customValueEvent.getNewValue());
 
 		this.customValueEvent = null;
-		customSubjectHolder.setValue(null);
+		customSubjectModel.setValue(null);
 		// this would fail - the value would be null...
 		assertEquals("<unnamed>", customAA.getValue());
 		assertEquals("wilma", this.customValueEvent.getOldValue());
@@ -224,8 +226,8 @@
 	 * Test a bug:
 	 * If two listeners were added to an aspect adapter, one with an
 	 * aspect name and one without, the aspect adapter would add its
-	 * 'subjectChangeListener' to its 'subjectHolder' twice. As a result,
-	 * the following code will trigger an IllegalArgumentException
+	 * <code>subjectChangeListener</code> to its <code>subjectModel</code> twice. As a result,
+	 * the following code will trigger an {@link IllegalArgumentException}
 	 * if the bug is present; otherwise, it completes silently.
 	 */
 	public void testDuplicateListener() {
@@ -233,11 +235,40 @@
 		this.aa1.addChangeListener(listener2);
 	}
 
-	private ModifiablePropertyValueModel<String> buildCustomAspectAdapter(PropertyValueModel<TestSubject> subjectHolder) {
-		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter_(
-				subjectHolder,
+	public void testBogusTransformer() {
+		PropertyValueModel<Boolean> nameIsFooModel = this.buildNameIsFooModel(this.subjectModel1);
+		assertNull(nameIsFooModel.getValue());
+
+		nameIsFooModel.addPropertyChangeListener(PropertyValueModel.VALUE, this.listener1);
+		assertTrue(nameIsFooModel.getValue().booleanValue());
+		this.subjectModel1.getValue().setName("bar");
+		boolean exCaught = false;
+		try {
+			assertFalse(nameIsFooModel.getValue().booleanValue());
+		} catch (ClassCastException ex) {
+			exCaught = true;
+		}
+		assertTrue(exCaught);
+	}
+
+	// **********
+	// ********** NB: this type of aspect adapter is NOT ALLOWED! :-)
+	// ********** an aspect adapter's value MUST match the aspect's value;
+	// ********** it CANNOT transform it
+	// **********
+	private PropertyValueModel<Boolean> buildNameIsFooModel(PropertyValueModel<TestSubject> subjectModel) {
+		return PropertyValueModelTools.subjectModelAspectAdapter(
+				subjectModel,
 				TestSubject.NAME_PROPERTY,
-				TestSubject.CUSTOM_NAME_TRANSFORMER,
+				s -> Boolean.valueOf((s != null) && ObjectTools.equals(s.getName(), "foo"))
+			);
+	}
+
+	private ModifiablePropertyValueModel<String> buildCustomAspectAdapter(PropertyValueModel<TestSubject> subjectModel) {
+		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter_(
+				subjectModel,
+				TestSubject.NAME_PROPERTY,
+				s -> (s == null) ? "<unnamed>" : s.getName(),
 				TestSubject.SET_NAME_CLOSURE
 			);
 	}
@@ -271,15 +302,6 @@
 					return model.getName();
 				}
 			}
-			public static final Transformer<TestSubject, String> CUSTOM_NAME_TRANSFORMER = new CustomNameTransformer();
-			public static final class CustomNameTransformer
-				extends TransformerAdapter<TestSubject, String>
-			{
-				@Override
-				public String transform(TestSubject model) {
-					return (model == null) ? "<unnamed>" : model.getName();
-				}
-			}
 			public static final BiClosure<TestSubject, String> SET_NAME_CLOSURE = new SetNameClosure();
 			public static final class SetNameClosure
 				extends BiClosureAdapter<TestSubject, String>
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.ui/src/org/eclipse/jpt/jaxb/ui/internal/properties/JaxbProjectPropertiesPage.java b/jaxb/plugins/org.eclipse.jpt.jaxb.ui/src/org/eclipse/jpt/jaxb/ui/internal/properties/JaxbProjectPropertiesPage.java
index f1b6b26..5159fa0 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.ui/src/org/eclipse/jpt/jaxb/ui/internal/properties/JaxbProjectPropertiesPage.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.ui/src/org/eclipse/jpt/jaxb/ui/internal/properties/JaxbProjectPropertiesPage.java
@@ -14,7 +14,6 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
-import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.jpt.common.core.internal.utility.ICUStringCollator;
 import org.eclipse.jpt.common.ui.internal.WorkbenchTools;
@@ -38,7 +37,6 @@
 import org.eclipse.jpt.common.utility.model.value.ListValueModel;
 import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel;
 import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
-import org.eclipse.jpt.common.utility.transformer.Transformer;
 import org.eclipse.jpt.jaxb.core.JaxbPreferences;
 import org.eclipse.jpt.jaxb.core.JaxbProject;
 import org.eclipse.jpt.jaxb.core.JaxbProjectManager;
@@ -102,18 +100,7 @@
 	}
 
 	private PropertyValueModel<PropertyValueModel<JaxbProject>> buildJaxbProjectModelModel() {
-		return PropertyValueModelTools.transform(this.projectModel, JAXB_PROJECT_MODEL_TRANSFORMER);
-	}
-
-	private static final Transformer<IProject, PropertyValueModel<JaxbProject>> JAXB_PROJECT_MODEL_TRANSFORMER = new JaxbProjectModelTransformer();
-
-	/* CU private */ static class JaxbProjectModelTransformer
-		extends TransformerAdapter<IProject, PropertyValueModel<JaxbProject>>
-	{
-		@Override
-		public PropertyValueModel<JaxbProject> transform(IProject project) {
-			return project.getAdapter(JaxbProjectModel.class);
-		}
+		return PropertyValueModelTools.transform(this.projectModel, p -> p.getAdapter(JaxbProjectModel.class));
 	}
 
 	// ***** platform ID model
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.ui/src/org/eclipse/jpt/jaxb/ui/internal/properties/JaxbSchemasPropertiesPage.java b/jaxb/plugins/org.eclipse.jpt.jaxb.ui/src/org/eclipse/jpt/jaxb/ui/internal/properties/JaxbSchemasPropertiesPage.java
index 2767eda..e9cebd1 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.ui/src/org/eclipse/jpt/jaxb/ui/internal/properties/JaxbSchemasPropertiesPage.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.ui/src/org/eclipse/jpt/jaxb/ui/internal/properties/JaxbSchemasPropertiesPage.java
@@ -58,7 +58,6 @@
 import org.eclipse.jpt.common.utility.internal.model.value.AspectAdapter;
 import org.eclipse.jpt.common.utility.internal.model.value.BufferedPropertyValueModelAdapter;
 import org.eclipse.jpt.common.utility.internal.model.value.CollectionValueModelTools;
-import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapterXXXX;
 import org.eclipse.jpt.common.utility.internal.model.value.PropertyValueModelTools;
 import org.eclipse.jpt.common.utility.internal.model.value.SimpleCollectionValueModel;
 import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
@@ -144,19 +143,9 @@
 	}
 
 	private PropertyValueModel<PropertyValueModel<JaxbProject>> buildJaxbProjectModelModel() {
-		return PropertyValueModelTools.transform(this.projectModel, JAXB_PROJECT_MODEL_TRANSFORMER);
+		return PropertyValueModelTools.transform(this.projectModel, p -> p.getAdapter(JaxbProjectModel.class));
 	}
 
-	private static final Transformer<IProject, PropertyValueModel<JaxbProject>> JAXB_PROJECT_MODEL_TRANSFORMER = new JaxbProjectModelTransformer();
-
-	/* CU private */ static class JaxbProjectModelTransformer
-		extends TransformerAdapter<IProject, PropertyValueModel<JaxbProject>>
-	{
-		@Override
-		public PropertyValueModel<JaxbProject> transform(IProject project) {
-			return project.getAdapter(JaxbProjectModel.class);
-		}
-	}
 
 	protected IProject getProject() {
 		return this.projectModel.getValue();
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/JoinColumnRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/JoinColumnRelationship.java
index aa9a1bd..d31b4f2 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/JoinColumnRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/JoinColumnRelationship.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2013 Oracle. All rights reserved.
+ * Copyright (c) 2010, 2016 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.
@@ -41,6 +41,7 @@
 	 * relationship's current strategy.
 	 */
 	boolean strategyIsJoinColumn();
+		String STRATEGY_IS_JOIN_COLUMN_PROPERTY = "strategyIsJoinColumn";  //$NON-NLS-1$
 
 	/**
 	 * Return whether this relationship may potentially have a default join
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/JoinTableRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/JoinTableRelationship.java
index 671b0ae..6a14f38 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/JoinTableRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/JoinTableRelationship.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2013 Oracle. All rights reserved.
+ * Copyright (c) 2010, 2016 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.
@@ -38,6 +38,7 @@
 	 * relationship's current strategy.
 	 */
 	boolean strategyIsJoinTable();
+		String STRATEGY_IS_JOIN_TABLE_PROPERTY = "strategyIsJoinTable";  //$NON-NLS-1$
 
 	/**
 	 * Return whether this relationship may potentially have a default join
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/MappedByRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/MappedByRelationship.java
index b5bfde1..7c61121 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/MappedByRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/MappedByRelationship.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2013 Oracle. All rights reserved.
+ * Copyright (c) 2009, 2016 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.
@@ -39,6 +39,7 @@
 	 * relationship's current strategy.
 	 */
 	boolean strategyIsMappedBy();
+		String STRATEGY_IS_MAPPED_BY_PROPERTY = "strategyIsMappedBy";  //$NON-NLS-1$
 
 	/**
 	 * Set the relationship's strategy to the "mapped by" strategy.
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/PrimaryKeyJoinColumnRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/PrimaryKeyJoinColumnRelationship.java
index 90d8408..bd981f8 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/PrimaryKeyJoinColumnRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/PrimaryKeyJoinColumnRelationship.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2013 Oracle. All rights reserved.
+ * Copyright (c) 2009, 2016 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.
@@ -37,6 +37,7 @@
 	 * relationship's current strategy.
 	 */
 	boolean strategyIsPrimaryKeyJoinColumn();
+		String STRATEGY_IS_PRIMARY_KEY_JOIN_COLUMN_PROPERTY = "strategyIsPrimaryKeyJoinColumn"; //$NON-NLS-1$
 
 	/**
 	 * Set the relationship's strategy to the primary key join column strategy.
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/Relationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/Relationship.java
index 6929d18..e97ed86 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/Relationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/Relationship.java
@@ -56,12 +56,8 @@
 	Entity getEntity();
 
 	/**
-	 * String associated with changes to the predominant strategy property
-	 */
-	final static String STRATEGY_PROPERTY = "strategy";  //$NON-NLS-1$
-
-	/**
 	 * Return the current strategy, this is never <code>null</code>.
 	 */
 	RelationshipStrategy getStrategy();
+		String STRATEGY_PROPERTY = "strategy";  //$NON-NLS-1$
 }
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaMappingRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaMappingRelationship.java
index 7953a37..07395c4 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaMappingRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaMappingRelationship.java
@@ -51,8 +51,7 @@
 
 	protected void setStrategy(SpecifiedRelationshipStrategy strategy) {
 		SpecifiedRelationshipStrategy old = this.strategy;
-		this.strategy = strategy;
-		this.firePropertyChanged(STRATEGY_PROPERTY, old, strategy);
+		this.firePropertyChanged(STRATEGY_PROPERTY, old, this.strategy = strategy);
 	}
 
 	protected abstract SpecifiedRelationshipStrategy buildStrategy();
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaManyToManyRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaManyToManyRelationship.java
index 88cc5bf..9f59e38 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaManyToManyRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaManyToManyRelationship.java
@@ -28,6 +28,9 @@
 	extends AbstractJavaMappingRelationship<JavaManyToManyMapping>
 	implements JavaManyToManyRelationship
 {
+	protected boolean strategyIsMappedBy;
+	protected boolean strategyIsJoinTable;
+
 	protected final SpecifiedMappedByRelationshipStrategy mappedByStrategy;
 
 	protected final JavaSpecifiedJoinTableRelationshipStrategy joinTableStrategy;
@@ -54,6 +57,8 @@
 	@Override
 	public void update(IProgressMonitor monitor) {
 		super.update(monitor);
+		this.setStrategyIsMappedBy(this.buildStrategyIsMappedBy());
+		this.setStrategyIsJoinTable(this.buildStrategyIsJoinTable());
 		this.mappedByStrategy.update(monitor);
 		this.joinTableStrategy.update(monitor);
 	}
@@ -77,6 +82,15 @@
 	}
 
 	public boolean strategyIsMappedBy() {
+		return this.strategyIsMappedBy;
+	}
+
+	protected void setStrategyIsMappedBy(boolean strategyIsMappedBy) {
+		boolean old = this.strategyIsMappedBy;
+		this.firePropertyChanged(STRATEGY_IS_MAPPED_BY_PROPERTY, old, this.strategyIsMappedBy = strategyIsMappedBy);
+	}
+
+	protected boolean buildStrategyIsMappedBy() {
 		return this.strategy == this.mappedByStrategy;
 	}
 
@@ -102,6 +116,15 @@
 	}
 
 	public boolean strategyIsJoinTable() {
+		return this.strategyIsJoinTable;
+	}
+
+	protected void setStrategyIsJoinTable(boolean strategyIsJoinTable) {
+		boolean old = this.strategyIsJoinTable;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_TABLE_PROPERTY, old, this.strategyIsJoinTable = strategyIsJoinTable);
+	}
+
+	protected boolean buildStrategyIsJoinTable() {
 		return this.strategy == this.joinTableStrategy;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaManyToOneRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaManyToOneRelationship.java
index d58beb9..455dda9 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaManyToOneRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaManyToOneRelationship.java
@@ -26,6 +26,9 @@
 	extends AbstractJavaMappingRelationship<JavaManyToOneMapping>
 	implements JavaManyToOneRelationship2_0
 {
+	protected boolean strategyIsJoinColumn;
+	protected boolean strategyIsJoinTable;
+
 	protected final JavaSpecifiedJoinColumnRelationshipStrategy joinColumnStrategy;
 
 	// JPA 2.0
@@ -53,6 +56,8 @@
 	@Override
 	public void update(IProgressMonitor monitor) {
 		super.update(monitor);
+		this.setStrategyIsJoinColumn(this.buildStrategyIsJoinColumn());
+		this.setStrategyIsJoinTable(this.buildStrategyIsJoinTable());
 		this.joinColumnStrategy.update(monitor);
 		this.joinTableStrategy.update(monitor);
 	}
@@ -71,6 +76,41 @@
 	}
 
 
+	// ********** join column strategy **********
+
+	public JavaSpecifiedJoinColumnRelationshipStrategy getJoinColumnStrategy() {
+		return this.joinColumnStrategy;
+	}
+
+	public boolean strategyIsJoinColumn() {
+		return this.strategyIsJoinColumn;
+	}
+
+	protected void setStrategyIsJoinColumn(boolean strategyIsJoinColumn) {
+		boolean old = this.strategyIsJoinColumn;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_COLUMN_PROPERTY, old, this.strategyIsJoinColumn = strategyIsJoinColumn);
+	}
+
+	protected boolean buildStrategyIsJoinColumn() {
+		return this.strategy == this.joinColumnStrategy;
+	}
+
+	public void setStrategyToJoinColumn() {
+		// join column strategy is the default; so no need to add stuff,
+		// just remove all the others
+		this.joinTableStrategy.removeStrategy();
+		this.updateStrategy();
+	}
+
+	public boolean mayHaveDefaultJoinColumn() {
+		return this.joinTableStrategy.getJoinTable() == null;
+	}
+
+	protected JavaSpecifiedJoinColumnRelationshipStrategy buildJoinColumnStrategy() {
+		return new GenericJavaMappingJoinColumnRelationshipStrategy(this);
+	}
+
+
 	// ********** join table strategy **********
 
 	public JavaSpecifiedJoinTableRelationshipStrategy getJoinTableStrategy() {
@@ -78,6 +118,15 @@
 	}
 
 	public boolean strategyIsJoinTable() {
+		return this.strategyIsJoinTable;
+	}
+
+	protected void setStrategyIsJoinTable(boolean strategyIsJoinTable) {
+		boolean old = this.strategyIsJoinTable;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_TABLE_PROPERTY, old, this.strategyIsJoinTable = strategyIsJoinTable);
+	}
+
+	protected boolean buildStrategyIsJoinTable() {
 		return this.strategy == this.joinTableStrategy;
 	}
 
@@ -98,32 +147,6 @@
 	}
 
 
-	// ********** join column strategy **********
-
-	public JavaSpecifiedJoinColumnRelationshipStrategy getJoinColumnStrategy() {
-		return this.joinColumnStrategy;
-	}
-
-	public boolean strategyIsJoinColumn() {
-		return this.strategy == this.joinColumnStrategy;
-	}
-
-	public void setStrategyToJoinColumn() {
-		// join column strategy is the default; so no need to add stuff,
-		// just remove all the others
-		this.joinTableStrategy.removeStrategy();
-		this.updateStrategy();
-	}
-
-	public boolean mayHaveDefaultJoinColumn() {
-		return this.joinTableStrategy.getJoinTable() == null;
-	}
-
-	protected JavaSpecifiedJoinColumnRelationshipStrategy buildJoinColumnStrategy() {
-		return new GenericJavaMappingJoinColumnRelationshipStrategy(this);
-	}
-
-
 	// ********** misc **********
 
 	public boolean isOwner() {
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaOneToManyRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaOneToManyRelationship.java
index 1de3fab..040d12b 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaOneToManyRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaOneToManyRelationship.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Oracle. All rights reserved.
+ * Copyright (c) 2009, 2016 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.
@@ -30,6 +30,10 @@
 	extends AbstractJavaMappingRelationship<JavaOneToManyMapping>
 	implements JavaOneToManyRelationship2_0
 {
+	protected boolean strategyIsMappedBy;
+	protected boolean strategyIsJoinTable;
+	protected boolean strategyIsJoinColumn;
+
 	protected final SpecifiedMappedByRelationshipStrategy mappedByStrategy;
 
 	protected final JavaSpecifiedJoinTableRelationshipStrategy joinTableStrategy;
@@ -65,6 +69,9 @@
 	@Override
 	public void update(IProgressMonitor monitor) {
 		super.update(monitor);
+		this.setStrategyIsMappedBy(this.buildStrategyIsMappedBy());
+		this.setStrategyIsJoinTable(this.buildStrategyIsJoinTable());
+		this.setStrategyIsJoinColumn(this.buildStrategyIsJoinColumn());
 		this.mappedByStrategy.update(monitor);
 		this.joinColumnStrategy.update(monitor);
 		this.joinTableStrategy.update(monitor);
@@ -94,6 +101,15 @@
 	}
 
 	public boolean strategyIsMappedBy() {
+		return this.strategyIsMappedBy;
+	}
+
+	protected void setStrategyIsMappedBy(boolean strategyIsMappedBy) {
+		boolean old = this.strategyIsMappedBy;
+		this.firePropertyChanged(STRATEGY_IS_MAPPED_BY_PROPERTY, old, this.strategyIsMappedBy = strategyIsMappedBy);
+	}
+
+	protected boolean buildStrategyIsMappedBy() {
 		return this.strategy == this.mappedByStrategy;
 	}
 
@@ -127,6 +143,15 @@
 	}
 
 	public boolean strategyIsJoinTable() {
+		return this.strategyIsJoinTable;
+	}
+
+	protected void setStrategyIsJoinTable(boolean strategyIsJoinTable) {
+		boolean old = this.strategyIsJoinTable;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_TABLE_PROPERTY, old, this.strategyIsJoinTable = strategyIsJoinTable);
+	}
+
+	protected boolean buildStrategyIsJoinTable() {
 		return this.strategy == this.joinTableStrategy;
 	}
 
@@ -154,6 +179,15 @@
 	}
 
 	public boolean strategyIsJoinColumn() {
+		return this.strategyIsJoinColumn;
+	}
+
+	protected void setStrategyIsJoinColumn(boolean strategyIsJoinColumn) {
+		boolean old = this.strategyIsJoinColumn;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_COLUMN_PROPERTY, old, this.strategyIsJoinColumn = strategyIsJoinColumn);
+	}
+
+	protected boolean buildStrategyIsJoinColumn() {
 		return this.strategy == this.joinColumnStrategy;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaOneToOneRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaOneToOneRelationship.java
index 8aaf3f8..ed9d655 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaOneToOneRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/GenericJavaOneToOneRelationship.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Oracle. All rights reserved.
+ * Copyright (c) 2009, 2016 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.
@@ -31,6 +31,11 @@
 	extends AbstractJavaMappingRelationship<JavaOneToOneMapping>
 	implements JavaOneToOneRelationship2_0
 {
+	protected boolean strategyIsMappedBy;
+	protected boolean strategyIsPrimaryKeyJoinColumn;
+	protected boolean strategyIsJoinTable;
+	protected boolean strategyIsJoinColumn;
+
 	protected final SpecifiedMappedByRelationshipStrategy mappedByStrategy;
 
 	protected final JavaSpecifiedPrimaryKeyJoinColumnRelationshipStrategy primaryKeyJoinColumnStrategy;
@@ -66,6 +71,10 @@
 	@Override
 	public void update(IProgressMonitor monitor) {
 		super.update(monitor);
+		this.setStrategyIsMappedBy(this.buildStrategyIsMappedBy());
+		this.setStrategyIsPrimaryKeyJoinColumn(this.buildStrategyIsPrimaryKeyJoinColumn());
+		this.setStrategyIsJoinTable(this.buildStrategyIsJoinTable());
+		this.setStrategyIsJoinColumn(this.buildStrategyIsJoinColumn());
 		this.mappedByStrategy.update(monitor);
 		this.primaryKeyJoinColumnStrategy.update(monitor);
 		this.joinTableStrategy.update(monitor);
@@ -99,6 +108,15 @@
 	}
 
 	public boolean strategyIsMappedBy() {
+		return this.strategyIsMappedBy;
+	}
+
+	protected void setStrategyIsMappedBy(boolean strategyIsMappedBy) {
+		boolean old = this.strategyIsMappedBy;
+		this.firePropertyChanged(STRATEGY_IS_MAPPED_BY_PROPERTY, old, this.strategyIsMappedBy = strategyIsMappedBy);
+	}
+
+	protected boolean buildStrategyIsMappedBy() {
 		return this.strategy == this.mappedByStrategy;
 	}
 
@@ -126,6 +144,15 @@
 	}
 
 	public boolean strategyIsPrimaryKeyJoinColumn() {
+		return this.strategyIsPrimaryKeyJoinColumn;
+	}
+
+	protected void setStrategyIsPrimaryKeyJoinColumn(boolean strategyIsPrimaryKeyJoinColumn) {
+		boolean old = this.strategyIsPrimaryKeyJoinColumn;
+		this.firePropertyChanged(STRATEGY_IS_PRIMARY_KEY_JOIN_COLUMN_PROPERTY, old, this.strategyIsPrimaryKeyJoinColumn = strategyIsPrimaryKeyJoinColumn);
+	}
+
+	protected boolean buildStrategyIsPrimaryKeyJoinColumn() {
 		return this.strategy == this.primaryKeyJoinColumnStrategy;
 	}
 
@@ -149,6 +176,15 @@
 	}
 
 	public boolean strategyIsJoinTable() {
+		return this.strategyIsJoinTable;
+	}
+
+	protected void setStrategyIsJoinTable(boolean strategyIsJoinTable) {
+		boolean old = this.strategyIsJoinTable;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_TABLE_PROPERTY, old, this.strategyIsJoinTable = strategyIsJoinTable);
+	}
+
+	protected boolean buildStrategyIsJoinTable() {
 		return this.strategy == this.joinTableStrategy;
 	}
 
@@ -178,6 +214,15 @@
 	}
 
 	public boolean strategyIsJoinColumn() {
+		return this.strategyIsJoinColumn;
+	}
+
+	protected void setStrategyIsJoinColumn(boolean strategyIsJoinColumn) {
+		boolean old = this.strategyIsJoinColumn;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_COLUMN_PROPERTY, old, this.strategyIsJoinColumn = strategyIsJoinColumn);
+	}
+
+	protected boolean buildStrategyIsJoinColumn() {
 		return this.strategy == this.joinColumnStrategy;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmMappingRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmMappingRelationship.java
index 7c5f31d..8d8e9e8 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmMappingRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmMappingRelationship.java
@@ -56,8 +56,7 @@
 
 	protected void setStrategy(SpecifiedRelationshipStrategy strategy) {
 		SpecifiedRelationshipStrategy old = this.strategy;
-		this.strategy = strategy;
-		this.firePropertyChanged(STRATEGY_PROPERTY, old, strategy);
+		this.firePropertyChanged(STRATEGY_PROPERTY, old, this.strategy = strategy);
 	}
 
 	protected abstract SpecifiedRelationshipStrategy buildStrategy();
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmManyToManyRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmManyToManyRelationship.java
index b211300..63e20a4 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmManyToManyRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmManyToManyRelationship.java
@@ -30,6 +30,9 @@
 	extends AbstractOrmMappingRelationship<OrmManyToManyMapping>
 	implements OrmManyToManyRelationship
 {
+	protected boolean strategyIsMappedBy;
+	protected boolean strategyIsJoinTable;
+
 	protected final OrmSpecifiedMappedByRelationshipStrategy mappedByStrategy;
 
 	protected final OrmSpecifiedJoinTableRelationshipStrategy joinTableStrategy;
@@ -56,6 +59,8 @@
 	@Override
 	public void update(IProgressMonitor monitor) {
 		super.update(monitor);
+		this.setStrategyIsMappedBy(this.buildStrategyIsMappedBy());
+		this.setStrategyIsJoinTable(this.buildStrategyIsJoinTable());
 		this.mappedByStrategy.update(monitor);
 		this.joinTableStrategy.update(monitor);
 	}
@@ -79,6 +84,15 @@
 	}
 
 	public boolean strategyIsMappedBy() {
+		return this.strategyIsMappedBy;
+	}
+
+	protected void setStrategyIsMappedBy(boolean strategyIsMappedBy) {
+		boolean old = this.strategyIsMappedBy;
+		this.firePropertyChanged(STRATEGY_IS_MAPPED_BY_PROPERTY, old, this.strategyIsMappedBy = strategyIsMappedBy);
+	}
+
+	protected boolean buildStrategyIsMappedBy() {
 		return this.strategy == this.mappedByStrategy;
 	}
 
@@ -104,6 +118,15 @@
 	}
 
 	public boolean strategyIsJoinTable() {
+		return this.strategyIsJoinTable;
+	}
+
+	protected void setStrategyIsJoinTable(boolean strategyIsJoinTable) {
+		boolean old = this.strategyIsJoinTable;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_TABLE_PROPERTY, old, this.strategyIsJoinTable = strategyIsJoinTable);
+	}
+
+	protected boolean buildStrategyIsJoinTable() {
 		return this.strategy == this.joinTableStrategy;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmManyToOneRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmManyToOneRelationship.java
index 32d20dc..a041456 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmManyToOneRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmManyToOneRelationship.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Oracle. All rights reserved.
+ * Copyright (c) 2009, 2016 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.
@@ -28,6 +28,9 @@
 	extends AbstractOrmMappingRelationship<OrmManyToOneMapping>
 	implements OrmManyToOneRelationship2_0
 {
+	protected boolean strategyIsJoinColumn;
+	protected boolean strategyIsJoinTable;
+
 	protected final OrmSpecifiedJoinColumnRelationshipStrategy joinColumnStrategy;
 
 	// JPA 2.0
@@ -55,6 +58,8 @@
 	@Override
 	public void update(IProgressMonitor monitor) {
 		super.update(monitor);
+		this.setStrategyIsJoinColumn(this.buildStrategyIsJoinColumn());
+		this.setStrategyIsJoinTable(this.buildStrategyIsJoinTable());
 		this.joinColumnStrategy.update(monitor);
 		this.joinTableStrategy.update(monitor);
 	}
@@ -73,6 +78,41 @@
 	}
 
 
+	// ********** join column strategy **********
+
+	public OrmSpecifiedJoinColumnRelationshipStrategy getJoinColumnStrategy() {
+		return this.joinColumnStrategy;
+	}
+
+	public boolean strategyIsJoinColumn() {
+		return this.strategyIsJoinColumn;
+	}
+
+	protected void setStrategyIsJoinColumn(boolean strategyIsJoinColumn) {
+		boolean old = this.strategyIsJoinColumn;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_COLUMN_PROPERTY, old, this.strategyIsJoinColumn = strategyIsJoinColumn);
+	}
+
+	protected boolean buildStrategyIsJoinColumn() {
+		return this.strategy == this.joinColumnStrategy;
+	}
+
+	public void setStrategyToJoinColumn() {
+		// join column strategy is the default; so no need to add stuff,
+		// just remove all the others
+		this.joinTableStrategy.removeStrategy();
+		this.updateStrategy();
+	}
+
+	public boolean mayHaveDefaultJoinColumn() {
+		return this.joinTableStrategy.getJoinTable() == null;
+	}
+
+	protected OrmSpecifiedJoinColumnRelationshipStrategy buildJoinColumnStrategy() {
+		return new GenericOrmMappingJoinColumnRelationshipStrategy(this);
+	}
+
+
 	// ********** join table strategy **********
 
 	public OrmSpecifiedJoinTableRelationshipStrategy getJoinTableStrategy() {
@@ -80,6 +120,15 @@
 	}
 
 	public boolean strategyIsJoinTable() {
+		return this.strategyIsJoinTable;
+	}
+
+	protected void setStrategyIsJoinTable(boolean strategyIsJoinTable) {
+		boolean old = this.strategyIsJoinTable;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_TABLE_PROPERTY, old, this.strategyIsJoinTable = strategyIsJoinTable);
+	}
+
+	protected boolean buildStrategyIsJoinTable() {
 		return this.strategy == this.joinTableStrategy;
 	}
 
@@ -100,33 +149,6 @@
 	}
 
 
-
-	// ********** join column strategy **********
-
-	public OrmSpecifiedJoinColumnRelationshipStrategy getJoinColumnStrategy() {
-		return this.joinColumnStrategy;
-	}
-
-	public boolean strategyIsJoinColumn() {
-		return this.strategy == this.joinColumnStrategy;
-	}
-
-	public void setStrategyToJoinColumn() {
-		// join column strategy is the default; so no need to add stuff,
-		// just remove all the others
-		this.joinTableStrategy.removeStrategy();
-		this.updateStrategy();
-	}
-
-	public boolean mayHaveDefaultJoinColumn() {
-		return this.joinTableStrategy.getJoinTable() == null;
-	}
-
-	protected OrmSpecifiedJoinColumnRelationshipStrategy buildJoinColumnStrategy() {
-		return new GenericOrmMappingJoinColumnRelationshipStrategy(this);
-	}
-
-
 	// ********** conversions **********
 
 	public void initializeOn(OrmMappingRelationship newRelationship) {
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmOneToManyRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmOneToManyRelationship.java
index db31260..d35870a 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmOneToManyRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmOneToManyRelationship.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Oracle. All rights reserved.
+ * Copyright (c) 2009, 2016 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.
@@ -33,6 +33,10 @@
 	extends AbstractOrmMappingRelationship<OrmOneToManyMapping>
 	implements OrmOneToManyRelationship2_0
 {
+	protected boolean strategyIsMappedBy;
+	protected boolean strategyIsJoinTable;
+	protected boolean strategyIsJoinColumn;
+
 	protected final OrmSpecifiedMappedByRelationshipStrategy mappedByStrategy;
 
 	protected final OrmSpecifiedJoinTableRelationshipStrategy joinTableStrategy;
@@ -68,6 +72,9 @@
 	@Override
 	public void update(IProgressMonitor monitor) {
 		super.update(monitor);
+		this.setStrategyIsMappedBy(this.buildStrategyIsMappedBy());
+		this.setStrategyIsJoinTable(this.buildStrategyIsJoinTable());
+		this.setStrategyIsJoinColumn(this.buildStrategyIsJoinColumn());
 		this.mappedByStrategy.update(monitor);
 		this.joinColumnStrategy.update(monitor);
 		this.joinTableStrategy.update(monitor);
@@ -97,6 +104,15 @@
 	}
 
 	public boolean strategyIsMappedBy() {
+		return this.strategyIsMappedBy;
+	}
+
+	protected void setStrategyIsMappedBy(boolean strategyIsMappedBy) {
+		boolean old = this.strategyIsMappedBy;
+		this.firePropertyChanged(STRATEGY_IS_MAPPED_BY_PROPERTY, old, this.strategyIsMappedBy = strategyIsMappedBy);
+	}
+
+	protected boolean buildStrategyIsMappedBy() {
 		return this.strategy == this.mappedByStrategy;
 	}
 
@@ -130,6 +146,15 @@
 	}
 
 	public boolean strategyIsJoinTable() {
+		return this.strategyIsJoinTable;
+	}
+
+	protected void setStrategyIsJoinTable(boolean strategyIsJoinTable) {
+		boolean old = this.strategyIsJoinTable;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_TABLE_PROPERTY, old, this.strategyIsJoinTable = strategyIsJoinTable);
+	}
+
+	protected boolean buildStrategyIsJoinTable() {
 		return this.strategy == this.joinTableStrategy;
 	}
 
@@ -157,6 +182,15 @@
 	}
 
 	public boolean strategyIsJoinColumn() {
+		return this.strategyIsJoinColumn;
+	}
+
+	protected void setStrategyIsJoinColumn(boolean strategyIsJoinColumn) {
+		boolean old = this.strategyIsJoinColumn;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_COLUMN_PROPERTY, old, this.strategyIsJoinColumn = strategyIsJoinColumn);
+	}
+
+	protected boolean buildStrategyIsJoinColumn() {
 		return this.strategy == this.joinColumnStrategy;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmOneToOneRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmOneToOneRelationship.java
index fb0e6bf..12f3d43 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmOneToOneRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/GenericOrmOneToOneRelationship.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Oracle. All rights reserved.
+ * Copyright (c) 2009, 2016 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.
@@ -34,6 +34,11 @@
 	extends AbstractOrmMappingRelationship<OrmOneToOneMapping>
 	implements OrmOneToOneRelationship2_0
 {
+	protected boolean strategyIsMappedBy;
+	protected boolean strategyIsPrimaryKeyJoinColumn;
+	protected boolean strategyIsJoinTable;
+	protected boolean strategyIsJoinColumn;
+
 	protected final OrmSpecifiedMappedByRelationshipStrategy mappedByStrategy;
 
 	protected final OrmSpecifiedPrimaryKeyJoinColumnRelationshipStrategy primaryKeyJoinColumnStrategy;
@@ -69,6 +74,10 @@
 	@Override
 	public void update(IProgressMonitor monitor) {
 		super.update(monitor);
+		this.setStrategyIsMappedBy(this.buildStrategyIsMappedBy());
+		this.setStrategyIsPrimaryKeyJoinColumn(this.buildStrategyIsPrimaryKeyJoinColumn());
+		this.setStrategyIsJoinTable(this.buildStrategyIsJoinTable());
+		this.setStrategyIsJoinColumn(this.buildStrategyIsJoinColumn());
 		this.mappedByStrategy.update(monitor);
 		this.primaryKeyJoinColumnStrategy.update(monitor);
 		this.joinTableStrategy.update(monitor);
@@ -102,6 +111,15 @@
 	}
 
 	public boolean strategyIsMappedBy() {
+		return this.strategyIsMappedBy;
+	}
+
+	protected void setStrategyIsMappedBy(boolean strategyIsMappedBy) {
+		boolean old = this.strategyIsMappedBy;
+		this.firePropertyChanged(STRATEGY_IS_MAPPED_BY_PROPERTY, old, this.strategyIsMappedBy = strategyIsMappedBy);
+	}
+
+	protected boolean buildStrategyIsMappedBy() {
 		return this.strategy == this.mappedByStrategy;
 	}
 
@@ -129,6 +147,15 @@
 	}
 
 	public boolean strategyIsPrimaryKeyJoinColumn() {
+		return this.strategyIsPrimaryKeyJoinColumn;
+	}
+
+	protected void setStrategyIsPrimaryKeyJoinColumn(boolean strategyIsPrimaryKeyJoinColumn) {
+		boolean old = this.strategyIsPrimaryKeyJoinColumn;
+		this.firePropertyChanged(STRATEGY_IS_PRIMARY_KEY_JOIN_COLUMN_PROPERTY, old, this.strategyIsPrimaryKeyJoinColumn = strategyIsPrimaryKeyJoinColumn);
+	}
+
+	protected boolean buildStrategyIsPrimaryKeyJoinColumn() {
 		return this.strategy == this.primaryKeyJoinColumnStrategy;
 	}
 
@@ -152,6 +179,15 @@
 	}
 
 	public boolean strategyIsJoinTable() {
+		return this.strategyIsJoinTable;
+	}
+
+	protected void setStrategyIsJoinTable(boolean strategyIsJoinTable) {
+		boolean old = this.strategyIsJoinTable;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_TABLE_PROPERTY, old, this.strategyIsJoinTable = strategyIsJoinTable);
+	}
+
+	protected boolean buildStrategyIsJoinTable() {
 		return this.strategy == this.joinTableStrategy;
 	}
 
@@ -181,6 +217,15 @@
 	}
 
 	public boolean strategyIsJoinColumn() {
+		return this.strategyIsJoinColumn;
+	}
+
+	protected void setStrategyIsJoinColumn(boolean strategyIsJoinColumn) {
+		boolean old = this.strategyIsJoinColumn;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_COLUMN_PROPERTY, old, this.strategyIsJoinColumn = strategyIsJoinColumn);
+	}
+
+	protected boolean buildStrategyIsJoinColumn() {
 		return this.strategy == this.joinColumnStrategy;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/java/GenericJavaOverrideRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/java/GenericJavaOverrideRelationship.java
index 671eabc..2370b45 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/java/GenericJavaOverrideRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/java/GenericJavaOverrideRelationship.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Oracle. All rights reserved.
+ * Copyright (c) 2009, 2016 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.
@@ -42,6 +42,8 @@
 	implements JavaSpecifiedOverrideRelationship2_0
 {
 	protected SpecifiedRelationshipStrategy strategy;
+	protected boolean strategyIsJoinColumn;
+	protected boolean strategyIsJoinTable;
 
 	protected final JavaSpecifiedJoinColumnRelationshipStrategy joinColumnStrategy;
 
@@ -69,6 +71,8 @@
 	public void update(IProgressMonitor monitor) {
 		super.update(monitor);
 		this.setStrategy(this.buildStrategy());
+		this.setStrategyIsJoinColumn(this.buildStrategyIsJoinColumn());
+		this.setStrategyIsJoinTable(this.buildStrategyIsJoinTable());
 		this.joinColumnStrategy.update(monitor);
 		this.joinTableStrategy.update(monitor);
 	}
@@ -82,8 +86,7 @@
 
 	protected void setStrategy(SpecifiedRelationshipStrategy strategy) {
 		SpecifiedRelationshipStrategy old = this.strategy;
-		this.strategy = strategy;
-		this.firePropertyChanged(STRATEGY_PROPERTY, old, strategy);
+		this.firePropertyChanged(STRATEGY_PROPERTY, old, this.strategy = strategy);
 	}
 
 	protected SpecifiedRelationshipStrategy buildStrategy() {
@@ -128,6 +131,15 @@
 	}
 
 	public boolean strategyIsJoinColumn() {
+		return this.strategyIsJoinColumn;
+	}
+
+	protected void setStrategyIsJoinColumn(boolean strategyIsJoinColumn) {
+		boolean old = this.strategyIsJoinColumn;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_COLUMN_PROPERTY, old, this.strategyIsJoinColumn = strategyIsJoinColumn);
+	}
+
+	protected boolean buildStrategyIsJoinColumn() {
 		return this.strategy == this.joinColumnStrategy;
 	}
 
@@ -152,6 +164,15 @@
 	}
 
 	public boolean strategyIsJoinTable() {
+		return this.strategyIsJoinTable;
+	}
+
+	protected void setStrategyIsJoinTable(boolean strategyIsJoinTable) {
+		boolean old = this.strategyIsJoinTable;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_TABLE_PROPERTY, old, this.strategyIsJoinTable = strategyIsJoinTable);
+	}
+
+	protected boolean buildStrategyIsJoinTable() {
 		return this.strategy == this.joinTableStrategy;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/java/GenericJavaVirtualOverrideRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/java/GenericJavaVirtualOverrideRelationship.java
index 64f2584..c3ec4f7 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/java/GenericJavaVirtualOverrideRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/java/GenericJavaVirtualOverrideRelationship.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2015 Oracle. All rights reserved.
+ * Copyright (c) 2010, 2016 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.
@@ -39,6 +39,8 @@
 	implements VirtualOverrideRelationship2_0
 {
 	protected VirtualRelationshipStrategy strategy;
+	protected boolean strategyIsJoinColumn;
+	protected boolean strategyIsJoinTable;
 
 	protected final VirtualJoinColumnRelationshipStrategy joinColumnStrategy;
 
@@ -59,6 +61,8 @@
 	public void update(IProgressMonitor monitor) {
 		super.update(monitor);
 		this.setStrategy(this.buildStrategy());
+		this.setStrategyIsJoinColumn(this.buildStrategyIsJoinColumn());
+		this.setStrategyIsJoinTable(this.buildStrategyIsJoinTable());
 		this.joinColumnStrategy.update(monitor);
 		this.joinTableStrategy.update(monitor);
 	}
@@ -72,8 +76,7 @@
 
 	protected void setStrategy(VirtualRelationshipStrategy strategy) {
 		VirtualRelationshipStrategy old = this.strategy;
-		this.strategy = strategy;
-		this.firePropertyChanged(STRATEGY_PROPERTY, old, strategy);
+		this.firePropertyChanged(STRATEGY_PROPERTY, old, this.strategy = strategy);
 	}
 
 	protected VirtualRelationshipStrategy buildStrategy() {
@@ -118,6 +121,15 @@
 	}
 
 	public boolean strategyIsJoinColumn() {
+		return this.strategyIsJoinColumn;
+	}
+
+	protected void setStrategyIsJoinColumn(boolean strategyIsJoinColumn) {
+		boolean old = this.strategyIsJoinColumn;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_COLUMN_PROPERTY, old, this.strategyIsJoinColumn = strategyIsJoinColumn);
+	}
+
+	protected boolean buildStrategyIsJoinColumn() {
 		return this.strategy == this.joinColumnStrategy;
 	}
 
@@ -138,6 +150,15 @@
 	}
 
 	public boolean strategyIsJoinTable() {
+		return this.strategyIsJoinTable;
+	}
+
+	protected void setStrategyIsJoinTable(boolean strategyIsJoinTable) {
+		boolean old = this.strategyIsJoinTable;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_TABLE_PROPERTY, old, this.strategyIsJoinTable = strategyIsJoinTable);
+	}
+
+	protected boolean buildStrategyIsJoinTable() {
 		return this.strategy == this.joinTableStrategy;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmOverrideRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmOverrideRelationship.java
index 1baf0a4..09fcb44 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmOverrideRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmOverrideRelationship.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Oracle. All rights reserved.
+ * Copyright (c) 2009, 2016 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.
@@ -43,6 +43,8 @@
 	implements OrmSpecifiedOverrideRelationship2_0
 {
 	protected SpecifiedRelationshipStrategy strategy;
+	protected boolean strategyIsJoinColumn;
+	protected boolean strategyIsJoinTable;
 
 	protected final OrmSpecifiedJoinColumnRelationshipStrategy joinColumnStrategy;
 
@@ -70,6 +72,8 @@
 	public void update(IProgressMonitor monitor) {
 		super.update(monitor);
 		this.setStrategy(this.buildStrategy());
+		this.setStrategyIsJoinColumn(this.buildStrategyIsJoinColumn());
+		this.setStrategyIsJoinTable(this.buildStrategyIsJoinTable());
 		this.joinColumnStrategy.update(monitor);
 		this.joinTableStrategy.update(monitor);
 	}
@@ -83,8 +87,7 @@
 
 	protected void setStrategy(SpecifiedRelationshipStrategy strategy) {
 		SpecifiedRelationshipStrategy old = this.strategy;
-		this.strategy = strategy;
-		this.firePropertyChanged(STRATEGY_PROPERTY, old, strategy);
+		this.firePropertyChanged(STRATEGY_PROPERTY, old, this.strategy = strategy);
 	}
 
 	protected SpecifiedRelationshipStrategy buildStrategy() {
@@ -129,6 +132,15 @@
 	}
 
 	public boolean strategyIsJoinColumn() {
+		return this.strategyIsJoinColumn;
+	}
+
+	protected void setStrategyIsJoinColumn(boolean strategyIsJoinColumn) {
+		boolean old = this.strategyIsJoinColumn;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_COLUMN_PROPERTY, old, this.strategyIsJoinColumn = strategyIsJoinColumn);
+	}
+
+	protected boolean buildStrategyIsJoinColumn() {
 		return this.strategy == this.joinColumnStrategy;
 	}
 
@@ -154,6 +166,15 @@
 	}
 
 	public boolean strategyIsJoinTable() {
+		return this.strategyIsJoinTable;
+	}
+
+	protected void setStrategyIsJoinTable(boolean strategyIsJoinTable) {
+		boolean old = this.strategyIsJoinTable;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_TABLE_PROPERTY, old, this.strategyIsJoinTable = strategyIsJoinTable);
+	}
+
+	protected boolean buildStrategyIsJoinTable() {
 		return this.strategy == this.joinTableStrategy;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmVirtualOverrideRelationship.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmVirtualOverrideRelationship.java
index 0524e45..9a2144b 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmVirtualOverrideRelationship.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmVirtualOverrideRelationship.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2015 Oracle. All rights reserved.
+ * Copyright (c) 2010, 2016 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.
@@ -40,6 +40,8 @@
 	implements VirtualOverrideRelationship2_0
 {
 	protected VirtualRelationshipStrategy strategy;
+	protected boolean strategyIsJoinColumn;
+	protected boolean strategyIsJoinTable;
 
 	protected final VirtualJoinColumnRelationshipStrategy joinColumnStrategy;
 
@@ -60,6 +62,8 @@
 	public void update(IProgressMonitor monitor) {
 		super.update(monitor);
 		this.setStrategy(this.buildStrategy());
+		this.setStrategyIsJoinColumn(this.buildStrategyIsJoinColumn());
+		this.setStrategyIsJoinTable(this.buildStrategyIsJoinTable());
 		this.joinColumnStrategy.update(monitor);
 		this.joinTableStrategy.update(monitor);
 	}
@@ -73,8 +77,7 @@
 
 	protected void setStrategy(VirtualRelationshipStrategy strategy) {
 		VirtualRelationshipStrategy old = this.strategy;
-		this.strategy = strategy;
-		this.firePropertyChanged(STRATEGY_PROPERTY, old, strategy);
+		this.firePropertyChanged(STRATEGY_PROPERTY, old, this.strategy = strategy);
 	}
 
 	protected VirtualRelationshipStrategy buildStrategy() {
@@ -119,6 +122,15 @@
 	}
 
 	public boolean strategyIsJoinColumn() {
+		return this.strategyIsJoinColumn;
+	}
+
+	protected void setStrategyIsJoinColumn(boolean strategyIsJoinColumn) {
+		boolean old = this.strategyIsJoinColumn;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_COLUMN_PROPERTY, old, this.strategyIsJoinColumn = strategyIsJoinColumn);
+	}
+
+	protected boolean buildStrategyIsJoinColumn() {
 		return this.strategy == this.joinColumnStrategy;
 	}
 
@@ -139,6 +151,15 @@
 	}
 
 	public boolean strategyIsJoinTable() {
+		return this.strategyIsJoinTable;
+	}
+
+	protected void setStrategyIsJoinTable(boolean strategyIsJoinTable) {
+		boolean old = this.strategyIsJoinTable;
+		this.firePropertyChanged(STRATEGY_IS_JOIN_TABLE_PROPERTY, old, this.strategyIsJoinTable = strategyIsJoinTable);
+	}
+
+	protected boolean buildStrategyIsJoinTable() {
 		return this.strategy == this.joinTableStrategy;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2/context/java/GenericJavaDerivedIdentity2_0.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2/context/java/GenericJavaDerivedIdentity2_0.java
index 01da855..d21f871 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2/context/java/GenericJavaDerivedIdentity2_0.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2/context/java/GenericJavaDerivedIdentity2_0.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Oracle. All rights reserved.
+ * Copyright (c) 2009, 2016 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.
@@ -27,6 +27,8 @@
 {
 	/** this can be <code>null</code> */
 	protected DerivedIdentityStrategy2_0 strategy;
+	protected boolean usesIdDerivedIdentityStrategy;
+	protected boolean usesMapsIdDerivedIdentityStrategy;
 
 	protected final IdDerivedIdentityStrategy2_0 idStrategy;
 
@@ -55,6 +57,8 @@
 		this.idStrategy.update(monitor);
 		this.mapsIdStrategy.update(monitor);
 		this.updateStrategy();
+		this.setUsesIdDerivedIdentityStrategy(this.buildUsesIdDerivedIdentityStrategy());
+		this.setUsesMapsIdDerivedIdentityStrategy(this.buildUsesMapsIdDerivedIdentityStrategy());
 	}
 
 
@@ -66,8 +70,7 @@
 
 	protected void setStrategy(DerivedIdentityStrategy2_0 strategy) {
 		DerivedIdentityStrategy2_0 old = this.strategy;
-		this.strategy = strategy;
-		this.firePropertyChanged(PREDOMINANT_DERIVED_IDENTITY_STRATEGY_PROPERTY, old, strategy);
+		this.firePropertyChanged(PREDOMINANT_DERIVED_IDENTITY_STRATEGY_PROPERTY, old, this.strategy = strategy);
 	}
 
 	protected void updateStrategy() {
@@ -111,6 +114,15 @@
 	}
 
 	public boolean usesIdDerivedIdentityStrategy() {
+		return this.usesIdDerivedIdentityStrategy;
+	}
+
+	protected void setUsesIdDerivedIdentityStrategy(boolean usesIdDerivedIdentityStrategy) {
+		boolean old = this.usesIdDerivedIdentityStrategy;
+		this.firePropertyChanged(USES_ID_DERIVED_IDENTITY_STRATEGY_PROPERTY, old, this.usesIdDerivedIdentityStrategy = usesIdDerivedIdentityStrategy);
+	}
+
+	protected boolean buildUsesIdDerivedIdentityStrategy() {
 		return this.strategy == this.idStrategy;
 	}
 
@@ -132,6 +144,15 @@
 	}
 
 	public boolean usesMapsIdDerivedIdentityStrategy() {
+		return this.usesMapsIdDerivedIdentityStrategy;
+	}
+
+	protected void setUsesMapsIdDerivedIdentityStrategy(boolean usesMapsIdDerivedIdentityStrategy) {
+		boolean old = this.usesMapsIdDerivedIdentityStrategy;
+		this.firePropertyChanged(USES_MAPS_ID_DERIVED_IDENTITY_STRATEGY_PROPERTY, old, this.usesMapsIdDerivedIdentityStrategy = usesMapsIdDerivedIdentityStrategy);
+	}
+
+	protected boolean buildUsesMapsIdDerivedIdentityStrategy() {
 		return this.strategy == this.mapsIdStrategy;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2/context/orm/GenericOrmDerivedIdentity2_0.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2/context/orm/GenericOrmDerivedIdentity2_0.java
index 2c84399..14eb927 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2/context/orm/GenericOrmDerivedIdentity2_0.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2/context/orm/GenericOrmDerivedIdentity2_0.java
@@ -26,6 +26,8 @@
 	implements OrmDerivedIdentity2_0
 {
 	protected DerivedIdentityStrategy2_0 strategy;
+	protected boolean usesIdDerivedIdentityStrategy;
+	protected boolean usesMapsIdDerivedIdentityStrategy;
 
 	protected final OrmIdDerivedIdentityStrategy2_0 idStrategy;
 
@@ -54,6 +56,8 @@
 		this.idStrategy.update(monitor);
 		this.mapsIdStrategy.update(monitor);
 		this.updateStrategy();
+		this.setUsesIdDerivedIdentityStrategy(this.buildUsesIdDerivedIdentityStrategy());
+		this.setUsesMapsIdDerivedIdentityStrategy(this.buildUsesMapsIdDerivedIdentityStrategy());
 	}
 
 
@@ -65,8 +69,7 @@
 
 	protected void setStrategy(DerivedIdentityStrategy2_0 strategy) {
 		DerivedIdentityStrategy2_0 old = this.strategy;
-		this.strategy = strategy;
-		this.firePropertyChanged(PREDOMINANT_DERIVED_IDENTITY_STRATEGY_PROPERTY, old, strategy);
+		this.firePropertyChanged(PREDOMINANT_DERIVED_IDENTITY_STRATEGY_PROPERTY, old, this.strategy = strategy);
 	}
 
 	protected void updateStrategy() {
@@ -110,6 +113,15 @@
 	}
 
 	public boolean usesIdDerivedIdentityStrategy() {
+		return this.usesIdDerivedIdentityStrategy;
+	}
+
+	protected void setUsesIdDerivedIdentityStrategy(boolean usesIdDerivedIdentityStrategy) {
+		boolean old = this.usesIdDerivedIdentityStrategy;
+		this.firePropertyChanged(USES_ID_DERIVED_IDENTITY_STRATEGY_PROPERTY, old, this.usesIdDerivedIdentityStrategy = usesIdDerivedIdentityStrategy);
+	}
+
+	protected boolean buildUsesIdDerivedIdentityStrategy() {
 		return this.strategy == this.idStrategy;
 	}
 
@@ -131,6 +143,15 @@
 	}
 
 	public boolean usesMapsIdDerivedIdentityStrategy() {
+		return this.usesMapsIdDerivedIdentityStrategy;
+	}
+
+	protected void setUsesMapsIdDerivedIdentityStrategy(boolean usesMapsIdDerivedIdentityStrategy) {
+		boolean old = this.usesMapsIdDerivedIdentityStrategy;
+		this.firePropertyChanged(USES_MAPS_ID_DERIVED_IDENTITY_STRATEGY_PROPERTY, old, this.usesMapsIdDerivedIdentityStrategy = usesMapsIdDerivedIdentityStrategy);
+	}
+
+	protected boolean buildUsesMapsIdDerivedIdentityStrategy() {
 		return this.strategy == this.mapsIdStrategy;
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2/context/DerivedIdentity2_0.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2/context/DerivedIdentity2_0.java
index d225be0..391f820 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2/context/DerivedIdentity2_0.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2/context/DerivedIdentity2_0.java
@@ -75,6 +75,7 @@
 	 * Return whether the mapping uses an ID strategy.
 	 */
 	boolean usesIdDerivedIdentityStrategy();
+		String USES_ID_DERIVED_IDENTITY_STRATEGY_PROPERTY = "usesIdDerivedIdentityStrategy"; //$NON-NLS-1$
 	Predicate<DerivedIdentity2_0> USES_ID_DERIVED_IDENTITY_STRATEGY = new UsesIdDerivedIdentityStrategy();
 	class UsesIdDerivedIdentityStrategy
 		extends PredicateAdapter<DerivedIdentity2_0>
@@ -112,6 +113,7 @@
 	 * Return whether the mapping uses a "maps ID" strategy.
 	 */
 	boolean usesMapsIdDerivedIdentityStrategy();
+		String USES_MAPS_ID_DERIVED_IDENTITY_STRATEGY_PROPERTY = "usesMapsIdDerivedIdentityStrategy"; //$NON-NLS-1$
 	Predicate<DerivedIdentity2_0> USES_MAPS_ID_DERIVED_IDENTITY_STRATEGY = new UsesMapsIdDerivedIdentityStrategy();
 	class UsesMapsIdDerivedIdentityStrategy
 		extends PredicateAdapter<DerivedIdentity2_0>
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.core/src/org/eclipse/jpt/jpa/eclipselink/core/builder/EclipseLinkStaticWeavingBuilder.java b/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.core/src/org/eclipse/jpt/jpa/eclipselink/core/builder/EclipseLinkStaticWeavingBuilder.java
index dfe8f6b..e11377e 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.core/src/org/eclipse/jpt/jpa/eclipselink/core/builder/EclipseLinkStaticWeavingBuilder.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.core/src/org/eclipse/jpt/jpa/eclipselink/core/builder/EclipseLinkStaticWeavingBuilder.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012 Oracle. All rights reserved.
+ * Copyright (c) 2012, 2016 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.
@@ -26,35 +26,31 @@
 import org.eclipse.jpt.jpa.eclipselink.core.internal.plugin.JptJpaEclipseLinkCorePlugin;
 import org.eclipse.jpt.jpa.eclipselink.core.internal.weave.EclipseLinkStaticWeave;
 
-public class EclipseLinkStaticWeavingBuilder extends IncrementalProjectBuilder
+public class EclipseLinkStaticWeavingBuilder
+	extends IncrementalProjectBuilder
 {
     public static final String BUILDER_ID = JptJpaEclipseLinkCorePlugin.instance().getPluginID() + ".builder"; //$NON-NLS-1$
 
 	private EclipseLinkStaticWeavingBuilderConfigurator configurator;
 
-	private final SynchronizedBoolean generationCompleted;
-	private boolean generationSuccessful;
+	final SynchronizedBoolean generationCompleted = new SynchronizedBoolean(false);
+	boolean generationSuccessful = false;
 
-	// ********** constructor **********
 	
 	public EclipseLinkStaticWeavingBuilder() {
-		this.generationCompleted = new SynchronizedBoolean(false);
+		super();
 	}
 	
-	// ********** IncrementalProjectBuilder implementation **********
 	/**
      * Performs static weaving on project's model classes
      */
 	@Override
-	protected IProject[] build(int kind, Map<String, String> parameters, IProgressMonitor monitor) throws CoreException
-	{
+	protected IProject[] build(int kind, Map<String, String> parameters, IProgressMonitor monitor) throws CoreException {
 		this.staticWeaveGeneratorGenerate(monitor);
 
 		return new IProject[0];
 	}
 	
-	// ********** internal methods **********
-
 	private void staticWeaveGeneratorGenerate(IProgressMonitor monitor) throws CoreException {
 		this.generationCompleted.setFalse();
 		this.generationSuccessful = false;
@@ -71,25 +67,21 @@
 		staticWeaveGenerator.generate(monitor);
 		try {
 			this.generationCompleted.waitUntilTrue();
-		}
-		catch (InterruptedException e) {
+		} catch (InterruptedException e) {
 			throw new RuntimeException(e);
-		}
-		finally {
+		} finally {
 			staticWeaveGenerator.removeLaunchConfigListener(launchListener);
 			this.generationCompleted.setFalse();
 		}
 		
-		this.postGenerate(this.generationSuccessful);
+		this.postGenerate();
 	}
 	
-	protected void postGenerate(boolean generationSuccessful) throws CoreException {
-		if( ! generationSuccessful) {
+	protected void postGenerate() throws CoreException {
+		if ( ! this.generationSuccessful) {
 			throw new RuntimeException(JptJpaEclipseLinkCoreMessages.ECLIPSELINK_STATIC_WEAVING_BUILDER__STATIC_WEAVING_FAILED);
 		}
-		else {
-			this.refreshProject();
-		}
+		this.refreshProject();
 	}
 
 	private void refreshProject() throws CoreException {
@@ -99,8 +91,8 @@
 	private LaunchConfigListener buildLaunchListener() {
 		return new LaunchConfigListener() {
 			
-			public void launchCompleted(boolean generationSuccessful) {
-				EclipseLinkStaticWeavingBuilder.this.generationSuccessful = generationSuccessful;
+			public void launchCompleted(boolean genSuccessful) {
+				EclipseLinkStaticWeavingBuilder.this.generationSuccessful = genSuccessful;
 				EclipseLinkStaticWeavingBuilder.this.generationCompleted.setTrue();
 			}
 		};
@@ -110,8 +102,6 @@
 		return JavaCore.create(this.getProject());
 	}
 	
-	// ********** overrides **********
-
 	@Override
 	protected void startupOnInitialize() {
 		super.startupOnInitialize();
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GeneratorComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GeneratorComposite.java
index 7161077..9e43af6 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GeneratorComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/GeneratorComposite.java
@@ -76,7 +76,7 @@
 		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter_(
 				this.getSubjectHolder(),
 				JpaNamedContextModel.NAME_PROPERTY,
-				TransformerTools.nullCheck(m -> m.getName()),
+				m -> (m == null) ? null : m.getName(),
 				(m, value) -> {
 					if (m != null) {
 						m.setName(StringTools.isBlank(value) ? null : value);
@@ -121,7 +121,7 @@
 			return PropertyValueModelTools.modifiableSubjectModelAspectAdapter_(
 					this.getSubjectHolder(),
 					DatabaseGenerator.SPECIFIED_ALLOCATION_SIZE_PROPERTY,
-					TransformerTools.nullCheck(m -> m.getSpecifiedAllocationSize()),
+					m -> (m == null) ? null : m.getSpecifiedAllocationSize(),
 					(m, value) -> retrieveGenerator().setSpecifiedAllocationSize(value)
 				);
 		}
@@ -158,7 +158,7 @@
 			return PropertyValueModelTools.modifiableSubjectModelAspectAdapter_(
 					this.getSubjectHolder(),
 					DatabaseGenerator.SPECIFIED_INITIAL_VALUE_PROPERTY,
-					TransformerTools.nullCheck(m -> m.getSpecifiedInitialValue()),
+					m -> (m == null) ? null : m.getSpecifiedInitialValue(),
 					(m, value) -> retrieveGenerator().setSpecifiedInitialValue(value)
 				);
 		}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdMappingGenerationComposite.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdMappingGenerationComposite.java
index 5c0fdf9..bebc544 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdMappingGenerationComposite.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/IdMappingGenerationComposite.java
@@ -460,7 +460,7 @@
 		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter_(
 				this.buildGeneratedValueModel(),
 				GeneratedValue.SPECIFIED_GENERATOR_PROPERTY,
-				TransformerTools.nullCheck(m -> m.getSpecifiedGenerator()),
+				m -> (m == null) ? null : m.getSpecifiedGenerator(),
 				(m, value) -> {
 					if (m != null) {
 						m.setSpecifiedGenerator(StringTools.isBlank(value) ? null : value);
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnJoiningStrategyPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnJoiningStrategyPane.java
index d0a0643..0a53333 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnJoiningStrategyPane.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinColumnJoiningStrategyPane.java
@@ -122,12 +122,12 @@
 	}
 
 	public static ModifiablePropertyValueModel<Boolean> buildUsesJoinColumnJoiningStrategyModel(PropertyValueModel<? extends JoinColumnRelationship> subjectHolder) {
-		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter_(
+		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter(
 				subjectHolder,
-				Relationship.STRATEGY_PROPERTY,
-				m -> Boolean.valueOf((m != null) && m.strategyIsJoinColumn()),
+				JoinColumnRelationship.STRATEGY_IS_JOIN_COLUMN_PROPERTY,
+				m -> Boolean.valueOf(m.strategyIsJoinColumn()),
 				(m, value) -> {
-					if ((m != null) && (value != null) && value.booleanValue()) {
+					if ((value != null) && value.booleanValue()) {
 						((SpecifiedJoinColumnRelationship) m).setStrategyToJoinColumn();
 					}
 				}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinTableJoiningStrategyPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinTableJoiningStrategyPane.java
index 0733508..5637415 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinTableJoiningStrategyPane.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/JoinTableJoiningStrategyPane.java
@@ -84,12 +84,12 @@
 	}
 
 	public static ModifiablePropertyValueModel<Boolean> buildUsesJoinTableJoiningStrategyModel(PropertyValueModel<? extends JoinTableRelationship> subjectHolder) {
-		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter_(
+		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter(
 				subjectHolder,
-				Relationship.STRATEGY_PROPERTY,
-				m -> Boolean.valueOf((m != null) && m.strategyIsJoinTable()),
+				JoinTableRelationship.STRATEGY_IS_JOIN_TABLE_PROPERTY,
+				m -> Boolean.valueOf(m.strategyIsJoinTable()),
 				(m, value) -> {
-					if ((m != null) && (value != null) && value.booleanValue()) {
+					if ((value != null) && value.booleanValue()) {
 						((SpecifiedJoinTableRelationship) m).setStrategyToJoinTable();
 					}
 				}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToManyJoiningStrategyPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToManyJoiningStrategyPane.java
index df36b15..b237a2c 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToManyJoiningStrategyPane.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/ManyToManyJoiningStrategyPane.java
@@ -13,8 +13,9 @@
 import org.eclipse.jpt.common.utility.internal.model.value.PropertyValueModelTools;
 import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel;
 import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
+import org.eclipse.jpt.jpa.core.context.JoinTableRelationship;
 import org.eclipse.jpt.jpa.core.context.ManyToManyRelationship;
-import org.eclipse.jpt.jpa.core.context.Relationship;
+import org.eclipse.jpt.jpa.core.context.MappedByRelationship;
 import org.eclipse.jpt.jpa.ui.details.JptJpaUiDetailsMessages;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -91,12 +92,12 @@
 	}
 
 	protected ModifiablePropertyValueModel<Boolean> buildUsesMappedByStrategyModel() {
-		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter_(
+		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter(
 				this.getSubjectHolder(),
-				Relationship.STRATEGY_PROPERTY,
-				m -> Boolean.valueOf((m != null) && m.strategyIsMappedBy()),
+				MappedByRelationship.STRATEGY_IS_MAPPED_BY_PROPERTY,
+				m -> Boolean.valueOf(m.strategyIsMappedBy()),
 				(m, value) -> {
-					if ((m != null) && (value != null) && value.booleanValue()) {
+					if ((value != null) && value.booleanValue()) {
 						m.setStrategyToMappedBy();
 					}
 				}
@@ -104,12 +105,12 @@
 	}
 
 	protected ModifiablePropertyValueModel<Boolean> buildUsesJoinTableStrategyModel() {
-		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter_(
+		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter(
 				this.getSubjectHolder(),
-				Relationship.STRATEGY_PROPERTY,
-				m -> Boolean.valueOf((m != null) && m.strategyIsJoinTable()),
+				JoinTableRelationship.STRATEGY_IS_JOIN_TABLE_PROPERTY,
+				m -> Boolean.valueOf(m.strategyIsJoinTable()),
 				(m, value) -> {
-					if ((m != null) && (value != null) && value.booleanValue()) {
+					if ((value != null) && value.booleanValue()) {
 						m.setStrategyToJoinTable();
 					}
 				}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MappedByJoiningStrategyPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MappedByJoiningStrategyPane.java
index c2d969d..18f6219 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MappedByJoiningStrategyPane.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/MappedByJoiningStrategyPane.java
@@ -14,7 +14,6 @@
 import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel;
 import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
 import org.eclipse.jpt.jpa.core.context.MappedByRelationship;
-import org.eclipse.jpt.jpa.core.context.Relationship;
 import org.eclipse.jpt.jpa.core.context.SpecifiedMappedByRelationshipStrategy;
 import org.eclipse.jpt.jpa.core.context.SpecifiedOrVirtual;
 import org.eclipse.swt.widgets.Composite;
@@ -71,12 +70,12 @@
 	}
 
 	public static ModifiablePropertyValueModel<Boolean> buildUsesMappedByJoiningStrategyModel(PropertyValueModel<? extends MappedByRelationship> subjectHolder) {
-		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter_(
+		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter(
 				subjectHolder,
-				Relationship.STRATEGY_PROPERTY,
-				m -> Boolean.valueOf((m != null) && m.strategyIsMappedBy()),
+				MappedByRelationship.STRATEGY_IS_MAPPED_BY_PROPERTY,
+				m -> Boolean.valueOf(m.strategyIsMappedBy()),
 				(m, value) -> {
-					if ((m != null) && (value != null) && value.booleanValue()) {
+					if ((value != null) && value.booleanValue()) {
 						m.setStrategyToMappedBy();
 					}
 				}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnJoiningStrategyPane.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnJoiningStrategyPane.java
index d4978af..c54f62f 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnJoiningStrategyPane.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/details/PrimaryKeyJoinColumnJoiningStrategyPane.java
@@ -14,7 +14,6 @@
 import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel;
 import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
 import org.eclipse.jpt.jpa.core.context.PrimaryKeyJoinColumnRelationship;
-import org.eclipse.jpt.jpa.core.context.Relationship;
 import org.eclipse.jpt.jpa.core.context.SpecifiedPrimaryKeyJoinColumnRelationshipStrategy;
 import org.eclipse.swt.widgets.Composite;
 
@@ -54,12 +53,12 @@
 	}
 
 	public static ModifiablePropertyValueModel<Boolean> buildUsesPrimaryKeyJoinColumnJoiningStrategyModel(PropertyValueModel<? extends PrimaryKeyJoinColumnRelationship> subjectHolder) {
-		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter_(
+		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter(
 				subjectHolder,
-				Relationship.STRATEGY_PROPERTY,
-				m -> Boolean.valueOf((m != null) && m.strategyIsPrimaryKeyJoinColumn()),
+				PrimaryKeyJoinColumnRelationship.STRATEGY_IS_PRIMARY_KEY_JOIN_COLUMN_PROPERTY,
+				m -> Boolean.valueOf(m.strategyIsPrimaryKeyJoinColumn()),
 				(m, value) -> {
-					if ((m != null) && (value != null) && value.booleanValue()) {
+					if ((value != null) && value.booleanValue()) {
 						m.setStrategyToPrimaryKeyJoinColumn();
 					}
 				}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/JpaXmlEditor.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/JpaXmlEditor.java
index 4f4f5a5..863fec5 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/JpaXmlEditor.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/JpaXmlEditor.java
@@ -28,7 +28,6 @@
 import org.eclipse.jpt.common.utility.internal.model.value.CollectionValueModelTools;
 import org.eclipse.jpt.common.utility.internal.model.value.PropertyValueModelTools;
 import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
-import org.eclipse.jpt.common.utility.internal.transformer.TransformerAdapter;
 import org.eclipse.jpt.common.utility.iterable.ListIterable;
 import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent;
 import org.eclipse.jpt.common.utility.model.listener.PropertyChangeAdapter;
@@ -36,7 +35,6 @@
 import org.eclipse.jpt.common.utility.model.value.CollectionValueModel;
 import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel;
 import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
-import org.eclipse.jpt.common.utility.transformer.Transformer;
 import org.eclipse.jpt.jpa.core.JpaFile;
 import org.eclipse.jpt.jpa.core.JpaPlatform;
 import org.eclipse.jpt.jpa.core.JpaStructureNode;
@@ -299,18 +297,7 @@
 	}
 
 	private PropertyValueModel<PropertyValueModel<JpaFile>> buildJpaFileModelModel() {
-		return PropertyValueModelTools.transform(this.editorInputModel, JPA_FILE_MODEL_TRANSFORMER);
-	}
-
-	private static final Transformer<IFileEditorInput, PropertyValueModel<JpaFile>> JPA_FILE_MODEL_TRANSFORMER = new JpaFileModelTransformer();
-
-	/* CU private */ static class JpaFileModelTransformer
-		extends TransformerAdapter<IFileEditorInput, PropertyValueModel<JpaFile>>
-	{
-		@Override
-		public PropertyValueModel<JpaFile> transform(IFileEditorInput fileEditorInput) {
-			return fileEditorInput.getFile().getAdapter(JpaFileModel.class);
-		}
+		return PropertyValueModelTools.transform(this.editorInputModel, input -> input.getFile().getAdapter(JpaFileModel.class));
 	}
 
 	/* CU private */ class RootStructureNodeListener
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/DerivedIdentityPane2_0.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/DerivedIdentityPane2_0.java
index ca616d9..c728bf4 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/DerivedIdentityPane2_0.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/jpa2/details/DerivedIdentityPane2_0.java
@@ -101,31 +101,25 @@
 	}
 		
 	protected ModifiablePropertyValueModel<Boolean> buildUsesIdDerivedIdentityStrategyHolder() {
-		return new PropertyAspectAdapterXXXX<DerivedIdentity2_0, Boolean>(
-				getSubjectHolder(), DerivedIdentity2_0.PREDOMINANT_DERIVED_IDENTITY_STRATEGY_PROPERTY) {
-			
-			@Override
-			protected Boolean buildValue_() {
-				return this.subject.usesIdDerivedIdentityStrategy();
-			}
-			
-			@Override
-			protected void setValue_(Boolean value) {
-				// radio button - should only have true values here
-				if (value) {
-					this.subject.setIdDerivedIdentityStrategy();
+		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter(
+				this.getSubjectHolder(),
+				DerivedIdentity2_0.USES_ID_DERIVED_IDENTITY_STRATEGY_PROPERTY,
+				m -> Boolean.valueOf(m.usesIdDerivedIdentityStrategy()),
+				(m, value) -> {
+					if ((value != null) && value.booleanValue()) {
+						m.setIdDerivedIdentityStrategy();
+					}
 				}
-			}
-		};
+			);
 	}
 	
 	protected ModifiablePropertyValueModel<Boolean> buildUsesMapsIdDerivedIdentityStrategyHolder() {
-		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter_(
+		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter(
 				this.getSubjectHolder(),
-				DerivedIdentity2_0.PREDOMINANT_DERIVED_IDENTITY_STRATEGY_PROPERTY,
-				m -> Boolean.valueOf((m != null) && m.usesMapsIdDerivedIdentityStrategy()),
+				DerivedIdentity2_0.USES_MAPS_ID_DERIVED_IDENTITY_STRATEGY_PROPERTY,
+				m -> Boolean.valueOf(m.usesMapsIdDerivedIdentityStrategy()),
 				(m, value) -> {
-					if ((m != null) && (value != null) && value.booleanValue()) {
+					if ((value != null) && value.booleanValue()) {
 						m.setMapsIdDerivedIdentityStrategy();
 					}
 				}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/properties/JpaProjectPropertiesPage.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/properties/JpaProjectPropertiesPage.java
index c63b5e6..27ccb37 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/properties/JpaProjectPropertiesPage.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/properties/JpaProjectPropertiesPage.java
@@ -15,7 +15,6 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
-import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.jdt.core.ElementChangedEvent;
@@ -221,18 +220,7 @@
 	}
 
 	private PropertyValueModel<PropertyValueModel<JpaProject>> buildJpaProjectModelModel() {
-		return PropertyValueModelTools.transform(this.projectModel, JPA_PROJECT_MODEL_TRANSFORMER);
-	}
-
-	private static final Transformer<IProject, PropertyValueModel<JpaProject>> JPA_PROJECT_MODEL_TRANSFORMER = new JpaProjectModelTransformer();
-
-	/* CU private */ static class JpaProjectModelTransformer
-		extends TransformerAdapter<IProject, PropertyValueModel<JpaProject>>
-	{
-		@Override
-		public PropertyValueModel<JpaProject> transform(IProject project) {
-			return project.getAdapter(JpaProjectModel.class);
-		}
+		return PropertyValueModelTools.transform(this.projectModel, project -> project.getAdapter(JpaProjectModel.class));
 	}
 
 	// ***** JPA 2.0 project model
@@ -543,8 +531,8 @@
 		return PropertyValueModelTools.modifiableSubjectModelAspectAdapter(
 				this.jpaProject2_0Model,
 				JpaProject2_0.METAMODEL_SOURCE_FOLDER_NAME_PROPERTY,
-				JpaProject2_0.METAMODEL_SOURCE_FOLDER_NAME_TRANSFORMER,
-				JpaProject2_0.SET_METAMODEL_SOURCE_FOLDER_NAME_CLOSURE
+				m -> m.getMetamodelSourceFolderName(),
+				(m, value) -> m.setMetamodelSourceFolderName(value)
 			);
 	}
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaPageSelectionManager.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaPageSelectionManager.java
index d058b2b..109648e 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaPageSelectionManager.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaPageSelectionManager.java
@@ -15,12 +15,10 @@
 import org.eclipse.jpt.common.utility.internal.ObjectTools;
 import org.eclipse.jpt.common.utility.internal.model.value.PropertyValueModelTools;
 import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
-import org.eclipse.jpt.common.utility.internal.transformer.TransformerAdapter;
 import org.eclipse.jpt.common.utility.model.listener.PropertyChangeAdapter;
 import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
 import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel;
 import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
-import org.eclipse.jpt.common.utility.transformer.Transformer;
 import org.eclipse.jpt.jpa.core.JpaFile;
 import org.eclipse.jpt.jpa.core.JpaStructureNode;
 import org.eclipse.jpt.jpa.ui.internal.plugin.JptJpaUiPlugin;
@@ -139,18 +137,7 @@
 	}
 
 	private PropertyValueModel<PropertyValueModel<JpaFile>> buildEditorManagerJpaFileModel() {
-		return PropertyValueModelTools.transform(this.editorManagerModel, JPA_FILE_MODEL_TRANSFORMER);
-	}
-
-	private static final Transformer<JpaEditorManager, PropertyValueModel<JpaFile>> JPA_FILE_MODEL_TRANSFORMER = new JpaFileModelTransformer();
-
-	/* CU private */ static class JpaFileModelTransformer
-		extends TransformerAdapter<JpaEditorManager, PropertyValueModel<JpaFile>>
-	{
-		@Override
-		public PropertyValueModel<JpaFile> transform(JpaEditorManager editorManager) {
-			return editorManager.getJpaFileModel();
-		}
+		return PropertyValueModelTools.transform(this.editorManagerModel, mgr -> mgr.getJpaFileModel());
 	}
 
 
@@ -165,18 +152,7 @@
 	}
 
 	private PropertyValueModel<ModifiablePropertyValueModel<JpaStructureNode>> buildEditorManagerJpaSelectionModel() {
-		return PropertyValueModelTools.transform(this.editorManagerModel, JPA_SELECTION_MODEL_TRANSFORMER);
-	}
-
-	private static final Transformer<JpaEditorManager, ModifiablePropertyValueModel<JpaStructureNode>> JPA_SELECTION_MODEL_TRANSFORMER = new JpaSelectionModelTransformer();
-
-	/* CU private */ static class JpaSelectionModelTransformer
-		extends TransformerAdapter<JpaEditorManager, ModifiablePropertyValueModel<JpaStructureNode>>
-	{
-		@Override
-		public ModifiablePropertyValueModel<JpaStructureNode> transform(JpaEditorManager editorManager) {
-			return editorManager.getJpaSelectionModel();
-		}
+		return PropertyValueModelTools.transform(this.editorManagerModel, mgr -> mgr.getJpaSelectionModel());
 	}
 
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaTextEditorManager.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaTextEditorManager.java
index c21b8a6..c3a0372 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaTextEditorManager.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/selection/JpaTextEditorManager.java
@@ -23,13 +23,11 @@
 import org.eclipse.jpt.common.utility.internal.ObjectTools;
 import org.eclipse.jpt.common.utility.internal.model.value.PropertyValueModelTools;
 import org.eclipse.jpt.common.utility.internal.model.value.SimplePropertyValueModel;
-import org.eclipse.jpt.common.utility.internal.transformer.TransformerAdapter;
 import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent;
 import org.eclipse.jpt.common.utility.model.listener.PropertyChangeAdapter;
 import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
 import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel;
 import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
-import org.eclipse.jpt.common.utility.transformer.Transformer;
 import org.eclipse.jpt.jpa.core.JpaFile;
 import org.eclipse.jpt.jpa.core.JpaStructureNode;
 import org.eclipse.jpt.jpa.ui.JpaFileModel;
@@ -140,18 +138,7 @@
 	}
 
 	private PropertyValueModel<PropertyValueModel<JpaFile>> buildJpaFileModelModel() {
-		return PropertyValueModelTools.transform(this.fileModel, JPA_FILE_MODEL_TRANSFORMER);
-	}
-
-	private static final Transformer<IFile, PropertyValueModel<JpaFile>> JPA_FILE_MODEL_TRANSFORMER = new JpaFileModelTransformer();
-
-	/* CU private */ static class JpaFileModelTransformer
-		extends TransformerAdapter<IFile, PropertyValueModel<JpaFile>>
-	{
-		@Override
-		public PropertyValueModel<JpaFile> transform(IFile file) {
-			return file.getAdapter(JpaFileModel.class);
-		}
+		return PropertyValueModelTools.transform(this.fileModel, file -> file.getAdapter(JpaFileModel.class));
 	}
 
 	/* CU private */ class JpaFileListener