API changes to support DSL internal links

Change-Id: I8e017a34050987725e98ab0d16ce6bc40bfcf4d8
diff --git a/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/AbstractMetaModelAdapter.java b/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/AbstractMetaModelAdapter.java
new file mode 100644
index 0000000..ef371c4
--- /dev/null
+++ b/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/AbstractMetaModelAdapter.java
@@ -0,0 +1,144 @@
+package org.eclipse.capra.core.adapters;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.capra.core.handlers.IArtifactHandler;
+import org.eclipse.capra.core.helpers.ArtifactHelper;
+import org.eclipse.capra.core.helpers.ExtensionPointHelper;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+
+/**
+ * Implements standard functionality for the methods defined in the
+ * {@link TraceMetaModelAdapter}.
+ */
+public abstract class AbstractMetaModelAdapter implements TraceMetaModelAdapter {
+
+	private List<Connection> getInternalElementsTransitive(EObject element, EObject traceModel,
+			List<Object> accumulator, List<String> selectedRelationshipTypes, int currentDepth, int maximumDepth,
+			List<Connection> existingTraces) {
+		List<Connection> directElements = getInternalElements(element, traceModel, selectedRelationshipTypes, true,
+				maximumDepth, existingTraces);
+		List<Connection> allElements = new ArrayList<>();
+		int currDepth = currentDepth + 1;
+		for (Connection connection : directElements) {
+			if (!accumulator.contains(connection.getTlink())) {
+				allElements.add(connection);
+				accumulator.add(connection.getTlink());
+				for (EObject e : connection.getTargets()) {
+					if (maximumDepth == 0 || currDepth < (maximumDepth + 2)) {
+						allElements.addAll(getInternalElementsTransitive(e, traceModel, accumulator,
+								selectedRelationshipTypes, currDepth, maximumDepth, existingTraces));
+					}
+				}
+			}
+		}
+
+		return allElements;
+	}
+
+	/**
+	 * Used to get internal links connected to a selected element.
+	 * @param element 
+	 * 			the selected element
+	 * @param traceModel
+	 * 			the current trace model
+	 * @param selectedRelationshipTypes
+	 * 			the selected relationship types from the filter, if the user has selected any
+	 * @param maximumDepth
+	 * 			The maximum depth the transitivity should go. 0 means show all the links
+	 * @param existingTraces
+	 * 			The trace links that have been created manually by the user, these are obtained from the trace model
+	 */
+	public List<Connection> getInternalElementsTransitive(EObject element, EObject traceModel,
+			List<String> selectedRelationshipTypes, int maximumDepth, List<Connection> existingTraces) {
+		List<Object> accumulator = new ArrayList<>();
+		return getInternalElementsTransitive(element, traceModel, accumulator, selectedRelationshipTypes, 0,
+				maximumDepth, existingTraces);
+	}
+
+	@Override
+	public List<Connection> getInternalElements(EObject element, EObject traceModel,
+			List<String> selectedRelationshipTypes, boolean traceLinksTransitive, int transitivityDepth,
+			List<Connection> existingTraces) {
+		List<Connection> allElements = new ArrayList<>();
+		ArrayList<Integer> duplicationCheck = new ArrayList<>();
+		List<Connection> directElements;
+		if (traceLinksTransitive) {
+			directElements = getTransitivelyConnectedElements(element, traceModel, selectedRelationshipTypes,
+					transitivityDepth);
+		} else {
+			directElements = getConnectedElements(element, traceModel, selectedRelationshipTypes);
+		}
+		List<Integer> hashCodes = new ArrayList<>();
+
+		for (Connection conn : existingTraces) {
+			int connectionHash = conn.getOrigin().hashCode() + conn.getTlink().hashCode();
+			for (EObject targ : conn.getTargets()) {
+				connectionHash += targ.hashCode();
+			}
+			hashCodes.add(connectionHash);
+		}
+
+		ResourceSet resourceSet = new ResourceSetImpl();
+		TracePersistenceAdapter persistenceAdapter = ExtensionPointHelper.getTracePersistenceAdapter().get();
+		EObject artifactModel = persistenceAdapter.getArtifactWrappers(resourceSet);
+		ArtifactHelper artifactHelper = new ArtifactHelper(artifactModel);
+
+		for (Connection conn : directElements) {
+			int connectionHash = conn.getOrigin().hashCode() + conn.getTlink().hashCode();
+			for (EObject targ : conn.getTargets()) {
+				connectionHash += targ.hashCode();
+			}
+			if (!hashCodes.contains(connectionHash)) {
+				allElements.add(conn);
+			}
+			for (EObject o : conn.getTargets()) {
+				@SuppressWarnings("unchecked")
+				IArtifactHandler<Object> handler = (IArtifactHandler<Object>) artifactHelper.getHandler(o).orElse(null);
+				handler.addInternalLinks(o, allElements, duplicationCheck, selectedRelationshipTypes);
+				
+			}
+		}
+
+		if (element.getClass().getPackage().toString().contains("org.eclipse.eatop")) {
+			@SuppressWarnings("unchecked")
+			IArtifactHandler<Object> handler = (IArtifactHandler<Object>) artifactHelper.getHandler(element)
+					.orElse(null);
+			handler.addInternalLinks(element, allElements, duplicationCheck, selectedRelationshipTypes);
+		}
+		return allElements;
+	}
+
+	/** Decide if two objects are connected according to the given trace model
+	* 
+	* @param first
+	*            First object
+	* @param second
+	*            Second object
+	* @param traceModel
+	*            Trace model to base decision on
+	* @return <code>true</code> if object are connected, <code>false</code>
+	*         otherwise
+	*/
+	public boolean isThereATraceBetween(EObject first, EObject second, EObject traceModel) {
+		return false;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel) {
+		
+			ResourceSet resourceSet = new ResourceSetImpl();
+			TracePersistenceAdapter persistenceAdapter = ExtensionPointHelper.getTracePersistenceAdapter().get();
+			EObject artifactModel = persistenceAdapter.getArtifactWrappers(resourceSet);
+			ArtifactHelper artifactHelper = new ArtifactHelper(artifactModel);
+			IArtifactHandler<?> handlerFirstElement = artifactHelper.getHandler(first).orElse(null);
+			IArtifactHandler<?> handlerSecondElement = artifactHelper.getHandler(second).orElse(null);
+
+			return handlerFirstElement.isThereAnInternalTraceBetween(first, second)
+					|| handlerSecondElement.isThereAnInternalTraceBetween(first, second);
+	}
+}
diff --git a/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/TraceMetaModelAdapter.java b/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/TraceMetaModelAdapter.java
index 3ef86ba..d4979bd 100644
--- a/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/TraceMetaModelAdapter.java
+++ b/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/TraceMetaModelAdapter.java
@@ -87,6 +87,23 @@
 	 *         all objects connected to element via t}]
 	 */
 	List<Connection> getConnectedElements(EObject element, EObject traceModel);
