[unrelated] root of where invocation is not realized.
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/AbstractTransformationAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/AbstractTransformationAnalysis.java
index 78f9d36..a554943 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/AbstractTransformationAnalysis.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/AbstractTransformationAnalysis.java
@@ -147,6 +147,9 @@
 	 */
 	public void analyzeSourceModel() {
 		for (@NonNull RuleAnalysis ruleAnalysis : rule2ruleAnalysis.values()) {
+			ruleAnalysis.analyzeInvocations();
+		}
+		for (@NonNull RuleAnalysis ruleAnalysis : rule2ruleAnalysis.values()) {
 			ruleAnalysis.analyzeSourceModel();
 		}
 	}
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/RuleAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/RuleAnalysis.java
index 7a135e6..4d94a71 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/RuleAnalysis.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/RuleAnalysis.java
@@ -78,6 +78,8 @@
 		//		assert !rule.isIsAbstract() == scheduleManager.getScheduleModel().getOwnedMappingRegions().contains(ruleRegion);
 	}
 
+	public void analyzeInvocations() {}
+
 	public abstract void analyzeMappingRegion();
 
 	public void analyzeSourceModel() {}
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhereBeforeWhenInvocationAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhereBeforeWhenInvocationAnalysis.java
index 95eaff4..645ba0e 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhereBeforeWhenInvocationAnalysis.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhereBeforeWhenInvocationAnalysis.java
@@ -35,7 +35,7 @@
 
 	@Override
 	protected @NonNull Node createInvocationNode(@NonNull Node invokingTraceNode) {
-		QVTrelationNameGenerator nameGenerator = (QVTrelationNameGenerator)scheduleManager.getNameGenerator();	// FIXME unique names
+		QVTrelationNameGenerator nameGenerator = scheduleManager.getNameGenerator();	// FIXME unique names
 		Relation invokedRelation = invokedRelationAnalysis.getRule();
 		String name = nameGenerator.createWhereInvocationPropertyName(invokedRelation);
 		ClassDatum classDatum = getInvokedClassDatum();
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhereOnlyInvocationAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhereOnlyInvocationAnalysis.java
index 1a83209..1278409 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhereOnlyInvocationAnalysis.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhereOnlyInvocationAnalysis.java
@@ -35,7 +35,7 @@
 
 	@Override
 	protected @NonNull Node createInvocationNode(@NonNull Node invokingTraceNode) {
-		QVTrelationNameGenerator nameGenerator = (QVTrelationNameGenerator)scheduleManager.getNameGenerator();	// FIXME unique names
+		QVTrelationNameGenerator nameGenerator = scheduleManager.getNameGenerator();	// FIXME unique names
 		Relation invokedRelation = invokedRelationAnalysis.getRule();
 		String name = nameGenerator.createWhereInvocationPropertyName(invokedRelation);
 		ClassDatum classDatum = getInvokedClassDatum();
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/RelationAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/RelationAnalysis.java
index f133a2a..d66828d 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/RelationAnalysis.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/RelationAnalysis.java
@@ -278,7 +278,8 @@
 		}
 	}
 
-	protected void analyzeInvocations() {
+	@Override
+	public void analyzeInvocations() {
 		for (@NonNull EObject eObject : new TreeIterable(rule, false)) {
 			if (eObject instanceof RelationCallExp) {
 				RelationCallExp relationInvocation = (RelationCallExp) eObject;
@@ -419,7 +420,10 @@
 	protected void analyzeRealizedOutputVariables(@NonNull RelationDomain relationDomain, @NonNull Set<@NonNull VariableDeclaration> realizedOutputVariables) {
 		for (@NonNull DomainPattern domainPattern : QVTrelationUtil.getOwnedPatterns(relationDomain)) {
 			TemplateExp templateExpression = QVTrelationUtil.getOwnedTemplateExpression(domainPattern);
-			for (@NonNull EObject eObject : new TreeIterable(templateExpression, true)) {
+			boolean isTopLevel = ((Relation)rule).isIsTopLevel();
+			boolean isWhenInvoked = (incomingWhenInvocationAnalyses != null) && !incomingWhenInvocationAnalyses.isEmpty();
+			boolean rootIsRealized = isTopLevel || isWhenInvoked;
+			for (@NonNull EObject eObject : new TreeIterable(templateExpression, rootIsRealized)) {
 				if (eObject instanceof TemplateExp) {
 					TemplateExp templateExp = (TemplateExp)eObject;
 					TemplateVariable templateVariable = (TemplateVariable) QVTrelationUtil.getBindsTo(templateExp);
@@ -434,7 +438,6 @@
 		Relation relation = getRule();
 		baseRelationAnalysis = getScheduleManager().getRuleAnalysis(QVTrelationUtil.getBaseRelation(relation));
 		variable2templateExp = analyzeVariable2TemplateExp();
-		analyzeInvocations();
 		Set<@NonNull VariableDeclaration> topWhenedOutputVariables2 = topWhenedOutputVariables = new HashSet<>();
 		Set<@NonNull VariableDeclaration> nonTopWhenedOutputVariables2 = nonTopWhenedOutputVariables = new HashSet<>();
 		analyzeWhenedOutputVariables(topWhenedOutputVariables2, nonTopWhenedOutputVariables2);