diff --git a/tools.descartes.prisma.agent.wildfly/src/main/java/tools/descartes/prisma/agent/wildfly/service/ModelExtractionService.java b/tools.descartes.prisma.agent.wildfly/src/main/java/tools/descartes/prisma/agent/wildfly/service/ModelExtractionService.java
index 59c0fcd7e75478b90015cbfb1b539bc3dd705cc0..784c82c7296391897d3ee5738ec9ae2bfa8814a5 100644
--- a/tools.descartes.prisma.agent.wildfly/src/main/java/tools/descartes/prisma/agent/wildfly/service/ModelExtractionService.java
+++ b/tools.descartes.prisma.agent.wildfly/src/main/java/tools/descartes/prisma/agent/wildfly/service/ModelExtractionService.java
@@ -419,11 +419,26 @@ public class ModelExtractionService extends AgentController implements Service<M
 		}
 		RepositoryComponent callerComponent = implementationComponent;
 
-		// 4. Now add the called component (if applicable)
+		// 4. Check if this is a call that goes to a destination outside of the
+		// system.
+		InterfaceRequiringRole systemRequiringRole = null;
+		if (callerRequiringRole != null) {
+			String systemRequiringRoleName = getSystemInterfaceRequiringRoleName(outgoingIrec);
+			systemRequiringRole = RepositoryFactory.eINSTANCE.createInterfaceRequiringRole();
+			systemRequiringRole.setName(toName(systemRequiringRoleName));
+			systemRequiringRole.setInterface(outgoingInterface);
+			systemRequiringRole = ModelSkeletonUtil.find(
+					((ApplicationScope) getContainerScope()).getApplication().getInterfaceRequiringRoles(),
+					systemRequiringRole);
+		}
+
+		// 5. Now add the called component (if applicable)
+		// IMPORTANT: Only do this if the call is within the same application
+		// (i.e., systemRequiringRole == null)
 		InterfaceProvidingRole calledProvidingRole = null;
 		RepositoryComponent calledComponent = null;
 		boolean differentModule = false;
-		if (callerRequiringRole != null) {
+		if (callerRequiringRole != null && systemRequiringRole == null) {
 			differentModule = isDifferentModule(incomingCrec, outgoingCrec);
 			calledComponent = createCalledComponent(outgoingCrec, differentModule);
 			String calledProvingRoleName;
@@ -453,7 +468,7 @@ public class ModelExtractionService extends AgentController implements Service<M
 			}
 		}
 
-		// 5. Now wrap the implementation in a composite component (if
+		// 6. Now wrap the implementation in a composite component (if
 		// necessary)
 		CompositeComponent compositeComponent = createCompositeComponent(incomingCrec, callerComponent);
 		AssemblyContext innerAssemblyContext = null;
@@ -512,28 +527,30 @@ public class ModelExtractionService extends AgentController implements Service<M
 					requiringConnector.setAssemblyContext(innerAssemblyContext);
 					ModelSkeletonUtil.insert(compositeComponent.getRequiringDelegationConnectors(), requiringConnector);
 				} else {
-					// Local call: Also add an assembly context for the called
-					// component within the composite component
-					// and connect it with an assembly connector.
-					AssemblyContext calledAssembly = addAssemblyContext(compositeComponent, outgoingCrec,
-							calledComponent);
-
-					AssemblyConnector connector = RepositoryFactory.eINSTANCE.createAssemblyConnector();
-					connector.setName(toName(innerAssemblyContext.getName() + " -> " + calledAssembly.getName()));
-					connector.setInterfaceProvidingRole(calledProvidingRole);
-					connector.setInterfaceRequiringRole(callerRequiringRole);
-					connector.setProvidingAssemblyContext(calledAssembly);
-					connector.setRequiringAssemblyContext(innerAssemblyContext);
-					ModelSkeletonUtil.insert(compositeComponent.getAssemblyConnectors(), connector);
+					if (calledComponent != null) {
+						// Local call: Also add an assembly context for the
+						// called component within the composite component
+						// and connect it with an assembly connector.
+						AssemblyContext calledAssembly = addAssemblyContext(compositeComponent, outgoingCrec,
+								calledComponent);
+
+						AssemblyConnector connector = RepositoryFactory.eINSTANCE.createAssemblyConnector();
+						connector.setName(toName(innerAssemblyContext.getName() + " -> " + calledAssembly.getName()));
+						connector.setInterfaceProvidingRole(calledProvidingRole);
+						connector.setInterfaceRequiringRole(callerRequiringRole);
+						connector.setProvidingAssemblyContext(calledAssembly);
+						connector.setRequiringAssemblyContext(innerAssemblyContext);
+						ModelSkeletonUtil.insert(compositeComponent.getAssemblyConnectors(), connector);
+					}
 				}
 			}
 			callerRequiringRole = remoteRequiringRole;
 			callerComponent = compositeComponent;
 		}
 
-		// 6. Now create the assembly contexts
+		// 7. Now create the assembly contexts
 		AssemblyContext callerContext = addAssemblyContext(skeleton.getSystem(), incomingCrec, callerComponent);