+	
+	/**
+	 * Determine a list of all objects connected to element according to the
+	 * given trace model
+	 * 
+	 * @param element
+	 *            The element used to determine the list of connected objects.
+	 *            Note that this element could be a trace in the trace model
+	 * @param traceModel
+	 *            Trace model to base calculation on
+	 * @param selectedRelationshipTypes
+	 *            List of selected relationship types from the context menu of
+	 *            plantuml
+	 * @return A Map with the following structure: [Trace object t -> {list of
+	 *         all objects connected to element via t}]
+	 */
+	List<Connection> getConnectedElements(EObject element, EObject traceModel, List<String> selectedRelationshipTypes);
 
 	/**
 	 * Determine a list of all objects connected to element according to the
@@ -97,12 +114,36 @@
 	 *            Note that this element could be a trace in the trace model
 	 * @param traceModel
 	 *            Trace model to base calculation on
+	 * @param transitivityDepth
+	 *            The maximum depth the user wants to go down transitively. 0
+	 *            indicates no limit.
 	 * @return A Map with the following structure: [Trace object t -> {list of
 	 *         all objects connected to element via t}]
 	 */
-	List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel);
+	List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel, int transitivityDepth);
 
 	/**
+	 * Determine a list of all objects connected to element according to the
+	 * given trace model
+	 * 
+	 * @param element
+	 *            The element used to determine the list of connected objects.
+	 *            Note that this element could be a trace in the trace model
+	 * @param traceModel
+	 *            Trace model to base calculation on
+	 * @param selectedRelationshipTypes
+	 *            List of selected relationship types from the context menu of
+	 *            plantuml
+	 * @param transitivityDepth
+	 *            The maximum depth the user wants to go down transitively. 0
+	 *            indicates no limit.
+	 * @return A Map with the following structure: [Trace object t -> {list of
+	 *         all objects connected to element via t}]
+	 */
+	List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel,
+			List<String> selectedRelationshipTypes, int transitivityDepth);
+	
+	/**
 	 * Given a trace model, this method returns a list of all trace links in the
 	 * model
 	 * 
@@ -123,4 +164,64 @@
 	 *            the trace model to delete the links from
 	 */
 	void deleteTrace(List<Connection> toDelete, EObject traceModel);
