Separating out phase/operand completion  for touchpoints to ensure phases cannot override touchpoint completion. No change to flow.
diff --git a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/provisional/p2/engine/Phase.java b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/provisional/p2/engine/Phase.java
index e88378b..ba821b0 100644
--- a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/provisional/p2/engine/Phase.java
+++ b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/provisional/p2/engine/Phase.java
@@ -121,7 +121,7 @@
 
 				}
 			}
-
+			mergeStatus(status, touchpointCompleteOperand(profile, operand, operandParameters, subMonitor));
 			mergeStatus(status, completeOperand(profile, operand, operandParameters, subMonitor));
 			if (status.matches(IStatus.ERROR | IStatus.CANCEL))
 				return;
@@ -161,6 +161,7 @@
 	}
 
 	void postPerform(MultiStatus status, IProfile profile, ProvisioningContext context, IProgressMonitor monitor) {
+		mergeStatus(status, touchpointCompletePhase(monitor, profile, phaseParameters));
 		mergeStatus(status, completePhase(monitor, profile, phaseParameters));
 	}
 
@@ -183,6 +184,7 @@
 			mergeStatus(status, action.undo(parameters));
 			// TODO: session.removeAction(...)
 		}
+		mergeStatus(status, touchpointCompleteOperand(profile, operand, operandParameters, new NullProgressMonitor()));
 		mergeStatus(status, completeOperand(profile, operand, operandParameters, new NullProgressMonitor()));
 	}
 
@@ -195,6 +197,10 @@
 	}
 
 	protected IStatus completePhase(IProgressMonitor monitor, IProfile profile, Map parameters) {
+		return Status.OK_STATUS;
+	}
+
+	IStatus touchpointCompletePhase(IProgressMonitor monitor, IProfile profile, Map parameters) {
 		if (touchpointToTouchpointPhaseParameters == null)
 			return Status.OK_STATUS;
 
@@ -210,6 +216,10 @@
 	}
 
 	protected IStatus completeOperand(IProfile profile, Operand operand, Map parameters, IProgressMonitor monitor) {
+		return Status.OK_STATUS;
+	}
+
+	IStatus touchpointCompleteOperand(IProfile profile, Operand operand, Map parameters, IProgressMonitor monitor) {
 		if (touchpointToTouchpointOperandParameters == null)
 			return Status.OK_STATUS;