-		if (callerRequiringRole != null) {
+		if (calledComponent != null) {
 			AssemblyContext calledContext = addAssemblyContext(skeleton.getSystem(), outgoingCrec, calledComponent);
 
 			AssemblyConnector connector = RepositoryFactory.eINSTANCE.createAssemblyConnector();
@@ -543,9 +560,21 @@ public class ModelExtractionService extends AgentController implements Service<M
 			connector.setProvidingAssemblyContext(calledContext);
 			connector.setRequiringAssemblyContext(callerContext);
 			ModelSkeletonUtil.insert(skeleton.getSystem().getAssemblyConnectors(), connector);
+		} else if (systemRequiringRole != null) {
+			// This is a call to a component in a different application
+			systemRequiringRole = ModelSkeletonUtil.adopt(this, systemRequiringRole);
+			skeleton.getSystem().getInterfaceRequiringRoles().add(systemRequiringRole);
+
+			RequiringDelegationConnector systemRequiringConnector = RepositoryFactory.eINSTANCE
+					.createRequiringDelegationConnector();
+			systemRequiringConnector.setName(toName(callerContext.getName()));
+			systemRequiringConnector.setInnerInterfaceRequiringRole(callerRequiringRole);
+			systemRequiringConnector.setOuterInterfaceRequiringRole(systemRequiringRole);
+			systemRequiringConnector.setAssemblyContext(callerContext);
+			ModelSkeletonUtil.insert(skeleton.getSystem().getRequiringDelegationConnectors(), systemRequiringConnector);
 		}
 
-		// 7. Expose the provided remote interfaces as system interfaces (if
+		// 8. Expose the provided remote interfaces as system interfaces (if
 		// this port is marked as system interface)
 		String systemProvidingRoleName = getInterfaceProvidingRoleName(incomingIrec, callerContext.getName());
 		// Do not create a new providing/requiring role for the system, only use
@@ -572,31 +601,7 @@ public class ModelExtractionService extends AgentController implements Service<M
 			ModelSkeletonUtil.insert(skeleton.getSystem().getProvidingDelegationConnectors(), systemProvidingConnector);
 		}
 
-		if (callerRequiringRole != null) {
-			String systemRequiringRoleName = getInterfaceRequiringRoleName(outgoingIrec, callerContext.getName());
-			InterfaceRequiringRole systemRequiringRole = RepositoryFactory.eINSTANCE.createInterfaceRequiringRole();
-			systemRequiringRole.setName(toName(systemRequiringRoleName));
-			systemRequiringRole.setInterface(outgoingInterface);
-			systemRequiringRole = ModelSkeletonUtil.find(
-					((ApplicationScope) getContainerScope()).getApplication().getInterfaceRequiringRoles(),
-					systemRequiringRole);
-			if (systemRequiringRole != null) {
-				systemRequiringRole = ModelSkeletonUtil.adopt(this, systemRequiringRole);
-				skeleton.getSystem().getInterfaceRequiringRoles()
-						.add(ModelSkeletonUtil.adopt(this, systemRequiringRole));
-
-				RequiringDelegationConnector systemRequiringConnector = RepositoryFactory.eINSTANCE
-						.createRequiringDelegationConnector();
-				systemRequiringConnector.setName(toName(callerContext.getName()));
-				systemRequiringConnector.setInnerInterfaceRequiringRole(callerRequiringRole);
-				systemRequiringConnector.setOuterInterfaceRequiringRole(systemRequiringRole);
-				systemRequiringConnector.setAssemblyContext(callerContext);
-				ModelSkeletonUtil.insert(skeleton.getSystem().getRequiringDelegationConnectors(),
-						systemRequiringConnector);
-			}
-		}
-
-		// 8. Add sensor descriptions for application metrics
+		// 9. Add sensor descriptions for application metrics
 		List<AssemblyContext> instancePath = new LinkedList<>();
 		instancePath.add(callerContext);
 		if (innerAssemblyContext != null) {
@@ -604,7 +609,7 @@ public class ModelExtractionService extends AgentController implements Service<M
 		}
 		addSensors(incomingIrec, outgoingIrec, instancePath, innerCallerProvidingRole, incomingSignature, externalCall);
 
-		// 9. Remember to deploy this context (only for the caller component)
+		// 10. Remember to deploy this context (only for the caller component)
 		undeployedAssemblyContexts.add(callerContext);
 	}
 
@@ -938,6 +943,20 @@ public class ModelExtractionService extends AgentController implements Service<M
 		return res.toString();
 	}
 
+	private String getSystemInterfaceRequiringRoleName(InvocationRecord record) {
+		StringBuilder res = new StringBuilder();
+		res.append(record.getOperation().getProtocol());
+		res.append("://");
+		res.append(record.getOperation().getComponent().getServerNode());
+		res.append("/");
+		if (!record.getOperation().getComponent().getApplication().isEmpty()) {
+			res.append(record.getOperation().getComponent().getApplication());
+			res.append("/");
+		}
+		res.append(record.getOperation().getComponent().getComponentName());
+		return res.toString();
+	}
+
 	private String getInterfaceRequiringRoleName(InvocationRecord record, String assembly) {
 		StringBuilder res = new StringBuilder();
 		res.append(record.getOperation().getProtocol());