+	
+	/**
+	 * Determine a list of all objects internally connected to element (e.g.
+	 * UML)
+	 * 
+	 * @param element
+	 *            The element used to determine the list of connected objects.
+	 *            Note that this element could be a trace in the trace model
+	 * @param traceModel
+	 *            Trace model to base calculation on
+	 * @param selectedRelationshipTypes
+	 *            List of selected relationship types from the context menu of
+	 *            plantuml
+	 * @param traceLinksTransitive
+	 *            Used to determine if tracelink elements should be received
+	 *            transitively
+	 * @param transitivityDepth
+	 *            Used to in case tracelinks are received transivitely in order
+	 *            to set the depth
+	 * @return A Map with the following structure: [Trace object t -> {list of
+	 *         all objects connected to element via t}]
+	 */
+	List<Connection> getInternalElements(EObject element, EObject traceModel, List<String> selectedRelationshipTypes,
+			boolean traceLinksTransitive, int transitivityDepth, List<Connection> existingTraces);
+
+	/**
+	 * Determine a list of elements internally connected to the selected one
+	 * transitively
+	 * 
+	 * @param element
+	 *            The element used to determine the list of connected objects.
+	 *            Note that this element could be a trace in the trace model
+	 * @param traceModel
+	 *            Trace model to base calculation on
+	 * @param transitivityDepth
+	 *            The maximum depth the user wants to go down transitively. 0
+	 *            indicates no limit.
+	 * @return A Map with the following structure: [Trace object t -> {list of
+	 *         all objects connected to element via t}]
+	 */
+	List<Connection> getInternalElementsTransitive(EObject element, EObject traceModel,
+			List<String> selectedRelationshipTypes, int transitivityDepth, List<Connection> existingTraces);
+	
+	/**
+	 * Decide if two objects are connected internally by passing the selected
+	 * objects down to the artifact handlers and returns a String with the Type
+	 * of connection for the trace matrix (empty String if no connection exists)
+	 * This is implemented in the {@link AbstractMetaModelAdapter} and does not
+	 * need to be overwritten but can be used like it is.
+	 * 
+	 * @param first
+	 *            First object
+	 * @param second
+	 *            Second object
+	 * @param traceModel
+	 *            Trace model to base decision on
+	 * @return <code>true</code> if object are connected, <code>false</code>
+	 *         otherwise
+	 */
+	boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel);
 }
diff --git a/org.eclipse.capra.core/src/org/eclipse/capra/core/handlers/IArtifactHandler.java b/org.eclipse.capra.core/src/org/eclipse/capra/core/handlers/IArtifactHandler.java
index a69b1f7..39a3cad 100644
--- a/org.eclipse.capra.core/src/org/eclipse/capra/core/handlers/IArtifactHandler.java
+++ b/org.eclipse.capra.core/src/org/eclipse/capra/core/handlers/IArtifactHandler.java
@@ -10,9 +10,12 @@
  *******************************************************************************/
 package org.eclipse.capra.core.handlers;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Optional;
 import java.util.function.BiFunction;
 
+import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.core.resources.IResourceDelta;
 import org.eclipse.emf.ecore.EObject;
 
@@ -115,5 +118,34 @@
          *         not be created.
 	 */
 	String generateMarkerMessage(IResourceDelta delta, String wrapperUri);
+	
+	/**
+	 * Adds internal links related to a given element
+	 * 
+	 * @param investigatedElement
+	 *            Element currently under investigation for links
+	 * @param allElements
+	 *            List of all elements for Plant-uml view
+	 * @param duplicationCheck
+	 *            List of String for checking for duplication
+	 * @param selectedRelationshipTypes 
+	 * 			  relationship types selected by the user to be displayed in the plantUML view
+	 */
+	void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes);
+
+	/**
+	 * Decide if two objects have an internal link between them.
+	 *
+	 * @param first
+	 *            First object
+	 * @param second
+	 *            Second object
+	 * @param traceModel
+	 *            Trace model to base decision on
+	 * @return <code>true</code> if object are connected, <code>false</code>
+	 *         otherwise
+	 */
+	boolean isThereAnInternalTraceBetween(EObject first, EObject second);
 
 }
diff --git a/org.eclipse.capra.generic.tracemodels/plugin.xml b/org.eclipse.capra.generic.tracemodels/plugin.xml
index 31f48f2..c1a39b9 100644
--- a/org.eclipse.capra.generic.tracemodels/plugin.xml
+++ b/org.eclipse.capra.generic.tracemodels/plugin.xml
@@ -24,14 +24,6 @@
             class="org.eclipse.capra.GenericTraceMetaModel.GenericTraceMetaModelPackage"
             genModel="model/generictrace.xcore"/>
    </extension>
-
-   <extension point="org.eclipse.emf.ecore.generated_package">
-      <!-- @generated artifact -->
-      <package
-            uri="org.eclipse.capra.GenericArtifactMetaModel"
-            class="org.eclipse.capra.GenericArtifactMetaModel.GenericArtifactMetaModelPackage"
-            genModel="model/artifact.xcore"/>
-   </extension>
    <extension
          point="org.eclipse.capra.configuration.traceabilityMetaModel">
       <TraceabilityMetaModelAdapter
