API changes to support DSL internal links

Change-Id: I66c27d0f98e70f9b881dd01636c0fb64cca1e309
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..814266f
--- /dev/null
+++ b/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/AbstractMetaModelAdapter.java
@@ -0,0 +1,120 @@
+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;
+	}
+
+	@Override
+	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;
+	}
+
+	@Override
+	public boolean isThereATraceBetween(EObject first, EObject second, EObject traceModel) {
+		return false;
+	}
+
+	@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, traceModel)
+				|| handlerSecondElement.isThereAnInternalTraceBetween(first, second, traceModel);
+	}
+}
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..4fcf08d 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
@@ -25,7 +25,7 @@
  *
  */
 public interface TraceMetaModelAdapter {
-	
+
 	/**
 	 * Create a new model for the trace links.
 	 * 
@@ -61,17 +61,18 @@
 	 */
 	EObject createTrace(EClass traceType, EObject traceModel, List<EObject> selection);
 
-	/** 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
-	*/
+	/**
+	 * 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
+	 */
 	boolean isThereATraceBetween(EObject first, EObject second, EObject traceModel);
 
 	/**
@@ -97,10 +98,51 @@
 	 *            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> getTransitivelyConnectedElements(EObject element, EObject traceModel);
+	List<Connection> getConnectedElements(EObject element, EObject traceModel, List<String> selectedRelationshipTypes);
+
+	/**
+	 * 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 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, 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
@@ -123,4 +165,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..488961c 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,11 @@
  *******************************************************************************/
 package org.eclipse.capra.core.handlers;
 
+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;
 
@@ -101,7 +103,6 @@
 	 */
 	Class<T> getHandledClass();
 
-
 	/**
 	 * When a change in the resource occurs, it generates the message that is to
 	 * be displayed by the Capra marker.
@@ -110,10 +111,39 @@
 	 *            represents changes in the state of a resource
 	 * @param wrapperUri
 	 *            uri of the artifact that is associated with the change
-	 * @return the Capra marker message. Every marker must return a unique message.
-         *         If the message already exists it will be ignoored and a marker will 
-         *         not be created.
+	 * @return the Capra marker message. Every marker must return a unique
+	 *         message. If the message already exists it will be ignoored and a
+	 *         marker will not be created.
 	 */
 	String generateMarkerMessage(IResourceDelta delta, String wrapperUri);
 
+	/**
+	 * Returns the type that is handled by this <code>IArtifactHandler</code>.
+	 * 
+	 * @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
+	 */
+	void addInternalLinks(EObject investigatedElement, List<Connection> allElements, List<Integer> duplicationCheck,
+			List<String> selectedRelationshipTypes);
+
+	/**
+	 * Decide if two objects are connected according to the given trace model
+	 * and returns a String with the Type of connection for the trace matrix
+	 * (empty String if no connection exists)
+	 *
+	 * @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.generic.tracemodels/plugin.xml b/org.eclipse.capra.generic.tracemodels/plugin.xml
index 31f48f2..9e4b04e 100644
--- a/org.eclipse.capra.generic.tracemodels/plugin.xml
+++ b/org.eclipse.capra.generic.tracemodels/plugin.xml
@@ -25,13 +25,6 @@
             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..6b3c100 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,7 @@
 /**
  * Provides generic functionality to deal with traceability meta models.
  */
-public class GenericMetaModelAdapter implements TraceMetaModelAdapter {
+public class GenericMetaModelAdapter extends AbstractMetaModelAdapter implements TraceMetaModelAdapter {
 
 	public GenericMetaModelAdapter() {
 		// TODO Auto-generated constructor stub
@@ -63,28 +64,24 @@
 		RelatedTo RelatedToTrace = (RelatedTo) trace;
 		RelatedToTrace.getItem().addAll(selection);
 
-
 		// String builder to build the name of the trace link so by adding the
 		// elements it connects so as to make it easy for a user to visually
 		// differentiate trace links
-	
+
 		String name = "";
-		
+
 		for (Object obj : selection) {
-				name = name + " " + ExtensionPointHelper.getArtifactHandlers().stream()
-						.map(handler -> handler.withCastedHandler(obj, (h, e) -> h.getDisplayName(e)))
-						.filter(Optional::isPresent)
-						.map(Optional::get)
-						.findFirst()
-						.orElseGet(obj::toString);
+			name = name + " "
+					+ ExtensionPointHelper.getArtifactHandlers().stream()
+							.map(handler -> handler.withCastedHandler(obj, (h, e) -> h.getDisplayName(e)))
+							.filter(Optional::isPresent).map(Optional::get).findFirst().orElseGet(obj::toString);
 		}
-		
+
 		RelatedToTrace.setName(name.toString());
 		TM.getTraces().add(RelatedToTrace);
 		return TM;
 	}
 
-
 	@Override
 	public boolean isThereATraceBetween(EObject firstElement, EObject secondElement, EObject traceModel) {
 		GenericTraceModel root = (GenericTraceModel) traceModel;
@@ -100,8 +97,9 @@
 		}
 		if (relevantLinks.size() > 0) {
 			return true;
-		} else
-			return false;
+		}
+
+		return this.isThereAnInternalTraceBetween(firstElement, secondElement, traceModel);
 	}
 
 	@Override
@@ -124,28 +122,56 @@
 		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) {
+			ArrayList<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) {
-		List<Object> accumulator = new ArrayList<>();
-		return getTransitivelyConnectedElements(element, traceModel, accumulator);
+	public List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel, int maximumDepth) {
+		ArrayList<Object> accumulator = new ArrayList<>();
+		return getTransitivelyConnectedElements(element, traceModel, accumulator, -2, maximumDepth);
 	}
 
 	@Override
