diff --git a/bundles/org.eclipse.equinox.p2.director/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.director/META-INF/MANIFEST.MF
index 578f90d..662f906 100644
--- a/bundles/org.eclipse.equinox.p2.director/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.director/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.equinox.p2.director;singleton:=true
-Bundle-Version: 2.3.0.qualifier
+Bundle-Version: 2.3.100.qualifier
 Bundle-ClassPath: .
 Bundle-Activator: org.eclipse.equinox.internal.p2.director.DirectorActivator
 Bundle-Vendor: %providerName
diff --git a/bundles/org.eclipse.equinox.p2.director/pom.xml b/bundles/org.eclipse.equinox.p2.director/pom.xml
index 07d33f1..0a6e43a 100644
--- a/bundles/org.eclipse.equinox.p2.director/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.director/pom.xml
@@ -9,6 +9,6 @@
   </parent>
   <groupId>org.eclipse.equinox</groupId>
   <artifactId>org.eclipse.equinox.p2.director</artifactId>
-  <version>2.3.0-SNAPSHOT</version>
+  <version>2.3.100-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/ProfileChangeRequest.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/ProfileChangeRequest.java
index e20b755..00410f5 100644
--- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/ProfileChangeRequest.java
+++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/ProfileChangeRequest.java
@@ -80,7 +80,7 @@
 	public void add(IInstallableUnit toInstall) {
 		if (iusToAdd == null)
 			iusToAdd = new ArrayList<IInstallableUnit>();
-		iusToAdd.add(toInstall);
+		iusToAdd.add(toInstall.unresolved());
 	}
 
 	/* (non-Javadoc)
@@ -102,7 +102,7 @@
 	public void remove(IInstallableUnit toUninstall) {
 		if (iusToRemove == null)
 			iusToRemove = new ArrayList<IInstallableUnit>();
-		iusToRemove.add(toUninstall);
+		iusToRemove.add(toUninstall.unresolved());
 	}
 
 	public void removeInstallableUnits(IInstallableUnit[] toUninstall) {
@@ -142,6 +142,7 @@
 	public void setInstallableUnitProfileProperty(IInstallableUnit iu, String key, String value) {
 		if (iuPropertiesToAdd == null)
 			iuPropertiesToAdd = new HashMap<IInstallableUnit, Map<String, String>>();
+		iu = iu.unresolved();
 		Map<String, String> properties = iuPropertiesToAdd.get(iu);
 		if (properties == null) {
 			properties = new HashMap<String, String>();
@@ -156,6 +157,7 @@
 	public void removeInstallableUnitProfileProperty(IInstallableUnit iu, String key) {
 		if (iuPropertiesToRemove == null)
 			iuPropertiesToRemove = new HashMap<IInstallableUnit, List<String>>();
+		iu = iu.unresolved();
 		List<String> keys = iuPropertiesToRemove.get(iu);
 		if (keys == null) {
 			keys = new ArrayList<String>();
@@ -213,14 +215,14 @@
 	 * @see org.eclipse.equinox.internal.provisional.p2.director.IPCR#setInstallableUnitInclusionRules(org.eclipse.equinox.p2.metadata.IInstallableUnit, java.lang.String)
 	 */
 	public void setInstallableUnitInclusionRules(IInstallableUnit iu, String value) {
-		setInstallableUnitProfileProperty(iu, SimplePlanner.INCLUSION_RULES, value);
+		setInstallableUnitProfileProperty(iu.unresolved(), SimplePlanner.INCLUSION_RULES, value);
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.equinox.internal.provisional.p2.director.IPCR#removeInstallableUnitInclusionRules(org.eclipse.equinox.p2.metadata.IInstallableUnit)
 	 */
 	public void removeInstallableUnitInclusionRules(IInstallableUnit iu) {
-		removeInstallableUnitProfileProperty(iu, SimplePlanner.INCLUSION_RULES);
+		removeInstallableUnitProfileProperty(iu.unresolved(), SimplePlanner.INCLUSION_RULES);
 	}
 
 	@SuppressWarnings("unchecked")
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/AllTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/AllTests.java
index 4188b94..e08f33c 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/AllTests.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/AllTests.java
@@ -136,6 +136,7 @@
 		suite.addTestSuite(PatchTestUsingNegativeRequirement.class);
 		suite.addTestSuite(PermissiveSlicerTest.class);
 		suite.addTestSuite(PP2ShouldFailToInstall.class);
+		suite.addTestSuite(ResolvedIUInPCR.class);
 		//		suite.addTestSuite(ProvisioningPlanQueryTest.class); disabled, see bug 313812 
 		suite.addTestSuite(SDKPatchingTest1.class);
 		suite.addTestSuite(SDKPatchingTest2.class);
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/ResolvedIUInPCR.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/ResolvedIUInPCR.java
new file mode 100644
index 0000000..9c3a9d1
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/ResolvedIUInPCR.java
@@ -0,0 +1,133 @@
+package org.eclipse.equinox.p2.tests.planner;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.equinox.internal.p2.director.ProfileChangeRequest;
+import org.eclipse.equinox.internal.p2.metadata.ResolvedInstallableUnit;
+import org.eclipse.equinox.p2.engine.IProfile;
+import org.eclipse.equinox.p2.metadata.IInstallableUnit;
+import org.eclipse.equinox.p2.tests.*;
+
+public class ResolvedIUInPCR extends AbstractProvisioningTest {
+
+	@IUDescription(content = "package: iu1 \n" + "singleton: true\n" + "version: 1 \n")
+	public IInstallableUnit iu1;
+
+	@IUDescription(content = "package: iu2 \n" + "singleton: true\n" + "version: 1 \n")
+	public IInstallableUnit iu2;
+
+	private IProfile profile;
+
+	protected void setUp() throws Exception {
+		IULoader.loadIUs(this);
+		profile = createProfile("ResolvedIUInPCR." + getName());
+	}
+
+	public void testNoResolvedIUInAddition() {
+		ResolvedInstallableUnit riu1 = new ResolvedInstallableUnit(iu1);
+		ProfileChangeRequest pcr = new ProfileChangeRequest(profile);
+		pcr.add(riu1);
+
+		assertFalse(identityContains(pcr.getAdditions(), riu1));
+		assertTrue(identityContains(pcr.getAdditions(), iu1));
+	}
+
+	public void testNoResolvedIUInBulkAddition() {
+		Collection<IInstallableUnit> riusToAdd = new ArrayList<IInstallableUnit>();
+		ResolvedInstallableUnit riu1 = new ResolvedInstallableUnit(iu1);
+		riusToAdd.add(riu1);
+
+		ProfileChangeRequest pcr = new ProfileChangeRequest(profile);
+		pcr.addAll(riusToAdd);
+
+		assertFalse(identityContains(pcr.getAdditions(), riu1));
+		assertTrue(identityContains(pcr.getAdditions(), iu1));
+	}
+
+	public void testNoResolvedIUInBulkAddition2() {
+		ResolvedInstallableUnit riu1 = new ResolvedInstallableUnit(iu1);
+		ResolvedInstallableUnit riu2 = new ResolvedInstallableUnit(iu2);
+
+		ProfileChangeRequest pcr = new ProfileChangeRequest(profile);
+		pcr.addInstallableUnits(riu1, riu2);
+
+		assertFalse(identityContains(pcr.getAdditions(), riu1));
+		assertFalse(identityContains(pcr.getAdditions(), riu2));
+
+		assertTrue(identityContains(pcr.getAdditions(), iu1));
+		assertTrue(identityContains(pcr.getAdditions(), iu2));
+	}
+
+	public void testNoResolvedIUInRemoval() {
+		ResolvedInstallableUnit riu1 = new ResolvedInstallableUnit(iu1);
+		ProfileChangeRequest pcr = new ProfileChangeRequest(profile);
+		pcr.remove(riu1);
+
+		assertFalse(identityContains(pcr.getRemovals(), riu1));
+		assertTrue(identityContains(pcr.getRemovals(), iu1));
+	}
+
+	public void testNoResolvedIUInBulkRemoval() {
+		Collection<IInstallableUnit> riusToAdd = new ArrayList<IInstallableUnit>();
+		ResolvedInstallableUnit riu1 = new ResolvedInstallableUnit(iu1);
+		riusToAdd.add(riu1);
+
+		ProfileChangeRequest pcr = new ProfileChangeRequest(profile);
+		pcr.removeAll(riusToAdd);
+
+		assertFalse(identityContains(pcr.getRemovals(), riu1));
+		assertTrue(identityContains(pcr.getRemovals(), iu1));
+	}
+
+	public void testNoResolvedIUInBulkRemoval2() {
+		ResolvedInstallableUnit riu1 = new ResolvedInstallableUnit(iu1);
+		ResolvedInstallableUnit riu2 = new ResolvedInstallableUnit(iu2);
+
+		ProfileChangeRequest pcr = new ProfileChangeRequest(profile);
+		pcr.removeInstallableUnits(new IInstallableUnit[] {riu1, riu2});
+
+		assertFalse(identityContains(pcr.getRemovals(), riu1));
+		assertFalse(identityContains(pcr.getRemovals(), riu2));
+
+		assertTrue(identityContains(pcr.getRemovals(), iu1));
+		assertTrue(identityContains(pcr.getRemovals(), iu2));
+	}
+
+	public void testNoResolvedIUInstallableUnitInclusionRules() {
+		ResolvedInstallableUnit riu1 = new ResolvedInstallableUnit(iu1);
+		ResolvedInstallableUnit riu2 = new ResolvedInstallableUnit(iu2);
+
+		ProfileChangeRequest pcr = new ProfileChangeRequest(profile);
+		pcr.setInstallableUnitInclusionRules(riu1, "inclusion");
+		pcr.setInstallableUnitProfileProperty(riu2, "a", "b");
+
+		assertFalse(identityContains(pcr.getInstallableUnitProfilePropertiesToAdd().keySet(), riu1));
+		assertFalse(identityContains(pcr.getInstallableUnitProfilePropertiesToAdd().keySet(), riu2));
+
+		assertTrue(identityContains(pcr.getInstallableUnitProfilePropertiesToAdd().keySet(), iu1));
+		assertTrue(identityContains(pcr.getInstallableUnitProfilePropertiesToAdd().keySet(), iu2));
+	}
+
+	public void testNoResolvedIUInstallableUnitInclusionRules2() {
+		ResolvedInstallableUnit riu1 = new ResolvedInstallableUnit(iu1);
+		ResolvedInstallableUnit riu2 = new ResolvedInstallableUnit(iu2);
+
+		ProfileChangeRequest pcr = new ProfileChangeRequest(profile);
+		pcr.removeInstallableUnitInclusionRules(riu1);
+		pcr.removeInstallableUnitProfileProperty(riu2, "a");
+
+		assertFalse(identityContains(pcr.getInstallableUnitProfilePropertiesToRemove().keySet(), riu1));
+		assertFalse(identityContains(pcr.getInstallableUnitProfilePropertiesToRemove().keySet(), riu2));
+
+		assertTrue(identityContains(pcr.getInstallableUnitProfilePropertiesToRemove().keySet(), iu1));
+		assertTrue(identityContains(pcr.getInstallableUnitProfilePropertiesToRemove().keySet(), iu2));
+	}
+
+	private boolean identityContains(Collection<IInstallableUnit> ius, IInstallableUnit match) {
+		for (IInstallableUnit iu : ius) {
+			if (iu == match)
+				return true;
+		}
+		return false;
+	}
+}