diff --git a/org.eclipse.capra.generic.tracemodels/src/org/eclipse/capra/generic/tracemodels/GenericMetaModelAdapter.java b/org.eclipse.capra.generic.tracemodels/src/org/eclipse/capra/generic/tracemodels/GenericMetaModelAdapter.java
index d717fff..239f04c 100644
--- a/org.eclipse.capra.generic.tracemodels/src/org/eclipse/capra/generic/tracemodels/GenericMetaModelAdapter.java
+++ b/org.eclipse.capra.generic.tracemodels/src/org/eclipse/capra/generic/tracemodels/GenericMetaModelAdapter.java
@@ -20,6 +20,7 @@
 import org.eclipse.capra.GenericTraceMetaModel.GenericTraceMetaModelPackage;
 import org.eclipse.capra.GenericTraceMetaModel.GenericTraceModel;
 import org.eclipse.capra.GenericTraceMetaModel.RelatedTo;
+import org.eclipse.capra.core.adapters.AbstractMetaModelAdapter;
 import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.capra.core.adapters.TraceMetaModelAdapter;
 import org.eclipse.capra.core.helpers.ExtensionPointHelper;
@@ -35,7 +36,9 @@
 /**
  * Provides generic functionality to deal with traceability meta models.
  */
-public class GenericMetaModelAdapter implements TraceMetaModelAdapter {
+public class GenericMetaModelAdapter extends AbstractMetaModelAdapter implements TraceMetaModelAdapter {
+	
+	private static int DEFAULT_INITIAL_TRANSITIVITY_DEPTH =-2;
 
 	public GenericMetaModelAdapter() {
 		// TODO Auto-generated constructor stub
@@ -100,8 +103,9 @@
 		}
 		if (relevantLinks.size() > 0) {
 			return true;
-		} else
-			return false;
+		}
+
+		return this.isThereAnInternalTraceBetween(firstElement, secondElement, traceModel);
 	}
 
 	@Override
@@ -124,28 +128,55 @@
 		return connections;
 	}
 
+	@Override
+	public List<Connection> getConnectedElements(EObject element, EObject tracemodel,
+			List<String> selectedRelationshipTypes) {
+		GenericTraceModel root = (GenericTraceModel) tracemodel;
+		List<Connection> connections = new ArrayList<>();
+		List<RelatedTo> traces = root.getTraces();
+
+		if (selectedRelationshipTypes.size() == 0 || selectedRelationshipTypes
+				.contains(GenericTraceMetaModelPackage.eINSTANCE.getRelatedTo().getName())) {
+			if (element instanceof RelatedTo) {
+				RelatedTo trace = (RelatedTo) element;
+				connections.add(new Connection(element, trace.getItem(), trace));
+			} else {
+
+				for (RelatedTo trace : traces) {
+					if (trace.getItem().contains(element)) {
+						connections.add(new Connection(element, trace.getItem(), trace));
+					}
+				}
+			}
+		}
+		return connections;
+	}
 	private List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel,
-			List<Object> accumulator) {
+			List<Object> accumulator, int currentDepth, int maximumDepth) {
 		List<Connection> directElements = getConnectedElements(element, traceModel);
 		List<Connection> allElements = new ArrayList<>();
 
-		directElements.forEach(connection -> {
+		int currDepth = currentDepth + 1;
+		for (Connection connection : directElements) {
 			if (!accumulator.contains(connection.getTlink())) {
 				allElements.add(connection);
 				accumulator.add(connection.getTlink());
-				connection.getTargets().forEach(e -> {
-					allElements.addAll(getTransitivelyConnectedElements(e, traceModel, accumulator));
-				});
+				for (EObject e : connection.getTargets()) {
+					if (maximumDepth == 0 || currDepth <= maximumDepth) {
+						allElements.addAll(
+								getTransitivelyConnectedElements(e, traceModel, accumulator, currDepth, maximumDepth));
+					}
+				}
 			}
-		});
+		}
 
 		return allElements;
 	}
 
 	@Override
-	public List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel) {
+	public List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel, int maximumDepth) {
 		List<Object> accumulator = new ArrayList<>();
-		return getTransitivelyConnectedElements(element, traceModel, accumulator);
+		return getTransitivelyConnectedElements(element, traceModel, accumulator, DEFAULT_INITIAL_TRANSITIVITY_DEPTH, maximumDepth);
 	}
 
 	@Override
@@ -184,4 +215,33 @@
 			}
 	}
 	}