@@ -163,7 +189,7 @@
 
 	@Override
 	public void deleteTrace(List<Connection> toDelete, EObject traceModel) {
-		if(traceModel instanceof GenericTraceModel) {
+		if (traceModel instanceof GenericTraceModel) {
 			GenericTraceModel TModel = (GenericTraceModel) traceModel;
 			EList<RelatedTo> links = TModel.getTraces();
 			ResourceSet resourceSet = new ResourceSetImpl();
@@ -175,13 +201,43 @@
 			URI traceModelURI = EcoreUtil.getURI(traceModel);
 			Resource resourceForTraces = resourceSet.createResource(traceModelURI);
 			resourceForTraces.getContents().add(newTraceModel);
-	
+
 			try {
 				resourceForTraces.save(null);
-                          	// TODO: Think of a way to let the developer handle such sitations (e.g., via an Exception)
+				// TODO: Think of a way to let the developer handle such
+				// sitations (e.g., via an Exception)
 			} catch (IOException e) {
 				e.printStackTrace();
 			}
+		}
 	}
+
+	@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, -2,
+				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..7b4ecef 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,11 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.cdt;
 
+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;
@@ -29,7 +32,8 @@
  * Handler to allow tracing to and from elements of C such as files and
  * functions. Uses CDT as the foundation.
  * </p>
- * This handler encodes a locator to the C element in artifact URI:s in the following way:
+ * This handler encodes a locator to the C element in artifact URI:s in the
+ * following way:
  * {@code platform:/Project_name/path/to/file.c#classOrStructName/memberName}
  * <p/>
  * {@code platform:/Project_name/path/to/file.c#functionClassOrStructName}.
@@ -39,25 +43,25 @@
 	@Override
 	public EObject createWrapper(ICElement element, EObject artifactModel) {
 		ICompositeType type = (ICompositeType) element.getParent().getAncestor(ICElement.C_CLASS);
-		if (type == null) type = (ICompositeType) element.getParent().getAncestor(ICElement.C_STRUCT);
-		if (type == null) type = (ICompositeType) element.getParent().getAncestor(ICElement.C_UNION);
-		
+		if (type == null)
+			type = (ICompositeType) element.getParent().getAncestor(ICElement.C_STRUCT);
+		if (type == null)
+			type = (ICompositeType) element.getParent().getAncestor(ICElement.C_UNION);
+
 		// TODO: Will this be unique? I don't know.
 		String typePrefix = type == null ? "" : type.getName() + "/";
 
-		// TODO: This does not take C++ function overloading on argument types into account when
+		// TODO: This does not take C++ function overloading on argument types
+		// into account when
 		// constructing the URI
-		String uri = new URIBuilder()
-			.setScheme("platform")
-			.setPath("/resource" + element.getPath())
-			.setFragment(typePrefix + element.getElementName())
-			.toString();
+		String uri = new URIBuilder().setScheme("platform").setPath("/resource" + element.getPath())
+				.setFragment(typePrefix + element.getElementName()).toString();
 
-			ArtifactMetaModelAdapter adapter = ExtensionPointHelper.getArtifactWrapperMetaModelAdapter().get();
-			EObject wrapper = adapter.createArtifact(artifactModel, this.getClass().getName(),
-					uri, element.getHandleIdentifier(), element.getElementName(), element.getPath().toString());
+		ArtifactMetaModelAdapter adapter = ExtensionPointHelper.getArtifactWrapperMetaModelAdapter().get();
+		EObject wrapper = adapter.createArtifact(artifactModel, this.getClass().getName(), uri,
+				element.getHandleIdentifier(), element.getElementName(), element.getPath().toString());
 
-			return wrapper;
+		return wrapper;
 	}
 
 	@Override
@@ -74,11 +78,12 @@
 	@Override
 	public void annotateArtifact(EObject wrapper, String annotation) throws AnnotationException {
 		IEclipsePreferences preferences = CDTPreferences.getPreferences();
-		
-		if (!preferences.getBoolean(CDTPreferences.ANNOTATE_CDT, CDTPreferences.ANNOTATE_CDT_DEFAULT)) return;
-		
+
+		if (!preferences.getBoolean(CDTPreferences.ANNOTATE_CDT, CDTPreferences.ANNOTATE_CDT_DEFAULT))
+			return;
+
 		ICElement handle = resolveWrapper(wrapper);
-		
+
 		try {
 			CDTAnnotate.annotateArtifact(handle, annotation);
 		} catch (CoreException e) {
@@ -90,4 +95,17 @@
 	public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
 		return null;
 	}
+
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			List<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel) {
+		// TODO Auto-generated method stub
+		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..bf16912 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,9 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.emf;
 
+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 +42,17 @@
 	public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
 		return null;
 	}
+
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			List<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel) {
+		// TODO Auto-generated method stub
+		return false;
+	}
 }
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..c2c8a8c 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,13 +10,16 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.file;
 
+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;
+import org.eclipse.core.resources.IResourceDelta;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.Path;
-import org.eclipse.core.resources.IResourceDelta;
 import org.eclipse.emf.ecore.EObject;
 
 /**
@@ -52,4 +55,17 @@
 				+ " has been changed. Please check if associated trace links are still valid.";
 	}
 
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			List<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel) {
+		// TODO Auto-generated method stub
+		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 2341959..3f8b51d 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,9 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.gef;
 
+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 +45,17 @@
 	public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
 		return null;
 	}
+
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			List<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel) {
+		// TODO Auto-generated method stub
+		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..85668e3 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,10 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.hudson;
 
+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;
@@ -18,8 +21,8 @@
 import org.eclipse.mylyn.builds.internal.core.BuildElement;
 
 /**
- * A handler to allow tracing to and from build elements handled by the continuous
- * integration server Hudson via the integrated Mylyn facilities.
+ * A handler to allow tracing to and from build elements handled by the
+ * continuous integration server Hudson via the integrated Mylyn facilities.
  */
 public class BuildElementHandler extends AbstractArtifactHandler<BuildElement> {
 
@@ -48,4 +51,17 @@
 		return null;
 	}
 
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			List<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel) {
+		// TODO Auto-generated method stub
+		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..abd8fbc 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,10 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.hudson;
 
+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;
@@ -18,8 +21,8 @@
 import org.eclipse.mylyn.builds.internal.core.TestElement;
 
 /**
- * A handler to allow tracing to and from test elements handled by the continuous
- * integration server Hudson via the integrated Mylyn facilities.
+ * A handler to allow tracing to and from test elements handled by the
+ * continuous integration server Hudson via the integrated Mylyn facilities.
  */
 public class TestElementHandler extends AbstractArtifactHandler<TestElement> {
 
@@ -49,4 +52,17 @@
 		return null;
 	}
 
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			List<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel) {
+		// TODO Auto-generated method stub
+		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..aa8f826 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,12 @@
 
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
+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;
@@ -38,7 +40,8 @@
  * A handler to allow creating traces to and from java elements such as classes
  * and methods based on JDT.
  * </p>
- * This handler encodes a locator to the Java element in artifact URI:s in the following way:
+ * This handler encodes a locator to the Java element in artifact URI:s in the
+ * following way:
  * {@code platform:/Project_name/path/to/file.java#com.pack.ClassName/methodName}.
  */
 public class JavaElementHandler extends AbstractArtifactHandler<IJavaElement> implements IAnnotateArtifact {
@@ -46,34 +49,32 @@
 	@Override
 	public EObject createWrapper(IJavaElement element, EObject artifactModel) {
 		IType type = (IType) element.getParent().getAncestor(IJavaElement.TYPE);
-		
+
 		String fragment;
 		if (type == null) {
 			if (element.getElementType() == IJavaElement.TYPE) {
 				// Top level classes get their fully qualified name
 				fragment = ((IType) element).getFullyQualifiedName();
 			} else {
-				// This will probably never happen, if something doesn't 
+				// This will probably never happen, if something doesn't
 				// have a type ancestor it is always a type itself
 				fragment = element.getElementName();
 			}
 		} else {
-			// Case for members: A list of '/' separated type names, followed by a member name
+			// Case for members: A list of '/' separated type names, followed by
+			// a member name
 			fragment = type.getFullyQualifiedName().replaceAll("\\$", "/") + "/" + element.getElementName();
 		}
-		
-		URIBuilder uriBuilder = new URIBuilder()
-			.setScheme("platform")
-			.setPath("/resource" + element.getPath())
-			.setFragment(fragment);
+
+		URIBuilder uriBuilder = new URIBuilder().setScheme("platform").setPath("/resource" + element.getPath())
+				.setFragment(fragment);
 
 		ArtifactMetaModelAdapter adapter = ExtensionPointHelper.getArtifactWrapperMetaModelAdapter().get();
 
 		String displayName = (type == null ? "" : (type.getElementName() + ".")) + element.getElementName();
-		
-		EObject wrapper = adapter.createArtifact(artifactModel, this.getClass().getName(), 
-			uriBuilder.toString(), element.getHandleIdentifier(), 
-			displayName,  element.getPath().toString());
+
+		EObject wrapper = adapter.createArtifact(artifactModel, this.getClass().getName(), uriBuilder.toString(),
+				element.getHandleIdentifier(), displayName, element.getPath().toString());
 
 		return wrapper;
 	}
@@ -156,4 +157,17 @@
 
 		return message;
 	}
+
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			List<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel) {
+		// TODO Auto-generated method stub
+		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..797ed22 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,10 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.mylyn;
 
+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 +48,17 @@
 	public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
 		return null;
 	}
+
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			List<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel) {
+		// TODO Auto-generated method stub
+		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..e2933b6 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,10 @@
 
 package org.eclipse.capra.handler.office;
 
+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 +60,17 @@
 		return null;
 	}
 
-	
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			List<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel) {
+		// TODO Auto-generated method stub
+		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..b5fcffe 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,9 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.papyrus;
 
+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;
@@ -22,7 +25,6 @@
  */
 public class PapyrusHandler extends AbstractArtifactHandler<EObjectTreeElement> {
 
-
 	@Override
 	public EObject createWrapper(EObjectTreeElement artifact, EObject artifactModel) {
 		// Returns the EObject corresponding to the input object if the input is
@@ -40,10 +42,23 @@
 		EObject sel = EMFHelper.getEObject(artifact);
 		return org.eclipse.capra.core.helpers.EMFHelper.getIdentifier(sel); // TODO
 	}
-	
+
 	@Override
 	public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
 		return null;
 	}
 
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			List<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel) {
+		// TODO Auto-generated method stub
+		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..f819447 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,9 @@
 package org.eclipse.capra.handler.php;
 
+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 +39,17 @@
 		return null;
 	}
 
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			List<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel) {
+		// TODO Auto-generated method stub
+		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..18b1006 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,9 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.reqif;
 
+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 +43,17 @@
 	public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
 		return null;
 	}
+
+	@Override
+	public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+			List<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel) {
+		// TODO Auto-generated method stub
+		return false;
+	}
 }
diff --git a/org.eclipse.capra.releng.target/org.eclipse.capra.releng.target.target b/org.eclipse.capra.releng.target/org.eclipse.capra.releng.target.target
index dcae9e4..18f362d 100644
--- a/org.eclipse.capra.releng.target/org.eclipse.capra.releng.target.target
+++ b/org.eclipse.capra.releng.target/org.eclipse.capra.releng.target.target
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?pde version="3.8"?><target name="Neon" sequenceNumber="52">
+<?pde version="3.8"?><target name="Neon" sequenceNumber="53">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="net.sourceforge.plantuml.feature.feature.group" version="0.0.0"/>
@@ -31,13 +31,7 @@
 </location>
 <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.php.feature.group" version="4.2.0.201611142355"/>