+	
+	@Override
+	public List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel,
+			List<String> selectedRelationshipTypes, int maximumDepth) {
+		List<Object> accumulator = new ArrayList<>();
+		return getTransitivelyConnectedElements(element, traceModel, accumulator, selectedRelationshipTypes, DEFAULT_INITIAL_TRANSITIVITY_DEPTH,
+				maximumDepth);
+	}
+	
+	private List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel,
+			List<Object> accumulator, List<String> selectedRelationshipTypes, int currentDepth, int maximumDepth) {
+		List<Connection> directElements = getConnectedElements(element, traceModel, selectedRelationshipTypes);
+		List<Connection> allElements = new ArrayList<>();
+		int currDepth = currentDepth++;
+		for (Connection connection : directElements) {
+			if (!accumulator.contains(connection.getTlink())) {
+				allElements.add(connection);
+				accumulator.add(connection.getTlink());
+				for (EObject e : connection.getTargets()) {
+					if (maximumDepth == 0 || currDepth <= maximumDepth) {
+						allElements.addAll(getTransitivelyConnectedElements(e, traceModel, accumulator,
+								selectedRelationshipTypes, currDepth, maximumDepth));
+					}
+				}
+			}
+		}
+
+		return allElements;
+	}
 }
diff --git a/org.eclipse.capra.handler.cdt/src/org/eclipse/capra/handler/cdt/CDTHandler.java b/org.eclipse.capra.handler.cdt/src/org/eclipse/capra/handler/cdt/CDTHandler.java
index 0b8117b..855eb87 100644
--- a/org.eclipse.capra.handler.cdt/src/org/eclipse/capra/handler/cdt/CDTHandler.java
+++ b/org.eclipse.capra.handler.cdt/src/org/eclipse/capra/handler/cdt/CDTHandler.java
@@ -10,8 +10,12 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.cdt;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.http.client.utils.URIBuilder;
 import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
 import org.eclipse.capra.core.handlers.AnnotationException;
 import org.eclipse.capra.core.handlers.IAnnotateArtifact;
@@ -90,4 +94,15 @@
 	public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
 		return null;
 	}
+
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// Method currently left empty to wait for user requirements of relevant internal links for C code
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+		return false;
+	}
 }
diff --git a/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/EMFHandler.java b/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/EMFHandler.java
index ffa88e8..97b4304 100644
--- a/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/EMFHandler.java
+++ b/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/EMFHandler.java
@@ -10,6 +10,10 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.emf;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
 import org.eclipse.capra.core.helpers.EMFHelper;
 import org.eclipse.core.resources.IResourceDelta;
@@ -39,4 +43,15 @@
 	public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
 		return null;
 	}
+
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// Method currently left empty to wait for user requirements of relevant internal links for EMF models
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+		return false;
+	}
 }
diff --git a/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/notification/ModelChangeListener.java b/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/notification/ModelChangeListener.java
index 3cc75e5..746696a 100644
--- a/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/notification/ModelChangeListener.java
+++ b/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/notification/ModelChangeListener.java
@@ -70,7 +70,8 @@
 		TracePersistenceAdapter persistenceAdapter = ExtensionPointHelper.getTracePersistenceAdapter().get();
 		ResourceSetImpl newResourceSet = new ResourceSetImpl();
 		EObject traceModel = persistenceAdapter.getTraceModel(newResourceSet);
-		if (traceModel != null) {
+		//check that atleast one trace link exists
+		if (traceModel!=null && traceModel.eContents().size() > 0) {
 
 			IPath path = new Path(EcoreUtil.getURI(traceModel).toPlatformString(false));
 			IFile traceContainer = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
diff --git a/org.eclipse.capra.handler.file/src/org/eclipse/capra/handler/file/IFileHandler.java b/org.eclipse.capra.handler.file/src/org/eclipse/capra/handler/file/IFileHandler.java
index 113aed2..da4bcba 100644
--- a/org.eclipse.capra.handler.file/src/org/eclipse/capra/handler/file/IFileHandler.java
+++ b/org.eclipse.capra.handler.file/src/org/eclipse/capra/handler/file/IFileHandler.java
@@ -10,7 +10,11 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.file;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
 import org.eclipse.capra.core.helpers.ExtensionPointHelper;
 import org.eclipse.core.resources.IFile;
@@ -52,4 +56,15 @@
 				+ " has been changed. Please check if associated trace links are still valid.";
 	}
 
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// Method currently left empty to wait for user requirements of relevant internal links for Files
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+		return false;
+	}
+
 }
diff --git a/org.eclipse.capra.handler.gef/src/org/eclipse/capra/handler/gef/GEFHandler.java b/org.eclipse.capra.handler.gef/src/org/eclipse/capra/handler/gef/GEFHandler.java
index c9a3986..c8f014a 100644
--- a/org.eclipse.capra.handler.gef/src/org/eclipse/capra/handler/gef/GEFHandler.java
+++ b/org.eclipse.capra.handler.gef/src/org/eclipse/capra/handler/gef/GEFHandler.java
@@ -10,6 +10,10 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.gef;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
 import org.eclipse.core.resources.IResourceDelta;
 import org.eclipse.emf.ecore.EObject;
@@ -42,4 +46,15 @@
 	public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
 		return null;
 	}
+
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// Method currently left empty to wait for user requirements of relevant internal links for GEF models
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+		return false;
+	}
 }
diff --git a/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/BuildElementHandler.java b/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/BuildElementHandler.java
index 8394364..052d53a 100644
--- a/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/BuildElementHandler.java
+++ b/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/BuildElementHandler.java
@@ -10,7 +10,11 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.hudson;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
 import org.eclipse.capra.core.helpers.ExtensionPointHelper;
 import org.eclipse.core.resources.IResourceDelta;
@@ -48,4 +52,15 @@
 		return null;
 	}
 
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// Method currently left empty to wait for user requirements of relevant internal links for Build Elements
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+		return false;
+	}
+
 }
diff --git a/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/TestElementHandler.java b/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/TestElementHandler.java
index a89a693..6a3f45b 100644
--- a/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/TestElementHandler.java
+++ b/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/TestElementHandler.java
@@ -10,7 +10,11 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.hudson;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
 import org.eclipse.capra.core.helpers.ExtensionPointHelper;
 import org.eclipse.core.resources.IResourceDelta;
@@ -49,4 +53,15 @@
 		return null;
 	}
 
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// Method currently left empty to wait for user requirements of relevant internal links for Test Elements
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+		return false;
+	}
+
 }
diff --git a/org.eclipse.capra.handler.jdt/src/org/eclipse/capra/handler/jdt/JavaElementHandler.java b/org.eclipse.capra.handler.jdt/src/org/eclipse/capra/handler/jdt/JavaElementHandler.java
index a98b3ba..8c87fb0 100644
--- a/org.eclipse.capra.handler.jdt/src/org/eclipse/capra/handler/jdt/JavaElementHandler.java
+++ b/org.eclipse.capra.handler.jdt/src/org/eclipse/capra/handler/jdt/JavaElementHandler.java
@@ -12,10 +12,13 @@
 
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.stream.Collectors;
 
 import org.apache.http.client.utils.URIBuilder;
 import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
 import org.eclipse.capra.core.handlers.AnnotationException;
 import org.eclipse.capra.core.handlers.IAnnotateArtifact;
@@ -156,4 +159,15 @@
 
 		return message;
 	}
+
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// Method currently left empty to wait for user requirements of relevant internal links for Java code
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+		return false;
+	}
 }
diff --git a/org.eclipse.capra.handler.mylyn/src/org/eclipse/capra/handler/mylyn/MylynHandler.java b/org.eclipse.capra.handler.mylyn/src/org/eclipse/capra/handler/mylyn/MylynHandler.java
index 0c3dc3d..addb961 100644
--- a/org.eclipse.capra.handler.mylyn/src/org/eclipse/capra/handler/mylyn/MylynHandler.java
+++ b/org.eclipse.capra.handler.mylyn/src/org/eclipse/capra/handler/mylyn/MylynHandler.java
@@ -10,7 +10,11 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.mylyn;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
 import org.eclipse.capra.core.helpers.ExtensionPointHelper;
 import org.eclipse.core.resources.IResourceDelta;
@@ -45,4 +49,15 @@
 	public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
 		return null;
 	}
+
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// Method currently left empty to wait for user requirements of relevant internal links for Mylyn tasks
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+		return false;
+	}
 }
diff --git a/org.eclipse.capra.handler.office/src/org/eclipse/capra/handler/office/OfficeHandler.java b/org.eclipse.capra.handler.office/src/org/eclipse/capra/handler/office/OfficeHandler.java
index 6c68750..345a26c 100644
--- a/org.eclipse.capra.handler.office/src/org/eclipse/capra/handler/office/OfficeHandler.java
+++ b/org.eclipse.capra.handler.office/src/org/eclipse/capra/handler/office/OfficeHandler.java
@@ -11,7 +11,11 @@
 
 package org.eclipse.capra.handler.office;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
 import org.eclipse.capra.core.helpers.ExtensionPointHelper;
 import org.eclipse.capra.ui.office.model.CapraOfficeObject;
@@ -57,5 +61,16 @@
 		return null;
 	}
 
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// Method currently left empty to wait for user requirements of relevant internal links for Office files
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+		return false;
+	}
+
 	
 }
diff --git a/org.eclipse.capra.handler.papyrus/src/org/eclipse/capra/handler/papyrus/PapyrusHandler.java b/org.eclipse.capra.handler.papyrus/src/org/eclipse/capra/handler/papyrus/PapyrusHandler.java
index 03ddd4f..cf2f413 100644
--- a/org.eclipse.capra.handler.papyrus/src/org/eclipse/capra/handler/papyrus/PapyrusHandler.java
+++ b/org.eclipse.capra.handler.papyrus/src/org/eclipse/capra/handler/papyrus/PapyrusHandler.java
@@ -10,6 +10,10 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.papyrus;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
 import org.eclipse.core.resources.IResourceDelta;
 import org.eclipse.emf.ecore.EObject;