-<unit id="org.eclipse.mylyn.github.feature.feature.group" version="0.0.0"/>
 <repository location="http://download.eclipse.org/releases/neon"/>
-<repository location="http://download.eclipse.org/egit/github/updates/"/>
-</location>
-<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eclipse.mylyn.github.feature.feature.group" version="0.0.0"/>
-<repository location="http://download.eclipse.org/egit/github/updates/"/>
 </location>
 <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.apache.poi.ooxml" version="3.9.0.v201405241905"/>
@@ -55,18 +49,14 @@
 <unit id="org.eclipse.mylyn.ide_feature.feature.group" version="3.21.0.v20160912-1820"/>
 <unit id="org.eclipse.gef.sdk.feature.group" version="3.11.0.201606061308"/>
 <unit id="org.eclipse.cdt.testsrunner.feature.feature.group" version="9.2.0.201612061315"/>
-<unit id="org.eclipse.mylyn.git.feature.group" version="1.13.0.v20160630-2022"/>
 <unit id="org.eclipse.emf.emfstore.sdk.feature.feature.group" version="1.8.1.v20161125-1451"/>
-<unit id="org.eclipse.mylyn.wikitext_feature.feature.group" version="2.10.1.v20161129-1925"/>
 <unit id="org.eclipse.emf.ecp.emfforms.sdk.feature.feature.group" version="1.11.0.20161205-1431"/>
 <unit id="org.eclipse.papyrus.sdk.feature.feature.group" version="2.0.2.201612071107"/>
 <unit id="org.eclipse.cdt.sdk.feature.group" version="9.2.0.201612061315"/>
 <unit id="org.eclipse.emf.compare.ide.ui.feature.group" version="3.2.1.201608311750"/>
 <unit id="org.eclipse.mylyn_feature.feature.group" version="3.21.0.v20160914-0252"/>