@@ -46,4 +50,16 @@
 		return null;
 	}
 
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// Method currently left empty to wait for user requirements of relevant internal links specific for Papyrus models. 
+		//Currently, UML links such as association and those from the SYSML Profile are handled by the UML Handler	
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+		return false;
+	}
+
 }
\ No newline at end of file
diff --git a/org.eclipse.capra.handler.php/src/org/eclipse/capra/handler/php/PhpHandler.java b/org.eclipse.capra.handler.php/src/org/eclipse/capra/handler/php/PhpHandler.java
index f4a52a0..2e5981e 100644
--- a/org.eclipse.capra.handler.php/src/org/eclipse/capra/handler/php/PhpHandler.java
+++ b/org.eclipse.capra.handler.php/src/org/eclipse/capra/handler/php/PhpHandler.java
@@ -1,6 +1,10 @@
 package org.eclipse.capra.handler.php;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
 import org.eclipse.capra.core.helpers.ExtensionPointHelper;
 import org.eclipse.core.resources.IResourceDelta;
@@ -36,4 +40,15 @@
 		return null;
 	}
 
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// Method currently left empty to wait for user requirements of relevant internal links for PHP Code
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+		return false;
+	}
+
 }
diff --git a/org.eclipse.capra.handler.reqIf/src/org/eclipse/capra/handler/reqif/ReqIfHandler.java b/org.eclipse.capra.handler.reqIf/src/org/eclipse/capra/handler/reqif/ReqIfHandler.java
index a02b640..6de0265 100644
--- a/org.eclipse.capra.handler.reqIf/src/org/eclipse/capra/handler/reqif/ReqIfHandler.java
+++ b/org.eclipse.capra.handler.reqIf/src/org/eclipse/capra/handler/reqif/ReqIfHandler.java
@@ -10,6 +10,10 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.reqif;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
 import org.eclipse.core.resources.IResourceDelta;
 import org.eclipse.emf.ecore.EObject;
@@ -40,4 +44,15 @@
 	public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
 		return null;
 	}
+
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// Method currently left empty to wait for user requirements of relevant internal links for REQIF requirements
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+		return false;
+	}
 }