-<unit id="org.eclipse.cdt.mylyn.feature.group" version="5.17.0.v20160701-1337"/>
 <unit id="org.eclipse.mylyn.hudson.feature.group" version="1.13.0.v20160806-1446"/>
 <unit id="org.eclipse.emf.sdk.feature.group" version="2.12.0.v20160526-0356"/>
-<unit id="org.eclipse.mylyn.team_feature.feature.group" version="3.21.0.v20160701-1337"/>
 <unit id="org.eclipse.xtext.sdk.feature.group" version="2.10.0.v201605250459"/>
 <unit id="org.eclipse.zest.sdk.feature.group" version="1.7.0.201606061308"/>
 <unit id="org.eclipse.mylyn.trac_feature.feature.group" version="3.21.0.v20160630-2019"/>
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..e11a6fe 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\t\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.\t\n" + "AA : EClass |\n.|\nX|\n.\t\n"
+			+ "modelA : EPackage |\n.|\n.|\nX\t\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.\t\n" + "B : EClass |\nX|\n.|\n.|\n.\t\n"
+			+ "AA : EClass |\n.|\n.|\n.|\nX\t\n" + "BB : EClass |\n.|\n.|\nX|\n.\t\n" + "}\n" + "\n" + "@enduml\n";
 
 	@Before
 	public void init() throws CoreException {
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..3ba52f7 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..f984179 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..c2020b1 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) {
@@ -55,6 +56,7 @@
                   }
                 }
               }
+              _builder.append("\t");
               _builder.newLineIfNotEmpty();
             }
           }
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());