diff --git a/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceabiltyMatrix.java b/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceabiltyMatrix.java
index 4804400..93cf732 100644
--- a/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceabiltyMatrix.java
+++ b/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceabiltyMatrix.java
@@ -38,15 +38,15 @@
 public class TestTraceabiltyMatrix {
 
 	private final static String EXPECTED_TEXT_FOR_SELECTED_PACKAGES_DIRECT = "@startuml\n" + "salt\n" + "{#\n"
-			+ ".|modelB : EPackage\n" + "modelA : EPackage |X\n" + "}\n" + "\n" + "@enduml\n";
+			+ ".|modelB : EPackage\n" + "modelA : EPackage |\nX\n" + "}\n" + "\n" + "@enduml\n";
 
 	private final static String EXPECTED_TEXT_FOR_SELECTED_PACKAGES_TRANSITIVE = "@startuml\n" + "salt\n" + "{#\n"
-			+ ".|B : EClass|BB : EClass|modelB : EPackage\n" + "A : EClass |X|.|.\n" + "AA : EClass |.|X|.\n"
-			+ "modelA : EPackage |.|.|X\n" + "}\n" + "\n" + "@enduml\n";
+			+ ".|B : EClass|BB : EClass|modelB : EPackage\n" + "A : EClass |\nX|\n.|\n.\n" + "AA : EClass |\n.|\nX|\n.\n"
+			+ "modelA : EPackage |\n.|\n.|\nX\n" + "}\n" + "\n" + "@enduml\n";
 
 	private final static String EXPECTED_TEXT_FOR_SELECTED_CLASSES = "@startuml\n" + "salt\n" + "{#\n"
-			+ ".|A : EClass|B : EClass|AA : EClass|BB : EClass\n" + "A : EClass |.|X|.|.\n" + "B : EClass |X|.|.|.\n"
-			+ "AA : EClass |.|.|.|X\n" + "BB : EClass |.|.|X|.\n" + "}\n" + "\n" + "@enduml\n";
+			+ ".|A : EClass|B : EClass|AA : EClass|BB : EClass\n" + "A : EClass |\n.|\nX|\n.|\n.\n" + "B : EClass |\nX|\n.|\n.|\n.\n"
+			+ "AA : EClass |\n.|\n.|\n.|\nX\n" + "BB : EClass |\n.|\n.|\nX|\n.\n" + "}\n" + "\n" + "@enduml\n";
 
 	@Before
 	public void init() throws CoreException {
@@ -143,6 +143,8 @@
 		ToggleTransitivityHandler.setTraceViewTransitive(false);
 		DiagramTextProviderHandler provider = new DiagramTextProviderHandler();
 		String plantUMLTextForSelectedPackages_Direct = provider.getDiagramText(selectedPackages);
+		System.out.println("What I see: " + plantUMLTextForSelectedPackages_Direct);
+		System.out.println("What is expected" + EXPECTED_TEXT_FOR_SELECTED_PACKAGES_DIRECT);
 		assertTrue(plantUMLTextForSelectedPackages_Direct.equals(EXPECTED_TEXT_FOR_SELECTED_PACKAGES_DIRECT));
 
 		// Test transitively connected Elements
diff --git a/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/DiagramTextProviderHandler.java b/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/DiagramTextProviderHandler.java
index c6bb097..9576618 100644
--- a/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/DiagramTextProviderHandler.java
+++ b/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/DiagramTextProviderHandler.java
@@ -75,7 +75,9 @@
 
 					if (selectedModels.size() == 1) {
 						if (ToggleTransitivityHandler.isTraceViewTransitive()) {
-							traces = metamodelAdapter.getTransitivelyConnectedElements(selectedObject, traceModel);
+							int transitivityDepth = 0;
+							//more to follow in the next commit
+							traces = metamodelAdapter.getTransitivelyConnectedElements(selectedObject, traceModel, transitivityDepth);
 						} else {
 							traces = metamodelAdapter.getConnectedElements(selectedObject, traceModel);
 						}
diff --git a/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/ToggleDisplayGraphHandler.java b/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/ToggleDisplayGraphHandler.java
index 051bf7e..1a760b9 100644
--- a/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/ToggleDisplayGraphHandler.java
+++ b/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/ToggleDisplayGraphHandler.java
@@ -44,7 +44,7 @@
 	public static boolean isDisplayGraph() {
 		Preferences graphDisplay = getPreference();
 
-		return graphDisplay.get("option", "matrix").equals("matrix");
+		return graphDisplay.get("option", "graph").equals("matrix");
 	}
 
 	private static Preferences getPreference() {
diff --git a/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/VisualizationHelper.xtend b/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/VisualizationHelper.xtend
index adad9a5..4564655 100644
--- a/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/VisualizationHelper.xtend
+++ b/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/VisualizationHelper.xtend
@@ -17,7 +17,8 @@
 	«IF firstElements != null»
 	.«FOR e : secondElements»|«Connections.getArtifactLabel(e)»«ENDFOR»
 	«FOR first : firstElements»
-	«Connections.getArtifactLabel(first)» «FOR second : secondElements»|«IF traceAdapter.isThereATraceBetween(first, second, traceModel)»X«ELSE».«ENDIF»«ENDFOR»
+	«Connections.getArtifactLabel(first)» «FOR second : secondElements»|
+	«IF traceAdapter.isThereATraceBetween(first, second, traceModel)»X«ELSE».«ENDIF»«ENDFOR»
 	«ENDFOR»
 	«ELSE»
 	Choose two containers to show a traceability matrix of their contents.
diff --git a/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/.VisualizationHelper.xtendbin b/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/.VisualizationHelper.xtendbin
index 9c9cab4..c576236 100644
--- a/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/.VisualizationHelper.xtendbin
+++ b/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/.VisualizationHelper.xtendbin
Binary files differ
diff --git a/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/VisualizationHelper.java b/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/VisualizationHelper.java
index 7644e2c..ae41436 100644
--- a/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/VisualizationHelper.java
+++ b/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/VisualizationHelper.java
@@ -45,6 +45,7 @@
               {
                 for(final EObject second : secondElements) {
                   _builder.append("|");
+                  _builder.newLineIfNotEmpty();
                   {
                     boolean _isThereATraceBetween = traceAdapter.isThereATraceBetween(first, second, traceModel);
                     if (_isThereATraceBetween) {
diff --git a/org.eclipse.capra.ui.zest/src/org/eclipse/capra/ui/zest/TraceNodeContentProvider.java b/org.eclipse.capra.ui.zest/src/org/eclipse/capra/ui/zest/TraceNodeContentProvider.java
index 43a3e47..18993bd 100644
--- a/org.eclipse.capra.ui.zest/src/org/eclipse/capra/ui/zest/TraceNodeContentProvider.java
+++ b/org.eclipse.capra.ui.zest/src/org/eclipse/capra/ui/zest/TraceNodeContentProvider.java
@@ -76,7 +76,8 @@
 		List<EObject> nodes = new ArrayList<>();
 		if (currentSelection.get(0) instanceof EObject) {
 			EObject object = (EObject) currentSelection.get(0);
-			connections = metaModelAdapter.getTransitivelyConnectedElements(object, traceModel);
+			int transitivityDepth = 0;
+			connections = metaModelAdapter.getTransitivelyConnectedElements(object, traceModel, transitivityDepth);
 			for (Connection c : connections) {
 				nodes.add(c.getOrigin());
 				nodes.addAll(c.getTargets());