Bug 565945: update license headers, multiple fixes to dependencies

Change-Id: I5e4d4aed1f0d1ae8e1f4a069654cb5544b443d30
diff --git a/plugins/org.eclipse.skills.dependencies/META-INF/MANIFEST.MF b/plugins/org.eclipse.skills.dependencies/META-INF/MANIFEST.MF
index b92030d..e0af312 100644
--- a/plugins/org.eclipse.skills.dependencies/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.skills.dependencies/META-INF/MANIFEST.MF
@@ -16,4 +16,6 @@
  org.eclipse.core.resources,
  org.eclipse.debug.ui,
  org.eclipse.e4.core.services,
- org.eclipse.osgi.services
+ org.eclipse.osgi.services,
+ org.eclipse.text
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/BrokerEventDependency.java b/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/BrokerEventDependency.java
index 546a06a..865156b 100644
--- a/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/BrokerEventDependency.java
+++ b/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/BrokerEventDependency.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/ConsolePatternDependency.java b/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/ConsolePatternDependency.java
index 3224245..c7fc45d 100644
--- a/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/ConsolePatternDependency.java
+++ b/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/ConsolePatternDependency.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
@@ -11,54 +13,54 @@
 
 package org.eclipse.skills.dependencies;
 
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocumentListener;
 import org.eclipse.skills.model.IDependencyWithAttributes;
 import org.eclipse.skills.model.impl.MDependency;
 import org.eclipse.ui.console.ConsolePlugin;
 import org.eclipse.ui.console.IConsole;
 import org.eclipse.ui.console.IConsoleListener;
-import org.eclipse.ui.console.IPatternMatchListener;
-import org.eclipse.ui.console.PatternMatchEvent;
 import org.eclipse.ui.console.TextConsole;
 
-public class ConsolePatternDependency extends MDependency implements IDependencyWithAttributes, IConsoleListener, IPatternMatchListener {
+public class ConsolePatternDependency extends MDependency implements IDependencyWithAttributes, IConsoleListener, IDocumentListener {
 
-	private String fOutputPattern;
+	private String fOutputPattern = "<none>";
 
 	@Override
 	public void setAttributes(String attributes) {
 		fOutputPattern = attributes;
 	}
 
+	public String getPattern() {
+		return fOutputPattern;
+	}
+
 	@Override
 	public void activate() {
 		ConsolePlugin.getDefault().getConsoleManager().addConsoleListener(this);
 
-		for (final IConsole console : ConsolePlugin.getDefault().getConsoleManager().getConsoles()) {
-			if (console instanceof TextConsole)
-				((TextConsole) console).addPatternMatchListener(this);
-		}
+		consolesAdded(ConsolePlugin.getDefault().getConsoleManager().getConsoles());
 	}
 
 	@Override
 	public void deactivate() {
-		ConsolePlugin.getDefault().getConsoleManager().removeConsoleListener(this);
+		consolesRemoved(ConsolePlugin.getDefault().getConsoleManager().getConsoles());
 
-		for (final IConsole console : ConsolePlugin.getDefault().getConsoleManager().getConsoles()) {
-			if (console instanceof TextConsole)
-				((TextConsole) console).removePatternMatchListener(this);
-		}
+		ConsolePlugin.getDefault().getConsoleManager().removeConsoleListener(this);
 	}
 
 	@Override
 	public String toString() {
-		return "Console contains \"" + getPattern() + "\"";
+		return "Console contains \"" + fOutputPattern + "\"";
 	}
 
 	@Override
 	public void consolesAdded(IConsole[] consoles) {
 		for (final IConsole console : consoles) {
 			if (console instanceof TextConsole)
-				((TextConsole) console).addPatternMatchListener(this);
+				((TextConsole) console).getDocument().addDocumentListener(this);
 		}
 	}
 
@@ -66,39 +68,22 @@
 	public void consolesRemoved(IConsole[] consoles) {
 		for (final IConsole console : consoles) {
 			if (console instanceof TextConsole)
-				((TextConsole) console).removePatternMatchListener(this);
+				((TextConsole) console).getDocument().removeDocumentListener(this);
 		}
 	}
 
 	@Override
-	public void matchFound(PatternMatchEvent event) {
-		setFulfilled(true);
-
-		deactivate();
-	}
-
-	@Override
-	public String getPattern() {
-		return fOutputPattern;
-	}
-
-	@Override
-	public int getCompilerFlags() {
-		return 0;
-	}
-
-	@Override
-	public String getLineQualifier() {
-		return null;
-	}
-
-	@Override
-	public void connect(TextConsole console) {
+	public void documentAboutToBeChanged(DocumentEvent event) {
 		// nothing to do
 	}
 
 	@Override
-	public void disconnect() {
-		// nothing to do
+	public void documentChanged(DocumentEvent event) {
+		final Pattern pattern = Pattern.compile(getPattern(), Pattern.DOTALL | Pattern.MULTILINE);
+
+		if (pattern.matcher(event.getText()).find()) {
+			setFulfilled(true);
+			deactivate();
+		}
 	}
 }
diff --git a/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/DebugEventDependency.java b/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/DebugEventDependency.java
index 8cc85ac..9f4d418 100644
--- a/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/DebugEventDependency.java
+++ b/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/DebugEventDependency.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/P2Dependency.java b/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/P2Dependency.java
index a7f81e8..a95746c 100644
--- a/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/P2Dependency.java
+++ b/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/P2Dependency.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/PerspectiveDependency.java b/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/PerspectiveDependency.java
index 03f4cb1..7b1e66f 100644
--- a/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/PerspectiveDependency.java
+++ b/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/PerspectiveDependency.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/ResourceExistsDependency.java b/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/ResourceExistsDependency.java
index 2532233..c876e00 100644
--- a/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/ResourceExistsDependency.java
+++ b/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/ResourceExistsDependency.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/ViewDependency.java b/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/ViewDependency.java
index ff650e7..94c1fd1 100644
--- a/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/ViewDependency.java
+++ b/plugins/org.eclipse.skills.dependencies/src/org/eclipse/skills/dependencies/ViewDependency.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills.ui.questeditor/plugin.properties b/plugins/org.eclipse.skills.ui.questeditor/plugin.properties
index 3ba7b30..89af73a 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/plugin.properties
+++ b/plugins/org.eclipse.skills.ui.questeditor/plugin.properties
Binary files differ
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/CompleteIncludedTasksDependencyItemProvider.java b/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/CompleteIncludedTasksDependencyItemProvider.java
index 4b9ba30..ec059d9 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/CompleteIncludedTasksDependencyItemProvider.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/CompleteIncludedTasksDependencyItemProvider.java
@@ -15,7 +15,7 @@
  *
  * @generated
  */
-public class CompleteIncludedTasksDependencyItemProvider extends DependencyItemProvider {
+public class CompleteIncludedTasksDependencyItemProvider extends UserDependencyItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/SkillDependencyItemProvider.java b/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/SkillDependencyItemProvider.java
index 8569f1a..3a59aed 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/SkillDependencyItemProvider.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/SkillDependencyItemProvider.java
@@ -19,7 +19,7 @@
  * <!-- begin-user-doc --> <!-- end-user-doc -->
  * @generated
  */
-public class SkillDependencyItemProvider extends DependencyItemProvider {
+public class SkillDependencyItemProvider extends UserDependencyItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/TaskDependencyItemProvider.java b/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/TaskDependencyItemProvider.java
index 8e9a1d3..9bfe131 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/TaskDependencyItemProvider.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/TaskDependencyItemProvider.java
@@ -19,7 +19,7 @@
  * <!-- begin-user-doc --> <!-- end-user-doc -->
  * @generated
  */
-public class TaskDependencyItemProvider extends DependencyItemProvider {
+public class TaskDependencyItemProvider extends UserDependencyItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/UserDependencyItemProvider.java b/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/UserDependencyItemProvider.java
new file mode 100644
index 0000000..ab28663
--- /dev/null
+++ b/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/UserDependencyItemProvider.java
@@ -0,0 +1,111 @@
+/**
+ */
+package org.eclipse.skills.model.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+
+import org.eclipse.skills.model.ISkillsPackage;
+import org.eclipse.skills.model.IUserDependency;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.skills.model.IUserDependency} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class UserDependencyItemProvider extends DependencyItemProvider {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public UserDependencyItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			addUserPropertyDescriptor(object);
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the User feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUserPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_UserDependency_user_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_UserDependency_user_feature", "_UI_UserDependency_type"),
+				 ISkillsPackage.Literals.USER_DEPENDENCY__USER,
+				 true,
+				 false,
+				 true,
+				 null,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getText(Object object) {
+		IUserDependency userDependency = (IUserDependency)object;
+		return getString("_UI_UserDependency_type") + " " + userDependency.isFulfilled();
+	}
+
+
+	/**
+	 * This handles model notifications by calling {@link #updateChildren} to update any cached
+	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		updateChildren(notification);
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+	 * that can be created under this object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+}
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/actions/ReplaceElementAction.java b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/actions/ReplaceElementAction.java
index 7026fba..e535f1b 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/actions/ReplaceElementAction.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/actions/ReplaceElementAction.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/actions/WrapElementAction.java b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/actions/WrapElementAction.java
index 9ac2a8c..358ae0e 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/actions/WrapElementAction.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/actions/WrapElementAction.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/editor/QuestEditor.java b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/editor/QuestEditor.java
index 563e484..af2b8cb 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/editor/QuestEditor.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/editor/QuestEditor.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
@@ -14,13 +16,4 @@
 import org.eclipse.emfforms.spi.editor.GenericEditor;
 
 public class QuestEditor extends GenericEditor {
-
-	// @Override
-	// protected TreeMasterDetailSWTBuilder customizeTree(TreeMasterDetailSWTBuilder builder) {
-	// final TreeMasterDetailSWTBuilder result = super.customizeTree(builder);
-	//
-	// // result.customizeContentProvider(getContentProvider());
-	//
-	// return result;
-	// }
 }
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/customdependencyid/CustomDependencyIdRenderer.java b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/customdependencyid/CustomDependencyIdRenderer.java
index 125df2f..c4c1551 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/customdependencyid/CustomDependencyIdRenderer.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/customdependencyid/CustomDependencyIdRenderer.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/customdependencyid/CustomDependencyIdRendererService.java b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/customdependencyid/CustomDependencyIdRendererService.java
index 65aeef4..cb62434 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/customdependencyid/CustomDependencyIdRendererService.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/customdependencyid/CustomDependencyIdRendererService.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlMenuProvider.java b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlMenuProvider.java
index c54ae33..e4e0345 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlMenuProvider.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlMenuProvider.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlRenderer.java b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlRenderer.java
index 996ed6c..ab6502d 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlRenderer.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlRenderer.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlSWTRendererService.java b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlSWTRendererService.java
index cf5e1d3..a9c4f31 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlSWTRendererService.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlSWTRendererService.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlTreeViewerBuilder.java b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlTreeViewerBuilder.java
index 6512a01..1ad834e 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlTreeViewerBuilder.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/renderers/dependencytree/DependencyControlTreeViewerBuilder.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/wizards/QuestCreationPage.java b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/wizards/QuestCreationPage.java
index 07f3706..9d3d178 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/wizards/QuestCreationPage.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src/org/eclipse/skills/ui/questeditor/wizards/QuestCreationPage.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/model/Skills.ecore b/plugins/org.eclipse.skills/model/Skills.ecore
index ab8d902..bddb11a 100644
--- a/plugins/org.eclipse.skills/model/Skills.ecore
+++ b/plugins/org.eclipse.skills/model/Skills.ecore
@@ -78,7 +78,7 @@
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="UserTask">
     <eOperations name="isCompleted" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-    <eOperations name="start"/>
+    <eOperations name="activate"/>
     <eOperations name="getUser" eType="#//User"/>
     <eOperations name="isStarted" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
     <eOperations name="revealNextHint"/>
@@ -139,13 +139,13 @@
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="SequenceDependency" eSuperTypes="#//AndDependency"/>
-  <eClassifiers xsi:type="ecore:EClass" name="CompleteIncludedTasksDependency" eSuperTypes="#//Dependency"/>
-  <eClassifiers xsi:type="ecore:EClass" name="TaskDependency" eSuperTypes="#//Dependency">
+  <eClassifiers xsi:type="ecore:EClass" name="CompleteIncludedTasksDependency" eSuperTypes="#//UserDependency"/>
+  <eClassifiers xsi:type="ecore:EClass" name="TaskDependency" eSuperTypes="#//UserDependency">
     <eStructuralFeatures xsi:type="ecore:EReference" name="task" lowerBound="1" eType="#//Task"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="completed" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
         defaultValueLiteral="true"/>
   </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SkillDependency" eSuperTypes="#//Dependency">
+  <eClassifiers xsi:type="ecore:EClass" name="SkillDependency" eSuperTypes="#//UserDependency">
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="minExperience" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
         defaultValueLiteral="0"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="minLevel" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
@@ -163,4 +163,8 @@
   <eClassifiers xsi:type="ecore:EDataType" name="CustomDependencyDefinition" instanceClassName="org.eclipse.skills.dependencies.CustomDependencyDefinition"/>
   <eClassifiers xsi:type="ecore:EDataType" name="ImageData" instanceClassName="org.eclipse.swt.graphics.ImageData"/>
   <eClassifiers xsi:type="ecore:EDataType" name="ISkillService" instanceClassName="org.eclipse.skills.service.ISkillService"/>
+  <eClassifiers xsi:type="ecore:EClass" name="UserDependency" abstract="true" eSuperTypes="#//Dependency">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="user" ordered="false" unique="false"
+        eType="#//User" transient="true" resolveProxies="false"/>
+  </eClassifiers>
 </ecore:EPackage>
diff --git a/plugins/org.eclipse.skills/model/Skills.genmodel b/plugins/org.eclipse.skills/model/Skills.genmodel
index 33b64cf..4b57830 100644
--- a/plugins/org.eclipse.skills/model/Skills.genmodel
+++ b/plugins/org.eclipse.skills/model/Skills.genmodel
@@ -81,7 +81,7 @@
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Skills.ecore#//UserTask/hintsDisplayed"/>
       <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EAttribute Skills.ecore#//UserTask/added"/>
       <genOperations ecoreOperation="Skills.ecore#//UserTask/isCompleted"/>
-      <genOperations ecoreOperation="Skills.ecore#//UserTask/start"/>
+      <genOperations ecoreOperation="Skills.ecore#//UserTask/activate"/>
       <genOperations ecoreOperation="Skills.ecore#//UserTask/getUser"/>
       <genOperations ecoreOperation="Skills.ecore#//UserTask/isStarted"/>
       <genOperations ecoreOperation="Skills.ecore#//UserTask/revealNextHint"/>
@@ -140,5 +140,8 @@
     <genClasses ecoreClass="Skills.ecore#//Hint">
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Skills.ecore#//Hint/penalty"/>
     </genClasses>
+    <genClasses image="false" ecoreClass="Skills.ecore#//UserDependency">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference Skills.ecore#//UserDependency/user"/>
+    </genClasses>
   </genPackages>
 </genmodel:GenModel>
diff --git a/plugins/org.eclipse.skills/model/model.aird b/plugins/org.eclipse.skills/model/model.aird
index 993c3b5..1b43e63 100644
--- a/plugins/org.eclipse.skills/model/model.aird
+++ b/plugins/org.eclipse.skills/model/model.aird
@@ -5,7 +5,7 @@
     <semanticResources>http://eclipse.org/skills/1.0.0</semanticResources>
     <ownedViews xmi:type="viewpoint:DView" uid="_m68ZsEwrEeqwHIzbUoB2lQ">
       <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/>
-      <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_n6l40EwrEeqwHIzbUoB2lQ" name="Skills Model" repPath="#_n4mUwEwrEeqwHIzbUoB2lQ" changeId="9e581a98-8d1c-493f-82dd-9861344c7653">
+      <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_n6l40EwrEeqwHIzbUoB2lQ" name="Skills Model" repPath="#_n4mUwEwrEeqwHIzbUoB2lQ" changeId="e88e0352-ff69-44a5-8b9c-3b81539aca3b">
         <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
         <target xmi:type="ecore:EPackage" href="Skills.ecore#/"/>
       </ownedRepresentationDescriptors>
@@ -406,7 +406,7 @@
             <styles xmi:type="notation:FilteringStyle" xmi:id="_rIjn-drpEeq_CZJuNlb8eA"/>
           </children>
           <styles xmi:type="notation:ShapeStyle" xmi:id="_rIjn9NrpEeq_CZJuNlb8eA" fontName="Cantarell" fontHeight="8"/>
-          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rIjn9drpEeq_CZJuNlb8eA" x="2140" y="685"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rIjn9drpEeq_CZJuNlb8eA" x="1683" y="685"/>
         </children>
         <children xmi:type="notation:Node" xmi:id="_rIjn-trpEeq_CZJuNlb8eA" type="2003" element="_rG8eYNrpEeq_CZJuNlb8eA">
           <children xmi:type="notation:Node" xmi:id="_rIkPANrpEeq_CZJuNlb8eA" type="5007"/>
@@ -437,7 +437,7 @@
             <styles xmi:type="notation:FilteringStyle" xmi:id="_YI-pdtryEeq_CZJuNlb8eA"/>
           </children>
           <styles xmi:type="notation:ShapeStyle" xmi:id="_YI-pcdryEeq_CZJuNlb8eA" fontName="Cantarell" fontHeight="8"/>
-          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_YI-pctryEeq_CZJuNlb8eA" x="1710" y="685" width="215" height="100"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_YI-pctryEeq_CZJuNlb8eA" x="2315" y="820" width="215" height="100"/>
         </children>
         <children xmi:type="notation:Node" xmi:id="_sfpyMNrzEeq_CZJuNlb8eA" type="2003" element="_sfdk8NrzEeq_CZJuNlb8eA">
           <children xmi:type="notation:Node" xmi:id="_sfpyM9rzEeq_CZJuNlb8eA" type="5007"/>
@@ -450,7 +450,7 @@
             <styles xmi:type="notation:FilteringStyle" xmi:id="_sfpyNtrzEeq_CZJuNlb8eA"/>
           </children>
           <styles xmi:type="notation:ShapeStyle" xmi:id="_sfpyMdrzEeq_CZJuNlb8eA" fontName="Cantarell" fontHeight="8"/>
-          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sfpyMtrzEeq_CZJuNlb8eA" x="2420" y="685" width="120" height="100"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sfpyMtrzEeq_CZJuNlb8eA" x="2565" y="820" width="120" height="100"/>
         </children>
         <children xmi:type="notation:Node" xmi:id="_S_lQQNr-Eeq_nvF5tuZorw" type="2003" element="_S--MQNr-Eeq_nvF5tuZorw">
           <children xmi:type="notation:Node" xmi:id="_S_qv0Nr-Eeq_nvF5tuZorw" type="5007"/>
@@ -467,7 +467,7 @@
             <styles xmi:type="notation:FilteringStyle" xmi:id="_S_qv09r-Eeq_nvF5tuZorw"/>
           </children>
           <styles xmi:type="notation:ShapeStyle" xmi:id="_S_lQQdr-Eeq_nvF5tuZorw" fontName="Cantarell" fontHeight="8"/>
-          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_S_lQQtr-Eeq_nvF5tuZorw" x="1940" y="685" width="158" height="100"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_S_lQQtr-Eeq_nvF5tuZorw" x="2115" y="820" width="158" height="100"/>
         </children>
         <children xmi:type="notation:Node" xmi:id="_0ndn8NvREeqxZK-wtN_0Nw" type="2003" element="_0msy8NvREeqxZK-wtN_0Nw">
           <children xmi:type="notation:Node" xmi:id="_0njHgNvREeqxZK-wtN_0Nw" type="5007"/>
@@ -510,7 +510,7 @@
             <styles xmi:type="notation:FilteringStyle" xmi:id="_gWUZsuBVEeq6k6a2XVHNwA"/>
           </children>
           <styles xmi:type="notation:ShapeStyle" xmi:id="_gWTLkeBVEeq6k6a2XVHNwA" fontName="Segoe UI" fontHeight="8"/>
-          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gWTLkuBVEeq6k6a2XVHNwA" x="2195" y="870" width="328" height="58"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gWTLkuBVEeq6k6a2XVHNwA" x="1720" y="810" width="328" height="58"/>
         </children>
         <children xmi:type="notation:Node" xmi:id="_O6AGMOYbEeqiRLW56LILnw" type="2003" element="_O5dToOYbEeqiRLW56LILnw">
           <children xmi:type="notation:Node" xmi:id="_O6DwkOYbEeqiRLW56LILnw" type="5007"/>
@@ -523,7 +523,7 @@
             <styles xmi:type="notation:FilteringStyle" xmi:id="_O6EXouYbEeqiRLW56LILnw"/>
           </children>
           <styles xmi:type="notation:ShapeStyle" xmi:id="_O6AGMeYbEeqiRLW56LILnw" fontName="Cantarell" fontHeight="8"/>
-          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_O6AGMuYbEeqiRLW56LILnw" x="331" y="20" width="202" height="50"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_O6AGMuYbEeqiRLW56LILnw" x="365" y="20" width="202" height="50"/>
         </children>
         <children xmi:type="notation:Node" xmi:id="_MREc8PEPEeqJFZP0_BSppg" type="2003" element="_MQbjwPEPEeqJFZP0_BSppg">
           <children xmi:type="notation:Node" xmi:id="_MRJ8gPEPEeqJFZP0_BSppg" type="5007"/>
@@ -538,6 +538,15 @@
           <styles xmi:type="notation:ShapeStyle" xmi:id="_MREc8fEPEeqJFZP0_BSppg" fontName="Cantarell" fontHeight="8"/>
           <layoutConstraint xmi:type="notation:Bounds" xmi:id="_MREc8vEPEeqJFZP0_BSppg" x="1367" y="192" width="241" height="52"/>
         </children>
+        <children xmi:type="notation:Node" xmi:id="_Jku50PHQEeqBSeAPWoKPJw" type="2003" element="_Jkcl8PHQEeqBSeAPWoKPJw">
+          <children xmi:type="notation:Node" xmi:id="_Jkvg4PHQEeqBSeAPWoKPJw" type="5007"/>
+          <children xmi:type="notation:Node" xmi:id="_Jkvg4fHQEeqBSeAPWoKPJw" type="7004">
+            <styles xmi:type="notation:SortingStyle" xmi:id="_Jkvg4vHQEeqBSeAPWoKPJw"/>
+            <styles xmi:type="notation:FilteringStyle" xmi:id="_Jkvg4_HQEeqBSeAPWoKPJw"/>
+          </children>
+          <styles xmi:type="notation:ShapeStyle" xmi:id="_Jku50fHQEeqBSeAPWoKPJw" fontName="Cantarell" fontHeight="8"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Jku50vHQEeqBSeAPWoKPJw" x="2184" y="685" width="120" height="100"/>
+        </children>
         <styles xmi:type="notation:DiagramStyle" xmi:id="_n6t0okwrEeqwHIzbUoB2lQ"/>
         <edges xmi:type="notation:Edge" xmi:id="_rIxDUNrpEeq_CZJuNlb8eA" type="4001" element="_rHvIkNrpEeq_CZJuNlb8eA" source="_rIUXYNrpEeq_CZJuNlb8eA" target="_rIaeANrpEeq_CZJuNlb8eA">
           <children xmi:type="notation:Node" xmi:id="_rIyRcNrpEeq_CZJuNlb8eA" type="6001">
@@ -781,17 +790,17 @@
         </edges>
         <edges xmi:type="notation:Edge" xmi:id="_rJElUtrpEeq_CZJuNlb8eA" type="4001" element="_rIDRoNrpEeq_CZJuNlb8eA" source="_rIjn89rpEeq_CZJuNlb8eA" target="_rIevd9rpEeq_CZJuNlb8eA">
           <children xmi:type="notation:Node" xmi:id="_rJElVtrpEeq_CZJuNlb8eA" type="6001">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rJElV9rpEeq_CZJuNlb8eA" x="-284" y="-74"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rJElV9rpEeq_CZJuNlb8eA" x="-56" y="-74"/>
           </children>
           <children xmi:type="notation:Node" xmi:id="_rJElWNrpEeq_CZJuNlb8eA" type="6002">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rJElWdrpEeq_CZJuNlb8eA" x="-101" y="10"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rJElWdrpEeq_CZJuNlb8eA" x="-32" y="10"/>
           </children>
           <children xmi:type="notation:Node" xmi:id="_rJElWtrpEeq_CZJuNlb8eA" type="6003">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rJElW9rpEeq_CZJuNlb8eA" x="124" y="-10"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rJElW9rpEeq_CZJuNlb8eA" x="55" y="-10"/>
           </children>
           <styles xmi:type="notation:ConnectorStyle" xmi:id="_rJElU9rpEeq_CZJuNlb8eA" routing="Rectilinear"/>
           <styles xmi:type="notation:FontStyle" xmi:id="_rJElVNrpEeq_CZJuNlb8eA" fontColor="7490599" fontName="Cantarell" fontHeight="8"/>
-          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_rJElVdrpEeq_CZJuNlb8eA" points="[40, -49, 773, 136]$[40, -177, 773, 8]$[-658, -177, 75, 8]"/>
+          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_rJElVdrpEeq_CZJuNlb8eA" points="[15, -49, 341, 136]$[15, -177, 341, 8]$[-249, -177, 77, 8]"/>
           <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_rJElXNrpEeq_CZJuNlb8eA" id="(0.5,0.5)"/>
           <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_rJElXdrpEeq_CZJuNlb8eA" id="(0.5,0.5)"/>
         </edges>
@@ -987,70 +996,22 @@
           <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_sW9p5trrEeq_CZJuNlb8eA" id="(1.0,0.13761467889908258)"/>
           <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_sW9p59rrEeq_CZJuNlb8eA" id="(0.2542372881355932,0.0)"/>
         </edges>
-        <edges xmi:type="notation:Edge" xmi:id="_d7LRkNryEeq_CZJuNlb8eA" type="4001" element="_d6_rctryEeq_CZJuNlb8eA" source="_YI-pcNryEeq_CZJuNlb8eA" target="_rIevd9rpEeq_CZJuNlb8eA">
-          <children xmi:type="notation:Node" xmi:id="_d7LRlNryEeq_CZJuNlb8eA" type="6001">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_d7LRldryEeq_CZJuNlb8eA" y="-10"/>
-          </children>
-          <children xmi:type="notation:Node" xmi:id="_d7LRltryEeq_CZJuNlb8eA" type="6002">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_d7LRl9ryEeq_CZJuNlb8eA" y="10"/>
-          </children>
-          <children xmi:type="notation:Node" xmi:id="_d7LRmNryEeq_CZJuNlb8eA" type="6003">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_d7LRmdryEeq_CZJuNlb8eA" y="10"/>
-          </children>
-          <styles xmi:type="notation:ConnectorStyle" xmi:id="_d7LRkdryEeq_CZJuNlb8eA" routing="Tree"/>
-          <styles xmi:type="notation:FontStyle" xmi:id="_d7LRktryEeq_CZJuNlb8eA" fontName="Cantarell" fontHeight="8"/>
-          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_d7LRk9ryEeq_CZJuNlb8eA" points="[0, 0, 297, 166]$[-297, -166, 0, 0]"/>
-          <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_d7LRmtryEeq_CZJuNlb8eA" id="(0.704225352112676,0.0)"/>
-          <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_d7LRm9ryEeq_CZJuNlb8eA" id="(0.5,0.5)"/>
-        </edges>
         <edges xmi:type="notation:Edge" xmi:id="_v_kOoNrzEeq_CZJuNlb8eA" type="4001" element="_v_ZPldrzEeq_CZJuNlb8eA" source="_sfpyMNrzEeq_CZJuNlb8eA" target="_rIUXYNrpEeq_CZJuNlb8eA">
           <children xmi:type="notation:Node" xmi:id="_v_kOpNrzEeq_CZJuNlb8eA" type="6001">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v_kOpdrzEeq_CZJuNlb8eA" x="140" y="-10"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v_kOpdrzEeq_CZJuNlb8eA" x="280" y="-10"/>
           </children>
           <children xmi:type="notation:Node" xmi:id="_v_kOptrzEeq_CZJuNlb8eA" type="6002">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v_kOp9rzEeq_CZJuNlb8eA" x="-42" y="10"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v_kOp9rzEeq_CZJuNlb8eA" x="51" y="10"/>
           </children>
           <children xmi:type="notation:Node" xmi:id="_v_kOqNrzEeq_CZJuNlb8eA" type="6003">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v_kOqdrzEeq_CZJuNlb8eA" x="42" y="10"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v_kOqdrzEeq_CZJuNlb8eA" x="84" y="10"/>
           </children>
           <styles xmi:type="notation:ConnectorStyle" xmi:id="_v_kOodrzEeq_CZJuNlb8eA" routing="Rectilinear"/>
           <styles xmi:type="notation:FontStyle" xmi:id="_v_kOotrzEeq_CZJuNlb8eA" fontColor="7490599" fontName="Cantarell" fontHeight="8"/>
-          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_v_kOo9rzEeq_CZJuNlb8eA" points="[0, 0, 1109, 350]$[0, -310, 1109, 40]$[-1109, -310, 0, 40]"/>
+          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_v_kOo9rzEeq_CZJuNlb8eA" points="[8, 0, 1246, 483]$[8, -444, 1246, 39]$[-1238, -444, 0, 39]"/>
           <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_v_kOqtrzEeq_CZJuNlb8eA" id="(0.6779661016949152,0.0)"/>
           <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_v_kOq9rzEeq_CZJuNlb8eA" id="(1.0,0.20408163265306123)"/>
         </edges>
-        <edges xmi:type="notation:Edge" xmi:id="_v9tYANr0Eeq_CZJuNlb8eA" type="4001" element="_v9hK3tr0Eeq_CZJuNlb8eA" source="_sfpyMNrzEeq_CZJuNlb8eA" target="_rIevd9rpEeq_CZJuNlb8eA">
-          <children xmi:type="notation:Node" xmi:id="_v9tYBNr0Eeq_CZJuNlb8eA" type="6001">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v9tYBdr0Eeq_CZJuNlb8eA" y="-10"/>
-          </children>
-          <children xmi:type="notation:Node" xmi:id="_v9tYBtr0Eeq_CZJuNlb8eA" type="6002">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v9tYB9r0Eeq_CZJuNlb8eA" y="10"/>
-          </children>
-          <children xmi:type="notation:Node" xmi:id="_v9tYCNr0Eeq_CZJuNlb8eA" type="6003">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v9tYCdr0Eeq_CZJuNlb8eA" y="10"/>
-          </children>
-          <styles xmi:type="notation:ConnectorStyle" xmi:id="_v9tYAdr0Eeq_CZJuNlb8eA" routing="Tree"/>
-          <styles xmi:type="notation:FontStyle" xmi:id="_v9tYAtr0Eeq_CZJuNlb8eA" fontName="Cantarell" fontHeight="8"/>
-          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_v9tYA9r0Eeq_CZJuNlb8eA" points="[0, 0, 709, 136]$[0, -69, 709, 67]$[-708, -69, 1, 67]$[-708, -87, 1, 49]"/>
-          <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_v9tYCtr0Eeq_CZJuNlb8eA" id="(0.635593220338983,0.0)"/>
-          <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_v9tYC9r0Eeq_CZJuNlb8eA" id="(0.5,0.5)"/>
-        </edges>
-        <edges xmi:type="notation:Edge" xmi:id="_YJeiQNr-Eeq_nvF5tuZorw" type="4001" element="_YJBPQNr-Eeq_nvF5tuZorw" source="_S_lQQNr-Eeq_nvF5tuZorw" target="_rIevd9rpEeq_CZJuNlb8eA">
-          <children xmi:type="notation:Node" xmi:id="_YJfwYNr-Eeq_nvF5tuZorw" type="6001">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_YJfwYdr-Eeq_nvF5tuZorw" y="-10"/>
-          </children>
-          <children xmi:type="notation:Node" xmi:id="_YJgXcNr-Eeq_nvF5tuZorw" type="6002">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_YJgXcdr-Eeq_nvF5tuZorw" y="10"/>
-          </children>
-          <children xmi:type="notation:Node" xmi:id="_YJg-gNr-Eeq_nvF5tuZorw" type="6003">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_YJg-gdr-Eeq_nvF5tuZorw" y="10"/>
-          </children>
-          <styles xmi:type="notation:ConnectorStyle" xmi:id="_YJeiQdr-Eeq_nvF5tuZorw" routing="Tree"/>
-          <styles xmi:type="notation:FontStyle" xmi:id="_YJeiQtr-Eeq_nvF5tuZorw" fontName="Cantarell" fontHeight="8"/>
-          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_YJeiQ9r-Eeq_nvF5tuZorw" points="[0, 0, 280, -265]$[-280, 265, 0, 0]"/>
-          <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_YJko4Nr-Eeq_nvF5tuZorw" id="(0.0,0.17346938775510204)"/>
-          <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_YJko4dr-Eeq_nvF5tuZorw" id="(0.5,0.5)"/>
-        </edges>
         <edges xmi:type="notation:Edge" xmi:id="_1xGwkNvREeqxZK-wtN_0Nw" type="4001" element="_1wiv5tvREeqxZK-wtN_0Nw" source="_0ndn8NvREeqxZK-wtN_0Nw" target="_rIaeANrpEeq_CZJuNlb8eA">
           <children xmi:type="notation:Node" xmi:id="_1xHXoNvREeqxZK-wtN_0Nw" type="6001">
             <layoutConstraint xmi:type="notation:Bounds" xmi:id="_1xHXodvREeqxZK-wtN_0Nw" x="7" y="2"/>
@@ -1085,20 +1046,100 @@
         </edges>
         <edges xmi:type="notation:Edge" xmi:id="_2UufINyOEeq6k6a2XVHNwA" type="4001" element="_2Tg-MNyOEeq6k6a2XVHNwA" source="_S_lQQNr-Eeq_nvF5tuZorw" target="_rIc6Q9rpEeq_CZJuNlb8eA">
           <children xmi:type="notation:Node" xmi:id="_2U2a8NyOEeq6k6a2XVHNwA" type="6001">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2U2a8dyOEeq6k6a2XVHNwA" x="-496" y="-10"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2U2a8dyOEeq6k6a2XVHNwA" x="-466" y="-10"/>
           </children>
           <children xmi:type="notation:Node" xmi:id="_2U3CANyOEeq6k6a2XVHNwA" type="6002">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2U3CAdyOEeq6k6a2XVHNwA" x="-71" y="114"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2U3CAdyOEeq6k6a2XVHNwA" x="-215" y="114"/>
           </children>
           <children xmi:type="notation:Node" xmi:id="_2U4QINyOEeq6k6a2XVHNwA" type="6003">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2U4QIdyOEeq6k6a2XVHNwA" x="-10"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2U4QIdyOEeq6k6a2XVHNwA" x="-1"/>
           </children>
           <styles xmi:type="notation:ConnectorStyle" xmi:id="_2UvGMNyOEeq6k6a2XVHNwA" routing="Rectilinear"/>
           <styles xmi:type="notation:FontStyle" xmi:id="_2UvGMdyOEeq6k6a2XVHNwA" fontColor="7490599" fontName="Segoe UI" fontHeight="8"/>
-          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_2UvGMtyOEeq6k6a2XVHNwA" points="[0, 98, 1672, 548]$[0, 484, 1672, 934]$[-1754, 484, -82, 934]$[-1754, -362, -82, 88]"/>
+          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_2UvGMtyOEeq6k6a2XVHNwA" points="[40, 98, 1825, 681]$[40, 349, 1825, 932]$[-1888, 349, -103, 932]$[-1888, -470, -103, 113]"/>
           <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2U7TcNyOEeq6k6a2XVHNwA" id="(0.4807692307692308,0.0)"/>
           <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2U7TcdyOEeq6k6a2XVHNwA" id="(1.0,0.10204081632653061)"/>
         </edges>
+        <edges xmi:type="notation:Edge" xmi:id="_NGDrgPHQEeqBSeAPWoKPJw" type="4001" element="_NFylzPHQEeqBSeAPWoKPJw" source="_Jku50PHQEeqBSeAPWoKPJw" target="_rIevd9rpEeq_CZJuNlb8eA">
+          <children xmi:type="notation:Node" xmi:id="_NGESkPHQEeqBSeAPWoKPJw" type="6001">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NGESkfHQEeqBSeAPWoKPJw" x="1" y="-10"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_NGESkvHQEeqBSeAPWoKPJw" type="6002">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NGESk_HQEeqBSeAPWoKPJw" x="1" y="10"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_NGESlPHQEeqBSeAPWoKPJw" type="6003">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NGESlfHQEeqBSeAPWoKPJw" x="1" y="10"/>
+          </children>
+          <styles xmi:type="notation:ConnectorStyle" xmi:id="_NGDrgfHQEeqBSeAPWoKPJw" routing="Tree"/>
+          <styles xmi:type="notation:FontStyle" xmi:id="_NGDrgvHQEeqBSeAPWoKPJw" fontName="Cantarell" fontHeight="8"/>
+          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NGDrg_HQEeqBSeAPWoKPJw" points="[0, -4, 758, 136]$[0, -74, 758, 66]$[-757, -74, 1, 66]$[-757, -91, 1, 49]"/>
+          <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NGESlvHQEeqBSeAPWoKPJw" id="(0.2457627118644068,0.0)"/>
+          <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NGESl_HQEeqBSeAPWoKPJw" id="(0.5,0.5)"/>
+        </edges>
+        <edges xmi:type="notation:Edge" xmi:id="_RyYQsPHQEeqBSeAPWoKPJw" type="4001" element="_RyJASvHQEeqBSeAPWoKPJw" source="_S_lQQNr-Eeq_nvF5tuZorw" target="_Jku50PHQEeqBSeAPWoKPJw">
+          <children xmi:type="notation:Node" xmi:id="_RyY3wPHQEeqBSeAPWoKPJw" type="6001">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_RyY3wfHQEeqBSeAPWoKPJw" y="-10"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_RyY3wvHQEeqBSeAPWoKPJw" type="6002">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_RyY3w_HQEeqBSeAPWoKPJw" y="10"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_RyY3xPHQEeqBSeAPWoKPJw" type="6003">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_RyY3xfHQEeqBSeAPWoKPJw" y="10"/>
+          </children>
+          <styles xmi:type="notation:ConnectorStyle" xmi:id="_RyYQsfHQEeqBSeAPWoKPJw" routing="Tree"/>
+          <styles xmi:type="notation:FontStyle" xmi:id="_RyYQsvHQEeqBSeAPWoKPJw" fontName="Cantarell" fontHeight="8"/>
+          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_RyYQs_HQEeqBSeAPWoKPJw" points="[0, 0, -45, 37]$[45, -37, 0, 0]"/>
+          <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_RyY3xvHQEeqBSeAPWoKPJw" id="(0.5769230769230769,0.0)"/>
+          <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_RyY3x_HQEeqBSeAPWoKPJw" id="(0.5,0.5)"/>
+        </edges>
+        <edges xmi:type="notation:Edge" xmi:id="_TU3XIPHQEeqBSeAPWoKPJw" type="4001" element="_TUot1vHQEeqBSeAPWoKPJw" source="_sfpyMNrzEeq_CZJuNlb8eA" target="_Jku50PHQEeqBSeAPWoKPJw">
+          <children xmi:type="notation:Node" xmi:id="_TU3XJPHQEeqBSeAPWoKPJw" type="6001">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TU3XJfHQEeqBSeAPWoKPJw" y="-10"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_TU3XJvHQEeqBSeAPWoKPJw" type="6002">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TU3XJ_HQEeqBSeAPWoKPJw" y="10"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_TU3-MPHQEeqBSeAPWoKPJw" type="6003">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TU3-MfHQEeqBSeAPWoKPJw" y="10"/>
+          </children>
+          <styles xmi:type="notation:ConnectorStyle" xmi:id="_TU3XIfHQEeqBSeAPWoKPJw" routing="Tree"/>
+          <styles xmi:type="notation:FontStyle" xmi:id="_TU3XIvHQEeqBSeAPWoKPJw" fontName="Cantarell" fontHeight="8"/>
+          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_TU3XI_HQEeqBSeAPWoKPJw" points="[0, 0, 263, 97]$[-263, -97, 0, 0]"/>
+          <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_TU3-MvHQEeqBSeAPWoKPJw" id="(0.0,0.11224489795918367)"/>
+          <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_TU3-M_HQEeqBSeAPWoKPJw" id="(0.5,0.5)"/>
+        </edges>
+        <edges xmi:type="notation:Edge" xmi:id="_TsQjcPHQEeqBSeAPWoKPJw" type="4001" element="_TsB6GvHQEeqBSeAPWoKPJw" source="_YI-pcNryEeq_CZJuNlb8eA" target="_Jku50PHQEeqBSeAPWoKPJw">
+          <children xmi:type="notation:Node" xmi:id="_TsQjdPHQEeqBSeAPWoKPJw" type="6001">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TsQjdfHQEeqBSeAPWoKPJw" y="-10"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_TsQjdvHQEeqBSeAPWoKPJw" type="6002">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TsQjd_HQEeqBSeAPWoKPJw" y="10"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_TsQjePHQEeqBSeAPWoKPJw" type="6003">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TsQjefHQEeqBSeAPWoKPJw" y="10"/>
+          </children>
+          <styles xmi:type="notation:ConnectorStyle" xmi:id="_TsQjcfHQEeqBSeAPWoKPJw" routing="Tree"/>
+          <styles xmi:type="notation:FontStyle" xmi:id="_TsQjcvHQEeqBSeAPWoKPJw" fontName="Cantarell" fontHeight="8"/>
+          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_TsQjc_HQEeqBSeAPWoKPJw" points="[0, 0, 163, 105]$[-163, -105, 0, 0]"/>
+          <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_TsQjevHQEeqBSeAPWoKPJw" id="(0.704225352112676,0.0)"/>
+          <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_TsQje_HQEeqBSeAPWoKPJw" id="(0.5,0.5)"/>
+        </edges>
+        <edges xmi:type="notation:Edge" xmi:id="_fX8ugPHQEeqBSeAPWoKPJw" type="4001" element="_fXuFHvHQEeqBSeAPWoKPJw" source="_Jku50PHQEeqBSeAPWoKPJw" target="_rIcTN9rpEeq_CZJuNlb8eA">
+          <children xmi:type="notation:Node" xmi:id="_fX8uhPHQEeqBSeAPWoKPJw" type="6001">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fX8uhfHQEeqBSeAPWoKPJw" x="-42" y="-10"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_fX8uhvHQEeqBSeAPWoKPJw" type="6002">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fX8uh_HQEeqBSeAPWoKPJw" x="-38" y="10"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_fX8uiPHQEeqBSeAPWoKPJw" type="6003">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fX8uifHQEeqBSeAPWoKPJw" x="-134" y="10"/>
+          </children>
+          <styles xmi:type="notation:ConnectorStyle" xmi:id="_fX8ugfHQEeqBSeAPWoKPJw" routing="Rectilinear"/>
+          <styles xmi:type="notation:FontStyle" xmi:id="_fX8ugvHQEeqBSeAPWoKPJw" fontColor="7490599" fontName="Cantarell" fontHeight="8"/>
+          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_fX8ug_HQEeqBSeAPWoKPJw" points="[-8, 0, 1906, 660]$[-8, -755, 1906, -95]$[-1996, -755, -82, -95]$[-1996, -665, -82, -5]"/>
+          <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_fX8uivHQEeqBSeAPWoKPJw" id="(0.559322033898305,0.0)"/>
+          <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_fX8ui_HQEeqBSeAPWoKPJw" id="(1.0,0.04)"/>
+        </edges>
       </data>
     </ownedAnnotationEntries>
     <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_rGcIENrpEeq_CZJuNlb8eA" name="Task" tooltipText="" outgoingEdges="_rHvIkNrpEeq_CZJuNlb8eA _rH2dUNrpEeq_CZJuNlb8eA _rH3EZtrpEeq_CZJuNlb8eA _rH3rdtrpEeq_CZJuNlb8eA _rH4ShtrpEeq_CZJuNlb8eA _qKPzVtruEeq_CZJuNlb8eA" incomingEdges="_rH4ShtrpEeq_CZJuNlb8eA _rH9LBtrpEeq_CZJuNlb8eA _rH-ZINrpEeq_CZJuNlb8eA _v_ZPldrzEeq_CZJuNlb8eA" width="12" height="10">
@@ -1243,7 +1284,7 @@
         <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EDataType']/@subNodeMappings[name='EC_DataType_InstanceClassName']"/>
       </ownedElements>
     </ownedDiagramElements>
-    <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_rGoVUNrpEeq_CZJuNlb8eA" name="User" tooltipText="" outgoingEdges="_rH5goNrpEeq_CZJuNlb8eA _rH6Hs9rpEeq_CZJuNlb8eA _rH7V1trpEeq_CZJuNlb8eA _sWnrrNrrEeq_CZJuNlb8eA" width="12" height="10">
+    <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_rGoVUNrpEeq_CZJuNlb8eA" name="User" tooltipText="" outgoingEdges="_rH5goNrpEeq_CZJuNlb8eA _rH6Hs9rpEeq_CZJuNlb8eA _rH7V1trpEeq_CZJuNlb8eA _sWnrrNrrEeq_CZJuNlb8eA" incomingEdges="_fXuFHvHQEeqBSeAPWoKPJw" width="12" height="10">
       <target xmi:type="ecore:EClass" href="Skills.ecore#//User"/>
       <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//User"/>
       <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
@@ -1413,9 +1454,9 @@
         </ownedStyle>
         <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='Operation']"/>
       </ownedElements>
-      <ownedElements xmi:type="diagram:DNodeListElement" uid="_rHhGINrpEeq_CZJuNlb8eA" name="start()" tooltipText="start()">
-        <target xmi:type="ecore:EOperation" href="Skills.ecore#//UserTask/start"/>
-        <semanticElements xmi:type="ecore:EOperation" href="Skills.ecore#//UserTask/start"/>
+      <ownedElements xmi:type="diagram:DNodeListElement" uid="_rHhGINrpEeq_CZJuNlb8eA" name="activate()" tooltipText="activate()">
+        <target xmi:type="ecore:EOperation" href="Skills.ecore#//UserTask/activate"/>
+        <semanticElements xmi:type="ecore:EOperation" href="Skills.ecore#//UserTask/activate"/>
         <ownedStyle xmi:type="diagram:BundledImage" uid="_rHhGIdrpEeq_CZJuNlb8eA" labelAlignment="LEFT">
           <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='Operation']/@style"/>
         </ownedStyle>
@@ -1465,7 +1506,7 @@
         <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
       </ownedElements>
     </ownedDiagramElements>
-    <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_rGvDAdrpEeq_CZJuNlb8eA" name="Dependency" tooltipText="" incomingEdges="_rH2dUNrpEeq_CZJuNlb8eA _rH3rdtrpEeq_CZJuNlb8eA _rICDgNrpEeq_CZJuNlb8eA _rIDRoNrpEeq_CZJuNlb8eA _rIJYQNrpEeq_CZJuNlb8eA _rIMbk9rpEeq_CZJuNlb8eA _rINCo9rpEeq_CZJuNlb8eA _d6_rctryEeq_CZJuNlb8eA _v9hK3tr0Eeq_CZJuNlb8eA _YJBPQNr-Eeq_nvF5tuZorw" width="12" height="10">
+    <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_rGvDAdrpEeq_CZJuNlb8eA" name="Dependency" tooltipText="" incomingEdges="_rH2dUNrpEeq_CZJuNlb8eA _rH3rdtrpEeq_CZJuNlb8eA _rICDgNrpEeq_CZJuNlb8eA _rIDRoNrpEeq_CZJuNlb8eA _rIJYQNrpEeq_CZJuNlb8eA _rIMbk9rpEeq_CZJuNlb8eA _rINCo9rpEeq_CZJuNlb8eA _NFylzPHQEeqBSeAPWoKPJw" width="12" height="10">
       <target xmi:type="ecore:EClass" href="Skills.ecore#//Dependency"/>
       <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//Dependency"/>
       <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
@@ -2034,7 +2075,7 @@
       </ownedStyle>
       <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
     </ownedDiagramElements>
-    <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_YIycMNryEeq_CZJuNlb8eA" name="CompleteIncludedTasksDependency" tooltipText="" outgoingEdges="_d6_rctryEeq_CZJuNlb8eA" width="12" height="10">
+    <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_YIycMNryEeq_CZJuNlb8eA" name="CompleteIncludedTasksDependency" tooltipText="" outgoingEdges="_TsB6GvHQEeqBSeAPWoKPJw" width="12" height="10">
       <target xmi:type="ecore:EClass" href="Skills.ecore#//CompleteIncludedTasksDependency"/>
       <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//CompleteIncludedTasksDependency"/>
       <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
@@ -2045,25 +2086,13 @@
       </ownedStyle>
       <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
     </ownedDiagramElements>
-    <ownedDiagramElements xmi:type="diagram:DEdge" uid="_d6_rctryEeq_CZJuNlb8eA" sourceNode="_YIycMNryEeq_CZJuNlb8eA" targetNode="_rGvDAdrpEeq_CZJuNlb8eA">
-      <target xmi:type="ecore:EClass" href="Skills.ecore#//CompleteIncludedTasksDependency"/>
-      <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//CompleteIncludedTasksDependency"/>
-      <ownedStyle xmi:type="diagram:EdgeStyle" uid="_d6_rc9ryEeq_CZJuNlb8eA" targetArrow="InputClosedArrow" routingStyle="tree">
-        <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/>
-        <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_d6_rdNryEeq_CZJuNlb8eA" showIcon="false">
-          <labelFormat>italic</labelFormat>
-        </beginLabelStyle>
-        <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_d6_rddryEeq_CZJuNlb8eA" showIcon="false"/>
-      </ownedStyle>
-      <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
-    </ownedDiagramElements>
-    <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_sfdk8NrzEeq_CZJuNlb8eA" name="TaskDependency" tooltipText="" outgoingEdges="_v_ZPldrzEeq_CZJuNlb8eA _v9hK3tr0Eeq_CZJuNlb8eA" width="12" height="10">
+    <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_sfdk8NrzEeq_CZJuNlb8eA" name="TaskDependency" tooltipText="" outgoingEdges="_v_ZPldrzEeq_CZJuNlb8eA _TUot1vHQEeqBSeAPWoKPJw" width="12" height="10">
       <target xmi:type="ecore:EClass" href="Skills.ecore#//TaskDependency"/>
       <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//TaskDependency"/>
       <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
       <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
       <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
-      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_0GBGodrzEeq_CZJuNlb8eA" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
+      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_WA61GfHNEeqBSeAPWoKPJw" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
         <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
       </ownedStyle>
       <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
@@ -2087,19 +2116,7 @@
       </ownedStyle>
       <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
     </ownedDiagramElements>
-    <ownedDiagramElements xmi:type="diagram:DEdge" uid="_v9hK3tr0Eeq_CZJuNlb8eA" sourceNode="_sfdk8NrzEeq_CZJuNlb8eA" targetNode="_rGvDAdrpEeq_CZJuNlb8eA">
-      <target xmi:type="ecore:EClass" href="Skills.ecore#//TaskDependency"/>
-      <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//TaskDependency"/>
-      <ownedStyle xmi:type="diagram:EdgeStyle" uid="_v9hK39r0Eeq_CZJuNlb8eA" targetArrow="InputClosedArrow" routingStyle="tree">
-        <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/>
-        <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_v9hK4Nr0Eeq_CZJuNlb8eA" showIcon="false">
-          <labelFormat>italic</labelFormat>
-        </beginLabelStyle>
-        <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_v9hK4dr0Eeq_CZJuNlb8eA" showIcon="false"/>
-      </ownedStyle>
-      <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
-    </ownedDiagramElements>
-    <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_S--MQNr-Eeq_nvF5tuZorw" name="SkillDependency" tooltipText="" outgoingEdges="_YJBPQNr-Eeq_nvF5tuZorw _2Tg-MNyOEeq6k6a2XVHNwA" width="12" height="10">
+    <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_S--MQNr-Eeq_nvF5tuZorw" name="SkillDependency" tooltipText="" outgoingEdges="_2Tg-MNyOEeq6k6a2XVHNwA _RyJASvHQEeqBSeAPWoKPJw" width="12" height="10">
       <target xmi:type="ecore:EClass" href="Skills.ecore#//SkillDependency"/>
       <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//SkillDependency"/>
       <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
@@ -2126,18 +2143,6 @@
         <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
       </ownedElements>
     </ownedDiagramElements>
-    <ownedDiagramElements xmi:type="diagram:DEdge" uid="_YJBPQNr-Eeq_nvF5tuZorw" sourceNode="_S--MQNr-Eeq_nvF5tuZorw" targetNode="_rGvDAdrpEeq_CZJuNlb8eA">
-      <target xmi:type="ecore:EClass" href="Skills.ecore#//SkillDependency"/>
-      <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//SkillDependency"/>
-      <ownedStyle xmi:type="diagram:EdgeStyle" uid="_pFxrVtr-Eeq_nvF5tuZorw" targetArrow="InputClosedArrow" routingStyle="tree">
-        <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/>
-        <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_pFxrV9r-Eeq_nvF5tuZorw" showIcon="false">
-          <labelFormat>italic</labelFormat>
-        </beginLabelStyle>
-        <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_pFxrWNr-Eeq_nvF5tuZorw" showIcon="false"/>
-      </ownedStyle>
-      <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
-    </ownedDiagramElements>
     <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_0msy8NvREeqxZK-wtN_0Nw" name="Hint" tooltipText="" outgoingEdges="_1wiv5tvREeqxZK-wtN_0Nw" incomingEdges="_qKPzVtruEeq_CZJuNlb8eA" width="12" height="10">
       <target xmi:type="ecore:EClass" href="Skills.ecore#//Hint"/>
       <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//Hint"/>
@@ -2276,6 +2281,76 @@
         <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EDataType']/@subNodeMappings[name='EC_DataType_InstanceClassName']"/>
       </ownedElements>
     </ownedDiagramElements>
+    <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_Jkcl8PHQEeqBSeAPWoKPJw" name="UserDependency" tooltipText="" outgoingEdges="_NFylzPHQEeqBSeAPWoKPJw _fXuFHvHQEeqBSeAPWoKPJw" incomingEdges="_RyJASvHQEeqBSeAPWoKPJw _TUot1vHQEeqBSeAPWoKPJw _TsB6GvHQEeqBSeAPWoKPJw" width="12" height="10">
+      <target xmi:type="ecore:EClass" href="Skills.ecore#//UserDependency"/>
+      <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//UserDependency"/>
+      <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+      <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+      <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_LIADYfHQEeqBSeAPWoKPJw" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_abstract.gif" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="228,228,228">
+        <labelFormat>italic</labelFormat>
+        <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@conditionnalStyles.1/@style"/>
+      </ownedStyle>
+      <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+    </ownedDiagramElements>
+    <ownedDiagramElements xmi:type="diagram:DEdge" uid="_NFylzPHQEeqBSeAPWoKPJw" sourceNode="_Jkcl8PHQEeqBSeAPWoKPJw" targetNode="_rGvDAdrpEeq_CZJuNlb8eA">
+      <target xmi:type="ecore:EClass" href="Skills.ecore#//UserDependency"/>
+      <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//UserDependency"/>
+      <ownedStyle xmi:type="diagram:EdgeStyle" uid="_NFylzfHQEeqBSeAPWoKPJw" targetArrow="InputClosedArrow" routingStyle="tree">
+        <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/>
+        <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_NFylzvHQEeqBSeAPWoKPJw" showIcon="false">
+          <labelFormat>italic</labelFormat>
+        </beginLabelStyle>
+        <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_NFylz_HQEeqBSeAPWoKPJw" showIcon="false"/>
+      </ownedStyle>
+      <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
+    </ownedDiagramElements>
+    <ownedDiagramElements xmi:type="diagram:DEdge" uid="_RyJASvHQEeqBSeAPWoKPJw" sourceNode="_S--MQNr-Eeq_nvF5tuZorw" targetNode="_Jkcl8PHQEeqBSeAPWoKPJw">
+      <target xmi:type="ecore:EClass" href="Skills.ecore#//SkillDependency"/>
+      <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//SkillDependency"/>
+      <ownedStyle xmi:type="diagram:EdgeStyle" uid="_RyJnMPHQEeqBSeAPWoKPJw" targetArrow="InputClosedArrow" routingStyle="tree">
+        <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/>
+        <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_RyJnMfHQEeqBSeAPWoKPJw" showIcon="false">
+          <labelFormat>italic</labelFormat>
+        </beginLabelStyle>
+        <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_RyJnMvHQEeqBSeAPWoKPJw" showIcon="false"/>
+      </ownedStyle>
+      <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
+    </ownedDiagramElements>
+    <ownedDiagramElements xmi:type="diagram:DEdge" uid="_TUot1vHQEeqBSeAPWoKPJw" sourceNode="_sfdk8NrzEeq_CZJuNlb8eA" targetNode="_Jkcl8PHQEeqBSeAPWoKPJw">
+      <target xmi:type="ecore:EClass" href="Skills.ecore#//TaskDependency"/>
+      <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//TaskDependency"/>
+      <ownedStyle xmi:type="diagram:EdgeStyle" uid="_TUpUsPHQEeqBSeAPWoKPJw" targetArrow="InputClosedArrow" routingStyle="tree">
+        <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/>
+        <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_TUpUsfHQEeqBSeAPWoKPJw" showIcon="false">
+          <labelFormat>italic</labelFormat>
+        </beginLabelStyle>
+        <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_TUpUsvHQEeqBSeAPWoKPJw" showIcon="false"/>
+      </ownedStyle>
+      <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
+    </ownedDiagramElements>
+    <ownedDiagramElements xmi:type="diagram:DEdge" uid="_TsB6GvHQEeqBSeAPWoKPJw" sourceNode="_YIycMNryEeq_CZJuNlb8eA" targetNode="_Jkcl8PHQEeqBSeAPWoKPJw">
+      <target xmi:type="ecore:EClass" href="Skills.ecore#//CompleteIncludedTasksDependency"/>
+      <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//CompleteIncludedTasksDependency"/>
+      <ownedStyle xmi:type="diagram:EdgeStyle" uid="_TsChAPHQEeqBSeAPWoKPJw" targetArrow="InputClosedArrow" routingStyle="tree">
+        <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/>
+        <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_TsChAfHQEeqBSeAPWoKPJw" showIcon="false">
+          <labelFormat>italic</labelFormat>
+        </beginLabelStyle>
+        <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_TsChAvHQEeqBSeAPWoKPJw" showIcon="false"/>
+      </ownedStyle>
+      <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
+    </ownedDiagramElements>
+    <ownedDiagramElements xmi:type="diagram:DEdge" uid="_fXuFHvHQEeqBSeAPWoKPJw" name="[0..1] user" sourceNode="_Jkcl8PHQEeqBSeAPWoKPJw" targetNode="_rGoVUNrpEeq_CZJuNlb8eA">
+      <target xmi:type="ecore:EReference" href="Skills.ecore#//UserDependency/user"/>
+      <semanticElements xmi:type="ecore:EReference" href="Skills.ecore#//UserDependency/user"/>
+      <ownedStyle xmi:type="diagram:EdgeStyle" uid="_pecdcvHQEeqBSeAPWoKPJw" routingStyle="manhattan" strokeColor="0,0,0">
+        <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']/@style"/>
+        <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_pecddPHQEeqBSeAPWoKPJw" showIcon="false"/>
+        <endLabelStyle xmi:type="diagram:EndLabelStyle" uid="_pecdc_HQEeqBSeAPWoKPJw" labelSize="6" showIcon="false" labelColor="39,76,114"/>
+      </ownedStyle>
+      <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+    </ownedDiagramElements>
     <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
     <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_n5CZoEwrEeqwHIzbUoB2lQ"/>
     <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/>
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ICompleteIncludedTasksDependency.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ICompleteIncludedTasksDependency.java
index 25da249..c72238e 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ICompleteIncludedTasksDependency.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ICompleteIncludedTasksDependency.java
@@ -13,5 +13,5 @@
  * @model
  * @generated
  */
-public interface ICompleteIncludedTasksDependency extends IDependency {
+public interface ICompleteIncludedTasksDependency extends IUserDependency {
 } // ICompleteIncludedTasksDependency
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkillDependency.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkillDependency.java
index ea2498c..f23ec2b 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkillDependency.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkillDependency.java
@@ -21,7 +21,7 @@
  * @model
  * @generated
  */
-public interface ISkillDependency extends IDependency {
+public interface ISkillDependency extends IUserDependency {
 	/**
 	 * Returns the value of the '<em><b>Min Experience</b></em>' attribute.
 	 * The default value is <code>"0"</code>.
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkillsPackage.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkillsPackage.java
index 6569094..7b83cc4 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkillsPackage.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkillsPackage.java
@@ -589,13 +589,13 @@
 	int USER_TASK___IS_COMPLETED = 0;
 
 	/**
-	 * The operation id for the '<em>Start</em>' operation.
+	 * The operation id for the '<em>Activate</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int USER_TASK___START = 1;
+	int USER_TASK___ACTIVATE = 1;
 
 	/**
 	 * The operation id for the '<em>Get User</em>' operation.
@@ -1493,6 +1493,70 @@
 	int SEQUENCE_DEPENDENCY_OPERATION_COUNT = AND_DEPENDENCY_OPERATION_COUNT + 0;
 
 	/**
+	 * The meta object id for the '{@link org.eclipse.skills.model.impl.MUserDependency <em>User Dependency</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.skills.model.impl.MUserDependency
+	 * @see org.eclipse.skills.model.impl.MSkillsPackage#getUserDependency()
+	 * @generated
+	 */
+	int USER_DEPENDENCY = 24;
+
+	/**
+	 * The feature id for the '<em><b>Fulfilled</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int USER_DEPENDENCY__FULFILLED = DEPENDENCY__FULFILLED;
+
+	/**
+	 * The feature id for the '<em><b>User</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int USER_DEPENDENCY__USER = DEPENDENCY_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>User Dependency</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int USER_DEPENDENCY_FEATURE_COUNT = DEPENDENCY_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>Activate</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int USER_DEPENDENCY___ACTIVATE = DEPENDENCY___ACTIVATE;
+
+	/**
+	 * The operation id for the '<em>Deactivate</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int USER_DEPENDENCY___DEACTIVATE = DEPENDENCY___DEACTIVATE;
+
+	/**
+	 * The number of operations of the '<em>User Dependency</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int USER_DEPENDENCY_OPERATION_COUNT = DEPENDENCY_OPERATION_COUNT + 0;
+
+	/**
 	 * The meta object id for the '{@link org.eclipse.skills.model.impl.MCompleteIncludedTasksDependency <em>Complete Included Tasks Dependency</em>}' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1509,7 +1573,16 @@
 	 * @generated
 	 * @ordered
 	 */
-	int COMPLETE_INCLUDED_TASKS_DEPENDENCY__FULFILLED = DEPENDENCY__FULFILLED;
+	int COMPLETE_INCLUDED_TASKS_DEPENDENCY__FULFILLED = USER_DEPENDENCY__FULFILLED;
+
+	/**
+	 * The feature id for the '<em><b>User</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COMPLETE_INCLUDED_TASKS_DEPENDENCY__USER = USER_DEPENDENCY__USER;
 
 	/**
 	 * The number of structural features of the '<em>Complete Included Tasks Dependency</em>' class.
@@ -1518,7 +1591,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int COMPLETE_INCLUDED_TASKS_DEPENDENCY_FEATURE_COUNT = DEPENDENCY_FEATURE_COUNT + 0;
+	int COMPLETE_INCLUDED_TASKS_DEPENDENCY_FEATURE_COUNT = USER_DEPENDENCY_FEATURE_COUNT + 0;
 
 	/**
 	 * The operation id for the '<em>Activate</em>' operation.
@@ -1527,7 +1600,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int COMPLETE_INCLUDED_TASKS_DEPENDENCY___ACTIVATE = DEPENDENCY___ACTIVATE;
+	int COMPLETE_INCLUDED_TASKS_DEPENDENCY___ACTIVATE = USER_DEPENDENCY___ACTIVATE;
 
 	/**
 	 * The operation id for the '<em>Deactivate</em>' operation.
@@ -1536,7 +1609,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int COMPLETE_INCLUDED_TASKS_DEPENDENCY___DEACTIVATE = DEPENDENCY___DEACTIVATE;
+	int COMPLETE_INCLUDED_TASKS_DEPENDENCY___DEACTIVATE = USER_DEPENDENCY___DEACTIVATE;
 
 	/**
 	 * The number of operations of the '<em>Complete Included Tasks Dependency</em>' class.
@@ -1545,7 +1618,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int COMPLETE_INCLUDED_TASKS_DEPENDENCY_OPERATION_COUNT = DEPENDENCY_OPERATION_COUNT + 0;
+	int COMPLETE_INCLUDED_TASKS_DEPENDENCY_OPERATION_COUNT = USER_DEPENDENCY_OPERATION_COUNT + 0;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.skills.model.impl.MTaskDependency <em>Task Dependency</em>}' class.
@@ -1564,7 +1637,16 @@
 	 * @generated
 	 * @ordered
 	 */
-	int TASK_DEPENDENCY__FULFILLED = DEPENDENCY__FULFILLED;
+	int TASK_DEPENDENCY__FULFILLED = USER_DEPENDENCY__FULFILLED;
+
+	/**
+	 * The feature id for the '<em><b>User</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TASK_DEPENDENCY__USER = USER_DEPENDENCY__USER;
 
 	/**
 	 * The feature id for the '<em><b>Task</b></em>' reference.
@@ -1573,7 +1655,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int TASK_DEPENDENCY__TASK = DEPENDENCY_FEATURE_COUNT + 0;
+	int TASK_DEPENDENCY__TASK = USER_DEPENDENCY_FEATURE_COUNT + 0;
 
 	/**
 	 * The feature id for the '<em><b>Completed</b></em>' attribute.
@@ -1582,7 +1664,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int TASK_DEPENDENCY__COMPLETED = DEPENDENCY_FEATURE_COUNT + 1;
+	int TASK_DEPENDENCY__COMPLETED = USER_DEPENDENCY_FEATURE_COUNT + 1;
 
 	/**
 	 * The number of structural features of the '<em>Task Dependency</em>' class.
@@ -1591,7 +1673,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int TASK_DEPENDENCY_FEATURE_COUNT = DEPENDENCY_FEATURE_COUNT + 2;
+	int TASK_DEPENDENCY_FEATURE_COUNT = USER_DEPENDENCY_FEATURE_COUNT + 2;
 
 	/**
 	 * The operation id for the '<em>Activate</em>' operation.
@@ -1600,7 +1682,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int TASK_DEPENDENCY___ACTIVATE = DEPENDENCY___ACTIVATE;
+	int TASK_DEPENDENCY___ACTIVATE = USER_DEPENDENCY___ACTIVATE;
 
 	/**
 	 * The operation id for the '<em>Deactivate</em>' operation.
@@ -1609,7 +1691,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int TASK_DEPENDENCY___DEACTIVATE = DEPENDENCY___DEACTIVATE;
+	int TASK_DEPENDENCY___DEACTIVATE = USER_DEPENDENCY___DEACTIVATE;
 
 	/**
 	 * The number of operations of the '<em>Task Dependency</em>' class.
@@ -1618,7 +1700,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int TASK_DEPENDENCY_OPERATION_COUNT = DEPENDENCY_OPERATION_COUNT + 0;
+	int TASK_DEPENDENCY_OPERATION_COUNT = USER_DEPENDENCY_OPERATION_COUNT + 0;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.skills.model.impl.MSkillDependency <em>Skill Dependency</em>}' class.
@@ -1637,7 +1719,16 @@
 	 * @generated
 	 * @ordered
 	 */
-	int SKILL_DEPENDENCY__FULFILLED = DEPENDENCY__FULFILLED;
+	int SKILL_DEPENDENCY__FULFILLED = USER_DEPENDENCY__FULFILLED;
+
+	/**
+	 * The feature id for the '<em><b>User</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SKILL_DEPENDENCY__USER = USER_DEPENDENCY__USER;
 
 	/**
 	 * The feature id for the '<em><b>Min Experience</b></em>' attribute.
@@ -1646,7 +1737,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int SKILL_DEPENDENCY__MIN_EXPERIENCE = DEPENDENCY_FEATURE_COUNT + 0;
+	int SKILL_DEPENDENCY__MIN_EXPERIENCE = USER_DEPENDENCY_FEATURE_COUNT + 0;
 
 	/**
 	 * The feature id for the '<em><b>Min Level</b></em>' attribute.
@@ -1655,7 +1746,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int SKILL_DEPENDENCY__MIN_LEVEL = DEPENDENCY_FEATURE_COUNT + 1;
+	int SKILL_DEPENDENCY__MIN_LEVEL = USER_DEPENDENCY_FEATURE_COUNT + 1;
 
 	/**
 	 * The feature id for the '<em><b>Skill</b></em>' reference.
@@ -1664,7 +1755,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int SKILL_DEPENDENCY__SKILL = DEPENDENCY_FEATURE_COUNT + 2;
+	int SKILL_DEPENDENCY__SKILL = USER_DEPENDENCY_FEATURE_COUNT + 2;
 
 	/**
 	 * The number of structural features of the '<em>Skill Dependency</em>' class.
@@ -1673,7 +1764,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int SKILL_DEPENDENCY_FEATURE_COUNT = DEPENDENCY_FEATURE_COUNT + 3;
+	int SKILL_DEPENDENCY_FEATURE_COUNT = USER_DEPENDENCY_FEATURE_COUNT + 3;
 
 	/**
 	 * The operation id for the '<em>Activate</em>' operation.
@@ -1682,7 +1773,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int SKILL_DEPENDENCY___ACTIVATE = DEPENDENCY___ACTIVATE;
+	int SKILL_DEPENDENCY___ACTIVATE = USER_DEPENDENCY___ACTIVATE;
 
 	/**
 	 * The operation id for the '<em>Deactivate</em>' operation.
@@ -1691,7 +1782,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int SKILL_DEPENDENCY___DEACTIVATE = DEPENDENCY___DEACTIVATE;
+	int SKILL_DEPENDENCY___DEACTIVATE = USER_DEPENDENCY___DEACTIVATE;
 
 	/**
 	 * The number of operations of the '<em>Skill Dependency</em>' class.
@@ -1700,7 +1791,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int SKILL_DEPENDENCY_OPERATION_COUNT = DEPENDENCY_OPERATION_COUNT + 0;
+	int SKILL_DEPENDENCY_OPERATION_COUNT = USER_DEPENDENCY_OPERATION_COUNT + 0;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.skills.model.impl.MHint <em>Hint</em>}' class.
@@ -1756,7 +1847,7 @@
 	 * @see org.eclipse.skills.model.impl.MSkillsPackage#getLevelNames()
 	 * @generated
 	 */
-	int LEVEL_NAMES = 24;
+	int LEVEL_NAMES = 25;
 
 	/**
 	 * The meta object id for the '<em>Date</em>' data type.
@@ -1766,7 +1857,7 @@
 	 * @see org.eclipse.skills.model.impl.MSkillsPackage#getDate()
 	 * @generated
 	 */
-	int DATE = 25;
+	int DATE = 26;
 
 
 	/**
@@ -1777,7 +1868,7 @@
 	 * @see org.eclipse.skills.model.impl.MSkillsPackage#getCustomDependencyDefinition()
 	 * @generated
 	 */
-	int CUSTOM_DEPENDENCY_DEFINITION = 26;
+	int CUSTOM_DEPENDENCY_DEFINITION = 27;
 
 
 	/**
@@ -1788,7 +1879,7 @@
 	 * @see org.eclipse.skills.model.impl.MSkillsPackage#getImageData()
 	 * @generated
 	 */
-	int IMAGE_DATA = 27;
+	int IMAGE_DATA = 28;
 
 
 	/**
@@ -1799,7 +1890,7 @@
 	 * @see org.eclipse.skills.model.impl.MSkillsPackage#getISkillService()
 	 * @generated
 	 */
-	int ISKILL_SERVICE = 28;
+	int ISKILL_SERVICE = 29;
 
 
 	/**
@@ -2282,14 +2373,14 @@
 	EOperation getUserTask__IsCompleted();
 
 	/**
-	 * Returns the meta object for the '{@link org.eclipse.skills.model.IUserTask#start() <em>Start</em>}' operation.
+	 * Returns the meta object for the '{@link org.eclipse.skills.model.IUserTask#activate() <em>Activate</em>}' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for the '<em>Start</em>' operation.
-	 * @see org.eclipse.skills.model.IUserTask#start()
+	 * @return the meta object for the '<em>Activate</em>' operation.
+	 * @see org.eclipse.skills.model.IUserTask#activate()
 	 * @generated
 	 */
-	EOperation getUserTask__Start();
+	EOperation getUserTask__Activate();
 
 	/**
 	 * Returns the meta object for the '{@link org.eclipse.skills.model.IUserTask#getUser() <em>Get User</em>}' operation.
@@ -2741,6 +2832,27 @@
 	EAttribute getHint_Penalty();
 
 	/**
+	 * Returns the meta object for class '{@link org.eclipse.skills.model.IUserDependency <em>User Dependency</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>User Dependency</em>'.
+	 * @see org.eclipse.skills.model.IUserDependency
+	 * @generated
+	 */
+	EClass getUserDependency();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.skills.model.IUserDependency#getUser <em>User</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>User</em>'.
+	 * @see org.eclipse.skills.model.IUserDependency#getUser()
+	 * @see #getUserDependency()
+	 * @generated
+	 */
+	EReference getUserDependency_User();
+
+	/**
 	 * Returns the meta object for enum '{@link org.eclipse.skills.model.LevelNames <em>Level Names</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3192,12 +3304,12 @@
 		EOperation USER_TASK___IS_COMPLETED = eINSTANCE.getUserTask__IsCompleted();
 
 		/**
-		 * The meta object literal for the '<em><b>Start</b></em>' operation.
+		 * The meta object literal for the '<em><b>Activate</b></em>' operation.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EOperation USER_TASK___START = eINSTANCE.getUserTask__Start();
+		EOperation USER_TASK___ACTIVATE = eINSTANCE.getUserTask__Activate();
 
 		/**
 		 * The meta object literal for the '<em><b>Get User</b></em>' operation.
@@ -3578,6 +3690,24 @@
 		EAttribute HINT__PENALTY = eINSTANCE.getHint_Penalty();
 
 		/**
+		 * The meta object literal for the '{@link org.eclipse.skills.model.impl.MUserDependency <em>User Dependency</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.skills.model.impl.MUserDependency
+		 * @see org.eclipse.skills.model.impl.MSkillsPackage#getUserDependency()
+		 * @generated
+		 */
+		EClass USER_DEPENDENCY = eINSTANCE.getUserDependency();
+
+		/**
+		 * The meta object literal for the '<em><b>User</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference USER_DEPENDENCY__USER = eINSTANCE.getUserDependency_User();
+
+		/**
 		 * The meta object literal for the '{@link org.eclipse.skills.model.LevelNames <em>Level Names</em>}' enum.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ITaskDependency.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ITaskDependency.java
index 6cb52bb..0a32451 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ITaskDependency.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ITaskDependency.java
@@ -19,7 +19,7 @@
  * @model
  * @generated
  */
-public interface ITaskDependency extends IDependency {
+public interface ITaskDependency extends IUserDependency {
 	/**
 	 * Returns the value of the '<em><b>Task</b></em>' reference.
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/IUserDependency.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/IUserDependency.java
new file mode 100644
index 0000000..79307bf
--- /dev/null
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/IUserDependency.java
@@ -0,0 +1,45 @@
+/**
+ */
+package org.eclipse.skills.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>User Dependency</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.skills.model.IUserDependency#getUser <em>User</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.skills.model.ISkillsPackage#getUserDependency()
+ * @model abstract="true"
+ * @generated
+ */
+public interface IUserDependency extends IDependency {
+	/**
+	 * Returns the value of the '<em><b>User</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>User</em>' reference.
+	 * @see #setUser(IUser)
+	 * @see org.eclipse.skills.model.ISkillsPackage#getUserDependency_User()
+	 * @model resolveProxies="false" transient="true" ordered="false"
+	 * @generated
+	 */
+	IUser getUser();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.skills.model.IUserDependency#getUser <em>User</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>User</em>' reference.
+	 * @see #getUser()
+	 * @generated
+	 */
+	void setUser(IUser value);
+
+} // IUserDependency
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/IUserTask.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/IUserTask.java
index 3cef709..9e1b9b9 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/IUserTask.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/IUserTask.java
@@ -140,7 +140,7 @@
 	 * @model
 	 * @generated
 	 */
-	void start();
+	void activate();
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MCompleteIncludedTasksDependency.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MCompleteIncludedTasksDependency.java
index a698f48..1b5d18d 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MCompleteIncludedTasksDependency.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MCompleteIncludedTasksDependency.java
@@ -11,7 +11,7 @@
  *
  * @generated
  */
-public class MCompleteIncludedTasksDependency extends MDependency implements ICompleteIncludedTasksDependency {
+public class MCompleteIncludedTasksDependency extends MUserDependency implements ICompleteIncludedTasksDependency {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MNotDependency.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MNotDependency.java
index a9b2724..862dfd3 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MNotDependency.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MNotDependency.java
@@ -40,7 +40,7 @@
 	public void evaluateDependencies() {
 		if (!getDependencies().isEmpty())
 			setFulfilled(!getDependencies().get(0).isFulfilled());
-
-		setFulfilled(false);
+		else
+			setFulfilled(false);
 	}
 } // MNotDependency
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSequenceDependency.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSequenceDependency.java
index be9aba4..85800ad 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSequenceDependency.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSequenceDependency.java
@@ -2,8 +2,6 @@
  */
 package org.eclipse.skills.model.impl;
 
-import java.util.Optional;
-
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.skills.model.IDependency;
 import org.eclipse.skills.model.ISequenceDependency;
@@ -15,8 +13,12 @@
  * @generated
  */
 public class MSequenceDependency extends MAndDependency implements ISequenceDependency {
+
+	private int fIndexOfActiveChildDependency = 0;
+
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	protected MSequenceDependency() {
@@ -25,6 +27,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
@@ -32,13 +35,42 @@
 		return ISkillsPackage.Literals.SEQUENCE_DEPENDENCY;
 	}
 
+	/**
+	 * @generated NOT
+	 */
 	@Override
 	public void activate() {
-		deactivate();
+		activateNextDependency();
+		evaluateDependencies();
+	}
 
-		final Optional<IDependency> nextDependency = getDependencies().stream().filter(d -> !d.isFulfilled()).findFirst();
-		if (nextDependency.isPresent())
-			nextDependency.get().eAdapters().add(getChangeAdapter());
+	/**
+	 * @generated NOT
+	 */
+	@Override
+	public void evaluateDependencies() {
+		for (int index = fIndexOfActiveChildDependency; index < getDependencies().size(); index++) {
+			if (!getDependencies().get(index).isFulfilled()) {
+				setFulfilled(false);
+				return;
+			} else {
+				fIndexOfActiveChildDependency = index + 1;
+				activateNextDependency();
+			}
+		}
+
+		setFulfilled(true);
+	}
+
+	/**
+	 * @generated NOT
+	 */
+	private void activateNextDependency() {
+		if (fIndexOfActiveChildDependency < getDependencies().size()) {
+			final IDependency nextDependency = getDependencies().get(fIndexOfActiveChildDependency);
+			nextDependency.eAdapters().add(getChangeAdapter());
+			nextDependency.activate();
+		}
 	}
 
 } // MSequenceDependency
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkillDependency.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkillDependency.java
index 8fe32e3..775ade2 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkillDependency.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkillDependency.java
@@ -23,7 +23,7 @@
  *
  * @generated
  */
-public class MSkillDependency extends MDependency implements ISkillDependency {
+public class MSkillDependency extends MUserDependency implements ISkillDependency {
 	/**
 	 * The default value of the '{@link #getMinExperience() <em>Min Experience</em>}' attribute.
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkillsPackage.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkillsPackage.java
index 81a25b2..ae14731 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkillsPackage.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkillsPackage.java
@@ -40,6 +40,7 @@
 import org.eclipse.skills.model.ITask;
 import org.eclipse.skills.model.ITaskDependency;
 import org.eclipse.skills.model.IUser;
+import org.eclipse.skills.model.IUserDependency;
 import org.eclipse.skills.model.IUserTask;
 import org.eclipse.skills.model.LevelNames;
 import org.eclipse.skills.service.ISkillService;
@@ -225,6 +226,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	private EClass userDependencyEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	private EEnum levelNamesEEnum = null;
 
 	/**
@@ -772,7 +780,7 @@
 	 * @generated
 	 */
 	@Override
-	public EOperation getUserTask__Start() {
+	public EOperation getUserTask__Activate() {
 		return userTaskEClass.getEOperations().get(1);
 	}
 
@@ -1212,6 +1220,26 @@
 	 * @generated
 	 */
 	@Override
+	public EClass getUserDependency() {
+		return userDependencyEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EReference getUserDependency_User() {
+		return (EReference)userDependencyEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EEnum getLevelNames() {
 		return levelNamesEEnum;
 	}
@@ -1336,7 +1364,7 @@
 		createEAttribute(userTaskEClass, USER_TASK__HINTS_DISPLAYED);
 		createEAttribute(userTaskEClass, USER_TASK__ADDED);
 		createEOperation(userTaskEClass, USER_TASK___IS_COMPLETED);
-		createEOperation(userTaskEClass, USER_TASK___START);
+		createEOperation(userTaskEClass, USER_TASK___ACTIVATE);
 		createEOperation(userTaskEClass, USER_TASK___GET_USER);
 		createEOperation(userTaskEClass, USER_TASK___IS_STARTED);
 		createEOperation(userTaskEClass, USER_TASK___REVEAL_NEXT_HINT);
@@ -1398,6 +1426,9 @@
 		hintEClass = createEClass(HINT);
 		createEAttribute(hintEClass, HINT__PENALTY);
 
+		userDependencyEClass = createEClass(USER_DEPENDENCY);
+		createEReference(userDependencyEClass, USER_DEPENDENCY__USER);
+
 		// Create enums
 		levelNamesEEnum = createEEnum(LEVEL_NAMES);
 
@@ -1447,10 +1478,11 @@
 		customDependencyEClass.getESuperTypes().add(this.getDependency());
 		dependencyWithAttributesEClass.getESuperTypes().add(this.getDependency());
 		sequenceDependencyEClass.getESuperTypes().add(this.getAndDependency());
-		completeIncludedTasksDependencyEClass.getESuperTypes().add(this.getDependency());
-		taskDependencyEClass.getESuperTypes().add(this.getDependency());
-		skillDependencyEClass.getESuperTypes().add(this.getDependency());
+		completeIncludedTasksDependencyEClass.getESuperTypes().add(this.getUserDependency());
+		taskDependencyEClass.getESuperTypes().add(this.getUserDependency());
+		skillDependencyEClass.getESuperTypes().add(this.getUserDependency());
 		hintEClass.getESuperTypes().add(this.getDescription());
+		userDependencyEClass.getESuperTypes().add(this.getDependency());
 
 		// Initialize classes, features, and operations; add parameters
 		initEClass(taskEClass, ITask.class, "Task", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
@@ -1520,7 +1552,7 @@
 
 		initEOperation(getUserTask__IsCompleted(), ecorePackage.getEBoolean(), "isCompleted", 0, 1, IS_UNIQUE, IS_ORDERED);
 
-		initEOperation(getUserTask__Start(), null, "start", 0, 1, IS_UNIQUE, IS_ORDERED);
+		initEOperation(getUserTask__Activate(), null, "activate", 0, 1, IS_UNIQUE, IS_ORDERED);
 
 		initEOperation(getUserTask__GetUser(), this.getUser(), "getUser", 0, 1, IS_UNIQUE, IS_ORDERED);
 
@@ -1590,6 +1622,9 @@
 		initEClass(hintEClass, IHint.class, "Hint", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEAttribute(getHint_Penalty(), ecorePackage.getEInt(), "penalty", "10", 0, 1, IHint.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		initEClass(userDependencyEClass, IUserDependency.class, "UserDependency", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getUserDependency_User(), this.getUser(), null, "user", null, 0, 1, IUserDependency.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
+
 		// Initialize enums and add enum literals
 		initEEnum(levelNamesEEnum, LevelNames.class, "LevelNames");
 		addEEnumLiteral(levelNamesEEnum, LevelNames.APPRENTICE);
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MTaskDependency.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MTaskDependency.java
index c1b5562..3de355c 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MTaskDependency.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MTaskDependency.java
@@ -3,12 +3,14 @@
 package org.eclipse.skills.model.impl;
 
 import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.skills.model.ISkillsPackage;
 import org.eclipse.skills.model.ITask;
 import org.eclipse.skills.model.ITaskDependency;
+import org.eclipse.skills.model.IUserTask;
 
 /**
  * <!-- begin-user-doc --> An implementation of the model object '<em><b>Task Dependency</b></em>'. <!-- end-user-doc -->
@@ -22,7 +24,7 @@
  *
  * @generated
  */
-public class MTaskDependency extends MDependency implements ITaskDependency {
+public class MTaskDependency extends MUserDependency implements ITaskDependency {
 	/**
 	 * The cached value of the '{@link #getTask() <em>Task</em>}' reference.
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
@@ -205,4 +207,57 @@
 		return result.toString();
 	}
 
+	/**
+	 * @generated NOT
+	 */
+	@Override
+	public void activate() {
+		final IUserTask usertask = getUsertask();
+		if (usertask != null) {
+			setFulfilled((usertask.isCompleted() && isCompleted()) || (usertask.isStarted() && !isCompleted()));
+
+			if (!isFulfilled()) {
+				usertask.eAdapters().add(new AdapterImpl() {
+					@Override
+					public void notifyChanged(Notification msg) {
+						if (usertask.equals(msg.getNotifier())) {
+							if ((ISkillsPackage.eINSTANCE.getUserTask_Started().equals(msg.getFeature()))
+									|| (ISkillsPackage.eINSTANCE.getUserTask_Finished().equals(msg.getFeature()))) {
+								usertask.eAdapters().remove(this);
+								// re-evaluate
+								activate();
+							}
+						}
+					}
+				});
+			}
+
+		} else {
+			getUser().eAdapters().add(new AdapterImpl() {
+				@Override
+				public void notifyChanged(Notification msg) {
+					if (ISkillsPackage.eINSTANCE.getUser_Usertasks().equals(msg.getFeature())) {
+						if (getUsertask() != null) {
+							getUser().eAdapters().remove(this);
+							// re-evaluate
+							activate();
+						}
+					}
+				}
+			});
+		}
+	}
+
+	/**
+	 * @generated NOT
+	 */
+	private IUserTask getUsertask() {
+		for (final IUserTask usertask : getUser().getUsertasks()) {
+			if (usertask.getTask().equals(getTask()))
+				return usertask;
+		}
+
+		return null;
+	}
+
 } // MTaskDependency
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MUser.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MUser.java
index 48baca5..f798a69 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MUser.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MUser.java
@@ -38,20 +38,20 @@
  * The following features are implemented:
  * </p>
  * <ul>
- * <li>{@link org.eclipse.skills.model.impl.MUser#getName <em>Name</em>}</li>
- * <li>{@link org.eclipse.skills.model.impl.MUser#getSkills <em>Skills</em>}</li>
- * <li>{@link org.eclipse.skills.model.impl.MUser#getUsertasks <em>Usertasks</em>}</li>
- * <li>{@link org.eclipse.skills.model.impl.MUser#getImageLocation <em>Image Location</em>}</li>
- * <li>{@link org.eclipse.skills.model.impl.MUser#getExperience <em>Experience</em>}</li>
- * <li>{@link org.eclipse.skills.model.impl.MUser#getBadges <em>Badges</em>}</li>
+ *   <li>{@link org.eclipse.skills.model.impl.MUser#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.skills.model.impl.MUser#getSkills <em>Skills</em>}</li>
+ *   <li>{@link org.eclipse.skills.model.impl.MUser#getUsertasks <em>Usertasks</em>}</li>
+ *   <li>{@link org.eclipse.skills.model.impl.MUser#getImageLocation <em>Image Location</em>}</li>
+ *   <li>{@link org.eclipse.skills.model.impl.MUser#getExperience <em>Experience</em>}</li>
+ *   <li>{@link org.eclipse.skills.model.impl.MUser#getBadges <em>Badges</em>}</li>
  * </ul>
  *
  * @generated
  */
 public class MUser extends MinimalEObjectImpl.Container implements IUser {
 	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @see #getName()
 	 * @generated
 	 * @ordered
@@ -59,8 +59,8 @@
 	protected static final String NAME_EDEFAULT = null;
 
 	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @see #getName()
 	 * @generated
 	 * @ordered
@@ -68,8 +68,8 @@
 	protected String name = NAME_EDEFAULT;
 
 	/**
-	 * The cached value of the '{@link #getSkills() <em>Skills</em>}' containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
+	 * The cached value of the '{@link #getSkills() <em>Skills</em>}' containment reference list.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @see #getSkills()
 	 * @generated
 	 * @ordered
@@ -77,8 +77,8 @@
 	protected EList<ISkill> skills;
 
 	/**
-	 * The cached value of the '{@link #getUsertasks() <em>Usertasks</em>}' containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
+	 * The cached value of the '{@link #getUsertasks() <em>Usertasks</em>}' containment reference list.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @see #getUsertasks()
 	 * @generated
 	 * @ordered
@@ -86,8 +86,8 @@
 	protected EList<IUserTask> usertasks;
 
 	/**
-	 * The default value of the '{@link #getImageLocation() <em>Image Location</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
+	 * The default value of the '{@link #getImageLocation() <em>Image Location</em>}' attribute.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @see #getImageLocation()
 	 * @generated
 	 * @ordered
@@ -95,8 +95,8 @@
 	protected static final String IMAGE_LOCATION_EDEFAULT = null;
 
 	/**
-	 * The cached value of the '{@link #getImageLocation() <em>Image Location</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
+	 * The cached value of the '{@link #getImageLocation() <em>Image Location</em>}' attribute.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @see #getImageLocation()
 	 * @generated
 	 * @ordered
@@ -104,8 +104,8 @@
 	protected String imageLocation = IMAGE_LOCATION_EDEFAULT;
 
 	/**
-	 * The cached value of the '{@link #getExperience() <em>Experience</em>}' containment reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
+	 * The cached value of the '{@link #getExperience() <em>Experience</em>}' containment reference.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @see #getExperience()
 	 * @generated
 	 * @ordered
@@ -113,8 +113,8 @@
 	protected ISkill experience;
 
 	/**
-	 * The cached value of the '{@link #getBadges() <em>Badges</em>}' containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
+	 * The cached value of the '{@link #getBadges() <em>Badges</em>}' containment reference list.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @see #getBadges()
 	 * @generated
 	 * @ordered
@@ -123,7 +123,6 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	protected MUser() {
@@ -132,7 +131,6 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
@@ -142,7 +140,6 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
@@ -152,12 +149,11 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
 	public void setName(String newName) {
-		final String oldName = name;
+		String oldName = name;
 		name = newName;
 		if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET, ISkillsPackage.USER__NAME, oldName, name));
@@ -165,33 +161,30 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
 	public EList<ISkill> getSkills() {
 		if (skills == null) {
-			skills = new EObjectContainmentEList<>(ISkill.class, this, ISkillsPackage.USER__SKILLS);
+			skills = new EObjectContainmentEList<ISkill>(ISkill.class, this, ISkillsPackage.USER__SKILLS);
 		}
 		return skills;
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
 	public EList<IUserTask> getUsertasks() {
 		if (usertasks == null) {
-			usertasks = new EObjectContainmentEList<>(IUserTask.class, this, ISkillsPackage.USER__USERTASKS);
+			usertasks = new EObjectContainmentEList<IUserTask>(IUserTask.class, this, ISkillsPackage.USER__USERTASKS);
 		}
 		return usertasks;
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
@@ -201,12 +194,11 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
 	public void setImageLocation(String newImageLocation) {
-		final String oldImageLocation = imageLocation;
+		String oldImageLocation = imageLocation;
 		imageLocation = newImageLocation;
 		if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET, ISkillsPackage.USER__IMAGE_LOCATION, oldImageLocation, imageLocation));
@@ -214,7 +206,6 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
@@ -224,25 +215,20 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	public NotificationChain basicSetExperience(ISkill newExperience, NotificationChain msgs) {
-		final ISkill oldExperience = experience;
+		ISkill oldExperience = experience;
 		experience = newExperience;
 		if (eNotificationRequired()) {
-			final ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ISkillsPackage.USER__EXPERIENCE, oldExperience, newExperience);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ISkillsPackage.USER__EXPERIENCE, oldExperience, newExperience);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
 		return msgs;
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
@@ -250,25 +236,24 @@
 		if (newExperience != experience) {
 			NotificationChain msgs = null;
 			if (experience != null)
-				msgs = ((InternalEObject) experience).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ISkillsPackage.USER__EXPERIENCE, null, msgs);
+				msgs = ((InternalEObject)experience).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ISkillsPackage.USER__EXPERIENCE, null, msgs);
 			if (newExperience != null)
-				msgs = ((InternalEObject) newExperience).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ISkillsPackage.USER__EXPERIENCE, null, msgs);
+				msgs = ((InternalEObject)newExperience).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ISkillsPackage.USER__EXPERIENCE, null, msgs);
 			msgs = basicSetExperience(newExperience, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET, ISkillsPackage.USER__EXPERIENCE, newExperience, newExperience));
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
 	public EList<IBadge> getBadges() {
 		if (badges == null) {
-			badges = new EObjectContainmentEList<>(IBadge.class, this, ISkillsPackage.USER__BADGES);
+			badges = new EObjectContainmentEList<IBadge>(IBadge.class, this, ISkillsPackage.USER__BADGES);
 		}
 		return badges;
 	}
@@ -349,168 +334,160 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
 		switch (featureID) {
-		case ISkillsPackage.USER__SKILLS:
-			return ((InternalEList<?>) getSkills()).basicRemove(otherEnd, msgs);
-		case ISkillsPackage.USER__USERTASKS:
-			return ((InternalEList<?>) getUsertasks()).basicRemove(otherEnd, msgs);
-		case ISkillsPackage.USER__EXPERIENCE:
-			return basicSetExperience(null, msgs);
-		case ISkillsPackage.USER__BADGES:
-			return ((InternalEList<?>) getBadges()).basicRemove(otherEnd, msgs);
+			case ISkillsPackage.USER__SKILLS:
+				return ((InternalEList<?>)getSkills()).basicRemove(otherEnd, msgs);
+			case ISkillsPackage.USER__USERTASKS:
+				return ((InternalEList<?>)getUsertasks()).basicRemove(otherEnd, msgs);
+			case ISkillsPackage.USER__EXPERIENCE:
+				return basicSetExperience(null, msgs);
+			case ISkillsPackage.USER__BADGES:
+				return ((InternalEList<?>)getBadges()).basicRemove(otherEnd, msgs);
 		}
 		return super.eInverseRemove(otherEnd, featureID, msgs);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-		case ISkillsPackage.USER__NAME:
-			return getName();
-		case ISkillsPackage.USER__SKILLS:
-			return getSkills();
-		case ISkillsPackage.USER__USERTASKS:
-			return getUsertasks();
-		case ISkillsPackage.USER__IMAGE_LOCATION:
-			return getImageLocation();
-		case ISkillsPackage.USER__EXPERIENCE:
-			return getExperience();
-		case ISkillsPackage.USER__BADGES:
-			return getBadges();
+			case ISkillsPackage.USER__NAME:
+				return getName();
+			case ISkillsPackage.USER__SKILLS:
+				return getSkills();
+			case ISkillsPackage.USER__USERTASKS:
+				return getUsertasks();
+			case ISkillsPackage.USER__IMAGE_LOCATION:
+				return getImageLocation();
+			case ISkillsPackage.USER__EXPERIENCE:
+				return getExperience();
+			case ISkillsPackage.USER__BADGES:
+				return getBadges();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@SuppressWarnings("unchecked")
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-		case ISkillsPackage.USER__NAME:
-			setName((String) newValue);
-			return;
-		case ISkillsPackage.USER__SKILLS:
-			getSkills().clear();
-			getSkills().addAll((Collection<? extends ISkill>) newValue);
-			return;
-		case ISkillsPackage.USER__USERTASKS:
-			getUsertasks().clear();
-			getUsertasks().addAll((Collection<? extends IUserTask>) newValue);
-			return;
-		case ISkillsPackage.USER__IMAGE_LOCATION:
-			setImageLocation((String) newValue);
-			return;
-		case ISkillsPackage.USER__EXPERIENCE:
-			setExperience((ISkill) newValue);
-			return;
-		case ISkillsPackage.USER__BADGES:
-			getBadges().clear();
-			getBadges().addAll((Collection<? extends IBadge>) newValue);
-			return;
+			case ISkillsPackage.USER__NAME:
+				setName((String)newValue);
+				return;
+			case ISkillsPackage.USER__SKILLS:
+				getSkills().clear();
+				getSkills().addAll((Collection<? extends ISkill>)newValue);
+				return;
+			case ISkillsPackage.USER__USERTASKS:
+				getUsertasks().clear();
+				getUsertasks().addAll((Collection<? extends IUserTask>)newValue);
+				return;
+			case ISkillsPackage.USER__IMAGE_LOCATION:
+				setImageLocation((String)newValue);
+				return;
+			case ISkillsPackage.USER__EXPERIENCE:
+				setExperience((ISkill)newValue);
+				return;
+			case ISkillsPackage.USER__BADGES:
+				getBadges().clear();
+				getBadges().addAll((Collection<? extends IBadge>)newValue);
+				return;
 		}
 		super.eSet(featureID, newValue);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-		case ISkillsPackage.USER__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case ISkillsPackage.USER__SKILLS:
-			getSkills().clear();
-			return;
-		case ISkillsPackage.USER__USERTASKS:
-			getUsertasks().clear();
-			return;
-		case ISkillsPackage.USER__IMAGE_LOCATION:
-			setImageLocation(IMAGE_LOCATION_EDEFAULT);
-			return;
-		case ISkillsPackage.USER__EXPERIENCE:
-			setExperience((ISkill) null);
-			return;
-		case ISkillsPackage.USER__BADGES:
-			getBadges().clear();
-			return;
+			case ISkillsPackage.USER__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+			case ISkillsPackage.USER__SKILLS:
+				getSkills().clear();
+				return;
+			case ISkillsPackage.USER__USERTASKS:
+				getUsertasks().clear();
+				return;
+			case ISkillsPackage.USER__IMAGE_LOCATION:
+				setImageLocation(IMAGE_LOCATION_EDEFAULT);
+				return;
+			case ISkillsPackage.USER__EXPERIENCE:
+				setExperience((ISkill)null);
+				return;
+			case ISkillsPackage.USER__BADGES:
+				getBadges().clear();
+				return;
 		}
 		super.eUnset(featureID);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-		case ISkillsPackage.USER__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-		case ISkillsPackage.USER__SKILLS:
-			return (skills != null) && !skills.isEmpty();
-		case ISkillsPackage.USER__USERTASKS:
-			return (usertasks != null) && !usertasks.isEmpty();
-		case ISkillsPackage.USER__IMAGE_LOCATION:
-			return IMAGE_LOCATION_EDEFAULT == null ? imageLocation != null : !IMAGE_LOCATION_EDEFAULT.equals(imageLocation);
-		case ISkillsPackage.USER__EXPERIENCE:
-			return experience != null;
-		case ISkillsPackage.USER__BADGES:
-			return (badges != null) && !badges.isEmpty();
+			case ISkillsPackage.USER__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+			case ISkillsPackage.USER__SKILLS:
+				return skills != null && !skills.isEmpty();
+			case ISkillsPackage.USER__USERTASKS:
+				return usertasks != null && !usertasks.isEmpty();
+			case ISkillsPackage.USER__IMAGE_LOCATION:
+				return IMAGE_LOCATION_EDEFAULT == null ? imageLocation != null : !IMAGE_LOCATION_EDEFAULT.equals(imageLocation);
+			case ISkillsPackage.USER__EXPERIENCE:
+				return experience != null;
+			case ISkillsPackage.USER__BADGES:
+				return badges != null && !badges.isEmpty();
 		}
 		return super.eIsSet(featureID);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
 		switch (operationID) {
-		case ISkillsPackage.USER___ADD_TASK__ITASK:
-			return addTask((ITask) arguments.get(0));
-		case ISkillsPackage.USER___GET_SKILL__ISKILL:
-			return getSkill((ISkill) arguments.get(0));
-		case ISkillsPackage.USER___CONSUME__IREWARD:
-			consume((IReward) arguments.get(0));
-			return null;
-		case ISkillsPackage.USER___GET_AVATAR:
-			return getAvatar();
+			case ISkillsPackage.USER___ADD_TASK__ITASK:
+				return addTask((ITask)arguments.get(0));
+			case ISkillsPackage.USER___GET_SKILL__ISKILL:
+				return getSkill((ISkill)arguments.get(0));
+			case ISkillsPackage.USER___CONSUME__IREWARD:
+				consume((IReward)arguments.get(0));
+				return null;
+			case ISkillsPackage.USER___GET_AVATAR:
+				return getAvatar();
 		}
 		return super.eInvoke(operationID, arguments);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
 	 * @generated
 	 */
 	@Override
 	public String toString() {
-		if (eIsProxy())
-			return super.toString();
+		if (eIsProxy()) return super.toString();
 
-		final StringBuilder result = new StringBuilder(super.toString());
+		StringBuilder result = new StringBuilder(super.toString());
 		result.append(" (name: ");
 		result.append(name);
 		result.append(", imageLocation: ");
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MUserDependency.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MUserDependency.java
new file mode 100644
index 0000000..92ad9d3
--- /dev/null
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MUserDependency.java
@@ -0,0 +1,163 @@
+/**
+ */
+package org.eclipse.skills.model.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.skills.model.ISkillsPackage;
+import org.eclipse.skills.model.IUser;
+import org.eclipse.skills.model.IUserDependency;
+import org.eclipse.skills.service.ISkillService;
+import org.eclipse.skills.service.SkillService;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * <!-- begin-user-doc --> An implementation of the model object '<em><b>User Dependency</b></em>'. <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.skills.model.impl.MUserDependency#getUser <em>User</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class MUserDependency extends MDependency implements IUserDependency {
+	/**
+	 * The cached value of the '{@link #getUser() <em>User</em>}' reference. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
+	 * @see #getUser()
+	 * @generated
+	 * @ordered
+	 */
+	protected IUser user;
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
+	 * @generated
+	 */
+	protected MUserDependency() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ISkillsPackage.Literals.USER_DEPENDENCY;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
+	 * @generated
+	 */
+	public IUser getUserGen() {
+		return user;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
+	 * @generated NOT
+	 */
+	@Override
+	public IUser getUser() {
+		final IUser result = getUserGen();
+		if (result != null)
+			return result;
+
+		final ISkillService service = getSkillService();
+		if (service != null)
+			return service.getUser();
+
+		throw new RuntimeException("User context not available");
+	}
+
+	/**
+	 * @generated NOT
+	 */
+	private static ISkillService getSkillService() {
+		if (PlatformUI.isWorkbenchRunning())
+			return PlatformUI.getWorkbench().getService(ISkillService.class);
+
+		return SkillService.getInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
+	 * @generated
+	 */
+	@Override
+	public void setUser(IUser newUser) {
+		final IUser oldUser = user;
+		user = newUser;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ISkillsPackage.USER_DEPENDENCY__USER, oldUser, user));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+		case ISkillsPackage.USER_DEPENDENCY__USER:
+			return getUser();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+		case ISkillsPackage.USER_DEPENDENCY__USER:
+			setUser((IUser) newValue);
+			return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+		case ISkillsPackage.USER_DEPENDENCY__USER:
+			setUser((IUser) null);
+			return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+		case ISkillsPackage.USER_DEPENDENCY__USER:
+			return user != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} // MUserDependency
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MUserTask.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MUserTask.java
index 9e79345..36000d0 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MUserTask.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MUserTask.java
@@ -5,7 +5,6 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Date;
 
-import org.eclipse.e4.core.services.events.IEventBroker;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.impl.AdapterImpl;
 import org.eclipse.emf.common.util.EList;
@@ -13,13 +12,13 @@
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.eclipse.skills.BrokerTools;
 import org.eclipse.skills.model.IReward;
 import org.eclipse.skills.model.ISkillsPackage;
 import org.eclipse.skills.model.ITask;
 import org.eclipse.skills.model.IUser;
 import org.eclipse.skills.model.IUserTask;
 import org.eclipse.skills.service.ISkillService;
-import org.eclipse.ui.PlatformUI;
 
 /**
  * <!-- begin-user-doc --> An implementation of the model object '<em><b>User Task</b></em>'. <!-- end-user-doc -->
@@ -27,19 +26,19 @@
  * The following features are implemented:
  * </p>
  * <ul>
- *   <li>{@link org.eclipse.skills.model.impl.MUserTask#getTask <em>Task</em>}</li>
- *   <li>{@link org.eclipse.skills.model.impl.MUserTask#getStarted <em>Started</em>}</li>
- *   <li>{@link org.eclipse.skills.model.impl.MUserTask#getFinished <em>Finished</em>}</li>
- *   <li>{@link org.eclipse.skills.model.impl.MUserTask#getHintsDisplayed <em>Hints Displayed</em>}</li>
- *   <li>{@link org.eclipse.skills.model.impl.MUserTask#getAdded <em>Added</em>}</li>
+ * <li>{@link org.eclipse.skills.model.impl.MUserTask#getTask <em>Task</em>}</li>
+ * <li>{@link org.eclipse.skills.model.impl.MUserTask#getStarted <em>Started</em>}</li>
+ * <li>{@link org.eclipse.skills.model.impl.MUserTask#getFinished <em>Finished</em>}</li>
+ * <li>{@link org.eclipse.skills.model.impl.MUserTask#getHintsDisplayed <em>Hints Displayed</em>}</li>
+ * <li>{@link org.eclipse.skills.model.impl.MUserTask#getAdded <em>Added</em>}</li>
  * </ul>
  *
  * @generated
  */
 public class MUserTask extends MinimalEObjectImpl.Container implements IUserTask {
 	/**
-	 * The cached value of the '{@link #getTask() <em>Task</em>}' reference.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * The cached value of the '{@link #getTask() <em>Task</em>}' reference. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @see #getTask()
 	 * @generated
 	 * @ordered
@@ -47,8 +46,8 @@
 	protected ITask task;
 
 	/**
-	 * The default value of the '{@link #getStarted() <em>Started</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * The default value of the '{@link #getStarted() <em>Started</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @see #getStarted()
 	 * @generated
 	 * @ordered
@@ -56,8 +55,8 @@
 	protected static final Date STARTED_EDEFAULT = null;
 
 	/**
-	 * The cached value of the '{@link #getStarted() <em>Started</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * The cached value of the '{@link #getStarted() <em>Started</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @see #getStarted()
 	 * @generated
 	 * @ordered
@@ -65,8 +64,8 @@
 	protected Date started = STARTED_EDEFAULT;
 
 	/**
-	 * The default value of the '{@link #getFinished() <em>Finished</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * The default value of the '{@link #getFinished() <em>Finished</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @see #getFinished()
 	 * @generated
 	 * @ordered
@@ -74,8 +73,8 @@
 	protected static final Date FINISHED_EDEFAULT = null;
 
 	/**
-	 * The cached value of the '{@link #getFinished() <em>Finished</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * The cached value of the '{@link #getFinished() <em>Finished</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @see #getFinished()
 	 * @generated
 	 * @ordered
@@ -83,8 +82,8 @@
 	protected Date finished = FINISHED_EDEFAULT;
 
 	/**
-	 * The default value of the '{@link #getHintsDisplayed() <em>Hints Displayed</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * The default value of the '{@link #getHintsDisplayed() <em>Hints Displayed</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @see #getHintsDisplayed()
 	 * @generated
 	 * @ordered
@@ -92,8 +91,8 @@
 	protected static final int HINTS_DISPLAYED_EDEFAULT = 0;
 
 	/**
-	 * The cached value of the '{@link #getHintsDisplayed() <em>Hints Displayed</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * The cached value of the '{@link #getHintsDisplayed() <em>Hints Displayed</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @see #getHintsDisplayed()
 	 * @generated
 	 * @ordered
@@ -101,8 +100,8 @@
 	protected int hintsDisplayed = HINTS_DISPLAYED_EDEFAULT;
 
 	/**
-	 * The default value of the '{@link #getAdded() <em>Added</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * The default value of the '{@link #getAdded() <em>Added</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @see #getAdded()
 	 * @generated
 	 * @ordered
@@ -110,8 +109,8 @@
 	protected static final Date ADDED_EDEFAULT = null;
 
 	/**
-	 * The cached value of the '{@link #getAdded() <em>Added</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * The cached value of the '{@link #getAdded() <em>Added</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @see #getAdded()
 	 * @generated
 	 * @ordered
@@ -120,6 +119,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	protected MUserTask() {
@@ -128,6 +128,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
@@ -137,13 +138,14 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
 	public ITask getTask() {
-		if (task != null && task.eIsProxy()) {
-			InternalEObject oldTask = (InternalEObject)task;
-			task = (ITask)eResolveProxy(oldTask);
+		if ((task != null) && task.eIsProxy()) {
+			final InternalEObject oldTask = (InternalEObject) task;
+			task = (ITask) eResolveProxy(oldTask);
 			if (task != oldTask) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ISkillsPackage.USER_TASK__TASK, oldTask, task));
@@ -154,6 +156,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	public ITask basicGetTask() {
@@ -162,11 +165,12 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
 	public void setTask(ITask newTask) {
-		ITask oldTask = task;
+		final ITask oldTask = task;
 		task = newTask;
 		if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET, ISkillsPackage.USER_TASK__TASK, oldTask, task));
@@ -174,6 +178,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
@@ -183,11 +188,11 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
-	@Override
-	public void setStarted(Date newStarted) {
-		Date oldStarted = started;
+	public void setStartedGen(Date newStarted) {
+		final Date oldStarted = started;
 		started = newStarted;
 		if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET, ISkillsPackage.USER_TASK__STARTED, oldStarted, started));
@@ -195,6 +200,19 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
+	 * @generated NOT
+	 */
+	@Override
+	public void setStarted(Date newStarted) {
+		setStartedGen(newStarted);
+
+		BrokerTools.post(ISkillService.EVENT_TASK_STARTED, this);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
@@ -204,11 +222,12 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
 	public void setFinished(Date newFinished) {
-		Date oldFinished = finished;
+		final Date oldFinished = finished;
 		finished = newFinished;
 		if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET, ISkillsPackage.USER_TASK__FINISHED, oldFinished, finished));
@@ -216,6 +235,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
@@ -225,11 +245,12 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
 	public void setHintsDisplayed(int newHintsDisplayed) {
-		int oldHintsDisplayed = hintsDisplayed;
+		final int oldHintsDisplayed = hintsDisplayed;
 		hintsDisplayed = newHintsDisplayed;
 		if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET, ISkillsPackage.USER_TASK__HINTS_DISPLAYED, oldHintsDisplayed, hintsDisplayed));
@@ -237,6 +258,7 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
@@ -260,34 +282,28 @@
 	 * @generated NOT
 	 */
 	@Override
-	public void start() {
-		setStarted(new Date());
+	public void activate() {
+		if (isStarted()) {
+			getTask().getGoal().eAdapters().add(new AdapterImpl() {
+				@Override
+				public void notifyChanged(Notification msg) {
+					if (ISkillsPackage.eINSTANCE.getDependency_Fulfilled().equals(msg.getFeature())) {
+						if (msg.getNewBooleanValue()) {
+							getTask().getGoal().deactivate();
+							setFinished(new Date());
 
-		final IEventBroker service = PlatformUI.getWorkbench().getService(IEventBroker.class);
-		if (service != null)
-			service.post(ISkillService.EVENT_TASK_STARTED, this);
+							BrokerTools.post(ISkillService.EVENT_TASK_COMPLETED, MUserTask.this);
 
-		getTask().getGoal().eAdapters().add(new AdapterImpl() {
-			@Override
-			public void notifyChanged(Notification msg) {
-				if (ISkillsPackage.eINSTANCE.getDependency_Fulfilled().equals(msg.getFeature())) {
-					if (msg.getNewBooleanValue()) {
-						setFinished(new Date());
-
-						getTask().getGoal().deactivate();
-
-						final IEventBroker service = PlatformUI.getWorkbench().getService(IEventBroker.class);
-						if (service != null)
-							service.post(ISkillService.EVENT_TASK_COMPLETED, MUserTask.this);
-
-						for (final IReward reward : getTask().getRewards())
-							getUser().consume(reward);
+							// TODO move this logic to the service, its not model related
+							for (final IReward reward : getTask().getRewards())
+								getUser().consume(reward);
+						}
 					}
-				}
-			};
-		});
+				};
+			});
 
-		getTask().getGoal().activate();
+			getTask().getGoal().activate();
+		}
 	}
 
 	/**
@@ -323,125 +339,133 @@
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case ISkillsPackage.USER_TASK__TASK:
-				if (resolve) return getTask();
-				return basicGetTask();
-			case ISkillsPackage.USER_TASK__STARTED:
-				return getStarted();
-			case ISkillsPackage.USER_TASK__FINISHED:
-				return getFinished();
-			case ISkillsPackage.USER_TASK__HINTS_DISPLAYED:
-				return getHintsDisplayed();
-			case ISkillsPackage.USER_TASK__ADDED:
-				return getAdded();
+		case ISkillsPackage.USER_TASK__TASK:
+			if (resolve)
+				return getTask();
+			return basicGetTask();
+		case ISkillsPackage.USER_TASK__STARTED:
+			return getStarted();
+		case ISkillsPackage.USER_TASK__FINISHED:
+			return getFinished();
+		case ISkillsPackage.USER_TASK__HINTS_DISPLAYED:
+			return getHintsDisplayed();
+		case ISkillsPackage.USER_TASK__ADDED:
+			return getAdded();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case ISkillsPackage.USER_TASK__TASK:
-				setTask((ITask)newValue);
-				return;
-			case ISkillsPackage.USER_TASK__STARTED:
-				setStarted((Date)newValue);
-				return;
-			case ISkillsPackage.USER_TASK__FINISHED:
-				setFinished((Date)newValue);
-				return;
-			case ISkillsPackage.USER_TASK__HINTS_DISPLAYED:
-				setHintsDisplayed((Integer)newValue);
-				return;
+		case ISkillsPackage.USER_TASK__TASK:
+			setTask((ITask) newValue);
+			return;
+		case ISkillsPackage.USER_TASK__STARTED:
+			setStarted((Date) newValue);
+			return;
+		case ISkillsPackage.USER_TASK__FINISHED:
+			setFinished((Date) newValue);
+			return;
+		case ISkillsPackage.USER_TASK__HINTS_DISPLAYED:
+			setHintsDisplayed((Integer) newValue);
+			return;
 		}
 		super.eSet(featureID, newValue);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case ISkillsPackage.USER_TASK__TASK:
-				setTask((ITask)null);
-				return;
-			case ISkillsPackage.USER_TASK__STARTED:
-				setStarted(STARTED_EDEFAULT);
-				return;
-			case ISkillsPackage.USER_TASK__FINISHED:
-				setFinished(FINISHED_EDEFAULT);
-				return;
-			case ISkillsPackage.USER_TASK__HINTS_DISPLAYED:
-				setHintsDisplayed(HINTS_DISPLAYED_EDEFAULT);
-				return;
+		case ISkillsPackage.USER_TASK__TASK:
+			setTask((ITask) null);
+			return;
+		case ISkillsPackage.USER_TASK__STARTED:
+			setStarted(STARTED_EDEFAULT);
+			return;
+		case ISkillsPackage.USER_TASK__FINISHED:
+			setFinished(FINISHED_EDEFAULT);
+			return;
+		case ISkillsPackage.USER_TASK__HINTS_DISPLAYED:
+			setHintsDisplayed(HINTS_DISPLAYED_EDEFAULT);
+			return;
 		}
 		super.eUnset(featureID);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case ISkillsPackage.USER_TASK__TASK:
-				return task != null;
-			case ISkillsPackage.USER_TASK__STARTED:
-				return STARTED_EDEFAULT == null ? started != null : !STARTED_EDEFAULT.equals(started);
-			case ISkillsPackage.USER_TASK__FINISHED:
-				return FINISHED_EDEFAULT == null ? finished != null : !FINISHED_EDEFAULT.equals(finished);
-			case ISkillsPackage.USER_TASK__HINTS_DISPLAYED:
-				return hintsDisplayed != HINTS_DISPLAYED_EDEFAULT;
-			case ISkillsPackage.USER_TASK__ADDED:
-				return ADDED_EDEFAULT == null ? added != null : !ADDED_EDEFAULT.equals(added);
+		case ISkillsPackage.USER_TASK__TASK:
+			return task != null;
+		case ISkillsPackage.USER_TASK__STARTED:
+			return STARTED_EDEFAULT == null ? started != null : !STARTED_EDEFAULT.equals(started);
+		case ISkillsPackage.USER_TASK__FINISHED:
+			return FINISHED_EDEFAULT == null ? finished != null : !FINISHED_EDEFAULT.equals(finished);
+		case ISkillsPackage.USER_TASK__HINTS_DISPLAYED:
+			return hintsDisplayed != HINTS_DISPLAYED_EDEFAULT;
+		case ISkillsPackage.USER_TASK__ADDED:
+			return ADDED_EDEFAULT == null ? added != null : !ADDED_EDEFAULT.equals(added);
 		}
 		return super.eIsSet(featureID);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
 		switch (operationID) {
-			case ISkillsPackage.USER_TASK___IS_COMPLETED:
-				return isCompleted();
-			case ISkillsPackage.USER_TASK___START:
-				start();
-				return null;
-			case ISkillsPackage.USER_TASK___GET_USER:
-				return getUser();
-			case ISkillsPackage.USER_TASK___IS_STARTED:
-				return isStarted();
-			case ISkillsPackage.USER_TASK___REVEAL_NEXT_HINT:
-				revealNextHint();
-				return null;
+		case ISkillsPackage.USER_TASK___IS_COMPLETED:
+			return isCompleted();
+		case ISkillsPackage.USER_TASK___ACTIVATE:
+			activate();
+			return null;
+		case ISkillsPackage.USER_TASK___GET_USER:
+			return getUser();
+		case ISkillsPackage.USER_TASK___IS_STARTED:
+			return isStarted();
+		case ISkillsPackage.USER_TASK___REVEAL_NEXT_HINT:
+			revealNextHint();
+			return null;
 		}
 		return super.eInvoke(operationID, arguments);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
 	 * @generated
 	 */
 	@Override
 	public String toString() {
-		if (eIsProxy()) return super.toString();
+		if (eIsProxy())
+			return super.toString();
 
-		StringBuilder result = new StringBuilder(super.toString());
+		final StringBuilder result = new StringBuilder(super.toString());
 		result.append(" (started: ");
 		result.append(started);
 		result.append(", finished: ");
@@ -451,7 +475,9 @@
 		result.append(", added: ");
 		result.append(added);
 		result.append(')');
-		return result.toString();
+		// return result.toString();
+
+		return getTask().getTitle();
 	}
 
 } // MUserTask
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/util/SkillsAdapterFactory.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/util/SkillsAdapterFactory.java
index 3c9f037..4cf06c5 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/util/SkillsAdapterFactory.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/util/SkillsAdapterFactory.java
@@ -164,6 +164,10 @@
 				return createHintAdapter();
 			}
 			@Override
+			public Adapter caseUserDependency(IUserDependency object) {
+				return createUserDependencyAdapter();
+			}
+			@Override
 			public Adapter defaultCase(EObject object) {
 				return createEObjectAdapter();
 			}
@@ -520,6 +524,20 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.skills.model.IUserDependency <em>User Dependency</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.skills.model.IUserDependency
+	 * @generated
+	 */
+	public Adapter createUserDependencyAdapter() {
+		return null;
+	}
+
+	/**
 	 * Creates a new adapter for the default case.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null.
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/util/SkillsSwitch.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/util/SkillsSwitch.java
index 5baf795..6e7e9c6 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/util/SkillsSwitch.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/util/SkillsSwitch.java
@@ -207,6 +207,7 @@
 			case ISkillsPackage.COMPLETE_INCLUDED_TASKS_DEPENDENCY: {
 				ICompleteIncludedTasksDependency completeIncludedTasksDependency = (ICompleteIncludedTasksDependency)theEObject;
 				T result = caseCompleteIncludedTasksDependency(completeIncludedTasksDependency);
+				if (result == null) result = caseUserDependency(completeIncludedTasksDependency);
 				if (result == null) result = caseDependency(completeIncludedTasksDependency);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
@@ -214,6 +215,7 @@
 			case ISkillsPackage.TASK_DEPENDENCY: {
 				ITaskDependency taskDependency = (ITaskDependency)theEObject;
 				T result = caseTaskDependency(taskDependency);
+				if (result == null) result = caseUserDependency(taskDependency);
 				if (result == null) result = caseDependency(taskDependency);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
@@ -221,6 +223,7 @@
 			case ISkillsPackage.SKILL_DEPENDENCY: {
 				ISkillDependency skillDependency = (ISkillDependency)theEObject;
 				T result = caseSkillDependency(skillDependency);
+				if (result == null) result = caseUserDependency(skillDependency);
 				if (result == null) result = caseDependency(skillDependency);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
@@ -232,6 +235,13 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case ISkillsPackage.USER_DEPENDENCY: {
+				IUserDependency userDependency = (IUserDependency)theEObject;
+				T result = caseUserDependency(userDependency);
+				if (result == null) result = caseDependency(userDependency);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			default: return defaultCase(theEObject);
 		}
 	}
@@ -597,6 +607,21 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>User Dependency</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>User Dependency</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseUserDependency(IUserDependency object) {
+		return null;
+	}
+
+	/**
 	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/Activator.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/Activator.java
index c2dca2a..f9bd001 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/Activator.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/Activator.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/BrokerTools.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/BrokerTools.java
new file mode 100644
index 0000000..dfc7bbe
--- /dev/null
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/BrokerTools.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.skills;
+
+import org.eclipse.e4.core.services.events.IEventBroker;
+import org.eclipse.ui.PlatformUI;
+
+public class BrokerTools {
+
+	/**
+	 * Gracefully post a message to the event broker service.
+	 *
+	 * @param topic
+	 *            broker topic
+	 * @param data
+	 *            message data
+	 */
+	public static void post(String topic, Object data) {
+		try {
+			if (PlatformUI.isWorkbenchRunning()) {
+				final IEventBroker service = PlatformUI.getWorkbench().getService(IEventBroker.class);
+				if (service != null)
+					service.post(topic, data);
+			}
+		} catch (final Throwable e) {
+			// silently swallow
+		}
+	}
+}
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/Logger.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/Logger.java
index 6aa4e9e..5ec2672 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/Logger.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/Logger.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/RunnableWithResult.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/RunnableWithResult.java
index 26cb8e4..199d9ae 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/RunnableWithResult.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/RunnableWithResult.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/dependencies/AbstractCustomDependency.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/dependencies/AbstractCustomDependency.java
index b1d8d67..9a5eb06 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/dependencies/AbstractCustomDependency.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/dependencies/AbstractCustomDependency.java
@@ -1,12 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2020 christian and others.
+ * Copyright (c) 2020 Christian Pontesegger and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
- *     christian - initial API and implementation
+ *     Christian Pontesegger - initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.skills.dependencies;
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/dependencies/CustomDependencyDefinition.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/dependencies/CustomDependencyDefinition.java
index e0fa64c..8af3fce 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/dependencies/CustomDependencyDefinition.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/dependencies/CustomDependencyDefinition.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/preferences/IPreferenceConstants.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/preferences/IPreferenceConstants.java
index 1ab2f3a..e65e549 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/preferences/IPreferenceConstants.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/preferences/IPreferenceConstants.java
@@ -1,12 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2020 christian and others.
+ * Copyright (c) 2020 Christian Pontesegger and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
- *     christian - initial API and implementation
+ *     Christian Pontesegger - initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.skills.preferences;
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/preferences/SkillsPreferenceInitializer.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/preferences/SkillsPreferenceInitializer.java
index fcc2ff5..8d3fd5a 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/preferences/SkillsPreferenceInitializer.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/preferences/SkillsPreferenceInitializer.java
@@ -1,3 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
 package org.eclipse.skills.preferences;
 
 import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/AvatarCreator.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/AvatarCreator.java
index 0e4666a..a0733de 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/AvatarCreator.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/AvatarCreator.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/ExtensionPointQuestProvider.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/ExtensionPointQuestProvider.java
new file mode 100644
index 0000000..32b86c2
--- /dev/null
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/ExtensionPointQuestProvider.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.skills.service;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
+import org.eclipse.skills.model.IQuest;
+import org.eclipse.skills.model.ISkillsPackage;
+
+public class ExtensionPointQuestProvider implements IQuestProvider {
+
+	@Override
+	public Collection<IQuest> getQuests() {
+		final Collection<IQuest> quests = new HashSet<>();
+
+		final IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.skills.quest");
+		for (final IConfigurationElement e : config) {
+			if (e.getName().equals("resource")) {
+				final String location = e.getAttribute("URI");
+
+				URI uri = URI.createURI(location);
+				if (uri.isRelative())
+					uri = URI.createURI("platform:/plugin/" + e.getContributor().getName() + "/" + location);
+
+				// initialize the model
+				ISkillsPackage.eINSTANCE.eClass();
+
+				final Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
+				final Map<String, Object> extensionsMap = reg.getExtensionToFactoryMap();
+				extensionsMap.put("skills", new XMIResourceFactoryImpl());
+
+				final ResourceSet resourceSet = new ResourceSetImpl();
+				final Resource resource = resourceSet.getResource(uri, true);
+
+				final IQuest quest = (IQuest) resource.getContents().get(0);
+				quests.add(quest);
+			}
+		}
+
+		return quests;
+	}
+}
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/IDataStorage.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/IDataStorage.java
index bcbe84a..99fdad6 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/IDataStorage.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/IDataStorage.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/IQuestProvider.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/IQuestProvider.java
new file mode 100644
index 0000000..ea206fa
--- /dev/null
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/IQuestProvider.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.skills.service;
+
+import java.util.Collection;
+
+import org.eclipse.skills.model.IQuest;
+
+public interface IQuestProvider {
+
+	Collection<IQuest> getQuests();
+}
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/ISkillService.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/ISkillService.java
index 3fe7a2b..0c82632 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/ISkillService.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/ISkillService.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
@@ -56,4 +58,10 @@
 	void reportTaskReady(ITask task);
 
 	Collection<ITask> getOpenTasks();
+
+	void setQuestProvider(IQuestProvider questProvider);
+
+	IQuestProvider getQuestProvider();
+
+	Collection<ITask> getAllAvailableTasks();
 }
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/SkillService.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/SkillService.java
index b148f74..138613d 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/SkillService.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/SkillService.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
@@ -13,18 +15,18 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
-import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.e4.core.services.events.IEventBroker;
@@ -72,42 +74,23 @@
 		return null;
 	}
 
-	private static Collection<IQuest> loadQuestsFromResources() {
-		final Collection<IQuest> quests = new HashSet<>();
+	private static Collection<ITask> extractTasksRecursively(Collection<ITask> tasks) {
+		final Collection<ITask> result = new ArrayList<>(tasks);
 
-		final IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.skills.quest");
-		for (final IConfigurationElement e : config) {
-			if (e.getName().equals("resource")) {
-				final String location = e.getAttribute("URI");
+		for (final ITask task : tasks)
+			result.addAll(extractTasksRecursively(task.getTasks()));
 
-				URI uri = URI.createURI(location);
-				if (uri.isRelative())
-					uri = URI.createURI("platform:/plugin/" + e.getContributor().getName() + "/" + location);
-
-				// initialize the model
-				ISkillsPackage.eINSTANCE.eClass();
-
-				final Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
-				final Map<String, Object> extensionsMap = reg.getExtensionToFactoryMap();
-				extensionsMap.put("skills", new XMIResourceFactoryImpl());
-
-				final ResourceSet resourceSet = new ResourceSetImpl();
-				final Resource resource = resourceSet.getResource(uri, true);
-
-				final IQuest quest = (IQuest) resource.getContents().get(0);
-				quests.add(quest);
-			}
-		}
-
-		return quests;
+		return result;
 	}
 
 	private IUser fUser = null;
 
-	private Collection<ITask> fTasks = null;
+	private final Collection<ITask> fTasks = null;
 
 	private final WorkspaceDataStorage fStorage;
 
+	private IQuestProvider fQuestProvider;
+
 	private SkillService() {
 		Activator.getDefault().getPreferenceStore().addPropertyChangeListener(this);
 
@@ -180,21 +163,6 @@
 			broker.unsubscribe(this);
 	}
 
-	private void loadTasks() {
-		if (fTasks == null) {
-			fTasks = new HashSet<>();
-
-			for (final IQuest quest : loadQuestsFromResources())
-				fTasks.addAll(quest.getTasks());
-		}
-	}
-
-	public Collection<ITask> getTasks() {
-		loadTasks();
-
-		return fTasks;
-	}
-
 	@Override
 	public IUser getUser() {
 		if (fUser == null)
@@ -285,8 +253,8 @@
 
 	private void startUserTasks() {
 		for (final IUserTask task : getUser().getUsertasks()) {
-			if (!task.isCompleted())
-				task.getTask().getGoal().activate();
+			if (task.isStarted())
+				task.activate();
 		}
 	}
 
@@ -309,7 +277,7 @@
 
 	@Override
 	public Collection<ITask> getOpenTasks() {
-		final Collection<ITask> openTasks = getTasks();
+		final Collection<ITask> openTasks = getAllAvailableTasks();
 		final List<ITask> runningTasks = getUser().getUsertasks().stream().map(t -> t.getTask()).collect(Collectors.toList());
 
 		// TODO is there a better way to remove the running tasks? openTasks.removeAll() does not work
@@ -356,7 +324,32 @@
 	@Override
 	public void reportTaskReady(ITask task) {
 		final IUserTask userTask = getUser().addTask(task);
-		if (task.isAutoActivation())
-			userTask.start();
+		if (task.isAutoActivation()) {
+			userTask.setStarted(new Date());
+			userTask.activate();
+		}
+	}
+
+	@Override
+	public void setQuestProvider(IQuestProvider questProvider) {
+		fQuestProvider = questProvider;
+	}
+
+	@Override
+	public IQuestProvider getQuestProvider() {
+		if (fQuestProvider != null)
+			return fQuestProvider;
+
+		return new ExtensionPointQuestProvider();
+	}
+
+	@Override
+	public Collection<ITask> getAllAvailableTasks() {
+		final Collection<ITask> tasks = new HashSet<>();
+
+		for (final IQuest quest : getQuestProvider().getQuests())
+			tasks.addAll(extractTasksRecursively(quest.getTasks()));
+
+		return tasks;
 	}
 }
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/SkillServiceFactory.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/SkillServiceFactory.java
index 75b1bd9..307d596 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/SkillServiceFactory.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/SkillServiceFactory.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/storage/WorkspaceDataStorage.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/storage/WorkspaceDataStorage.java
index 7036fbd..db6e27a 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/storage/WorkspaceDataStorage.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/storage/WorkspaceDataStorage.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/startup/SkillsLauncher.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/startup/SkillsLauncher.java
index e1211fb..e2cff62 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/startup/SkillsLauncher.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/startup/SkillsLauncher.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/notifications/TaskCompletedNotification.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/notifications/TaskCompletedNotification.java
index 5607426..a4e66b9 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/notifications/TaskCompletedNotification.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/notifications/TaskCompletedNotification.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/notifications/TaskStartedNotification.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/notifications/TaskStartedNotification.java
index 337b8de..16f2af1 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/notifications/TaskStartedNotification.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/notifications/TaskStartedNotification.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/preferences/SkillsPage.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/preferences/SkillsPage.java
index 2460289..4d60403 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/preferences/SkillsPage.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/preferences/SkillsPage.java
@@ -1,3 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
 package org.eclipse.skills.ui.preferences;
 
 import org.eclipse.jface.dialogs.MessageDialog;
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/BadgesComposite.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/BadgesComposite.java
index ff68ed7..5b9120d 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/BadgesComposite.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/BadgesComposite.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/CharacterSheet.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/CharacterSheet.java
index 94e28eb..7ccc8d3 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/CharacterSheet.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/CharacterSheet.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/SkillsComposite.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/SkillsComposite.java
index 5e7e604..0cc55f9 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/SkillsComposite.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/SkillsComposite.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/TaskDetails.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/TaskDetails.java
index 7660815..049f001 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/TaskDetails.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/TaskDetails.java
@@ -1,12 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2020 christian and others.
+ * Copyright (c) 2020 Christian Pontesegger and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
- *     christian - initial API and implementation
+ *     Christian Pontesegger - initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.skills.ui.views;
@@ -106,7 +108,9 @@
 
 			@Override
 			public void linkActivated(HyperlinkEvent e) {
-				getUserTask().start();
+				getUserTask().setStarted(new Date());
+				getUserTask().activate();
+
 				updateUI();
 			}
 		});
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/DescriptionSection.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/DescriptionSection.java
index a8fb774..1dee99d 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/DescriptionSection.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/DescriptionSection.java
@@ -1,12 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2020 christian and others.
+ * Copyright (c) 2020 Christian Pontesegger and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
- *     christian - initial API and implementation
+ *     Christian Pontesegger - initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.skills.ui.views.journal;
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/DetailComposite.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/DetailComposite.java
index 7d4e06e..b9f005a 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/DetailComposite.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/DetailComposite.java
@@ -1,12 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2020 christian and others.
+ * Copyright (c) 2020 Christian Pontesegger and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
- *     christian - initial API and implementation
+ *     Christian Pontesegger - initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.skills.ui.views.journal;
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/DetailHeaderComposite.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/DetailHeaderComposite.java
index acd512a..c8d9a4f 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/DetailHeaderComposite.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/DetailHeaderComposite.java
@@ -1,12 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2020 christian and others.
+ * Copyright (c) 2020 Christian Pontesegger and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
- *     christian - initial API and implementation
+ *     Christian Pontesegger - initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.skills.ui.views.journal;
@@ -109,7 +111,8 @@
 
 			@Override
 			public void linkActivated(HyperlinkEvent e) {
-				getUserTask().start();
+				getUserTask().setStarted(new Date());
+				getUserTask().activate();
 			}
 		});
 		toolkit.paintBordersFor(hprlnkStartTask);
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/HintsSection.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/HintsSection.java
index 05b883b..6f30344 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/HintsSection.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/HintsSection.java
@@ -1,12 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2020 christian and others.
+ * Copyright (c) 2020 Christian Pontesegger and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
- *     christian - initial API and implementation
+ *     Christian Pontesegger - initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.skills.ui.views.journal;
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/JournalView.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/JournalView.java
index 4d0e63e..92402e0 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/JournalView.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/views/journal/JournalView.java
@@ -1,5 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
 package org.eclipse.skills.ui.views.journal;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.stream.Collectors;
 
@@ -25,6 +39,8 @@
 
 public class JournalView extends ViewPart implements ISelectionChangedListener {
 
+	private ListViewer fListViewer;
+
 	public JournalView() {
 	}
 
@@ -43,12 +59,22 @@
 		toolkit.adapt(sashForm);
 		toolkit.paintBordersFor(sashForm);
 
-		final ListViewer listViewer = createTaskList(sashForm);
+		fListViewer = createTaskList(sashForm);
+		refresh();
 
-		createDetailComposite(sashForm, toolkit, listViewer);
+		createDetailComposite(sashForm, toolkit, fListViewer);
 		sashForm.setWeights(new int[] { 2, 5 });
 	}
 
+	public void refresh() {
+		final ArrayList<IUserTask> input = new ArrayList<>(getOpenTasks());
+		input.addAll(getRunningTasks());
+		input.addAll(getCompletedTasks());
+
+		fListViewer.setInput(input);
+		fListViewer.refresh();
+	}
+
 	private ListViewer createTaskList(Composite parent) {
 		final ListViewer listViewer = new ListViewer(parent, SWT.BORDER | SWT.V_SCROLL);
 		listViewer.setContentProvider(ArrayContentProvider.getInstance());
@@ -62,8 +88,6 @@
 			}
 		});
 
-		listViewer.setInput(getAvailableTasks());
-
 		return listViewer;
 	}
 
@@ -91,16 +115,25 @@
 		return composite;
 	}
 
-	private java.util.List<IUserTask> getAvailableTasks() {
-		final java.util.List<IUserTask> tasks = getUser().getUsertasks().stream().filter(t -> !t.isCompleted()).collect(Collectors.toList());
-		Collections.sort(tasks, (t1, t2) -> t1.getStarted().compareTo(t2.getStarted()));
+	private java.util.List<IUserTask> getOpenTasks() {
+		final java.util.List<IUserTask> tasks = getUser().getUsertasks().stream().filter(t -> !t.isStarted()).collect(Collectors.toList());
+
+		return tasks;
+	}
+
+	private java.util.List<IUserTask> getRunningTasks() {
+		final java.util.List<IUserTask> tasks = getUser().getUsertasks().stream().filter(t -> t.isStarted()).filter(t -> !t.isCompleted())
+				.collect(Collectors.toList());
+		Collections.sort(tasks, (t1, t2) -> {
+			return t1.getStarted().compareTo(t2.getStarted());
+		});
 
 		return tasks;
 	}
 
 	private java.util.List<IUserTask> getCompletedTasks() {
 		final java.util.List<IUserTask> tasks = getUser().getUsertasks().stream().filter(t -> t.isCompleted()).collect(Collectors.toList());
-		Collections.sort(tasks, (t1, t2) -> t1.getAdded().compareTo(t2.getAdded()));
+		Collections.sort(tasks, (t1, t2) -> t1.getFinished().compareTo(t2.getFinished()));
 
 		return tasks;
 	}
diff --git a/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/BrokerEventDependencyTest.java b/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/BrokerEventDependencyTest.java
index 1b41aab..502cd3a 100644
--- a/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/BrokerEventDependencyTest.java
+++ b/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/BrokerEventDependencyTest.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/ConsolePatternDependencyTest.java b/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/ConsolePatternDependencyTest.java
new file mode 100644
index 0000000..a0ada59
--- /dev/null
+++ b/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/ConsolePatternDependencyTest.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.skills.dependencies;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.eclipse.jface.text.DocumentEvent;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+public class ConsolePatternDependencyTest {
+
+	private ConsolePatternDependency fDependency;
+
+	@BeforeEach
+	public void setup() {
+		fDependency = new ConsolePatternDependency();
+	}
+
+	@Test
+	public void createDependency() {
+		assertNotNull(fDependency);
+		assertFalse(fDependency.isFulfilled());
+		assertEquals("<none>", fDependency.getPattern());
+	}
+
+	@Test
+	public void setAttributes() {
+		fDependency.setAttributes("First .+ Last");
+		assertEquals("First .+ Last", fDependency.getPattern());
+	}
+
+	@Test
+	@DisplayName("stay not fulfilled on text mismatch")
+	public void patternMismatch() {
+		fDependency.setAttributes("First .+ Last");
+
+		final DocumentEvent event = new DocumentEvent();
+		event.fText = "First only";
+		fDependency.documentChanged(event);
+
+		assertFalse(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("fulfilled on exact text match")
+	public void exactPatternMatch() {
+		fDependency.setAttributes("First .+ Last");
+
+		final DocumentEvent event = new DocumentEvent();
+		event.fText = "First Second Last";
+		fDependency.documentChanged(event);
+
+		assertTrue(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("fulfilled on partial text match")
+	public void partialPatternMatch() {
+		fDependency.setAttributes("First .+ Last");
+
+		final DocumentEvent event = new DocumentEvent();
+		event.fText = "A name is comprised of First Second Last and hopefully noting more";
+		fDependency.documentChanged(event);
+
+		assertTrue(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("multiline match")
+	public void multilineMatch() {
+		fDependency.setAttributes("First .+ Last");
+
+		final DocumentEvent event = new DocumentEvent();
+		event.fText = "A name is comprised of First \nSecond Last\n and hopefully noting more";
+		fDependency.documentChanged(event);
+
+		assertTrue(fDependency.isFulfilled());
+	}
+}
diff --git a/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/P2DependencyTest.java b/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/P2DependencyTest.java
index 05e591c..54a3788 100644
--- a/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/P2DependencyTest.java
+++ b/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/P2DependencyTest.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/ResourceExistsDependencyTest.java b/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/ResourceExistsDependencyTest.java
index acfbeab..02759cb 100644
--- a/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/ResourceExistsDependencyTest.java
+++ b/tests/org.eclipse.skills.dependencies.test/src/org/eclipse/skills/dependencies/ResourceExistsDependencyTest.java
@@ -3,7 +3,9 @@
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
  *     Christian Pontesegger - initial API and implementation
diff --git a/tests/org.eclipse.skills.test/META-INF/MANIFEST.MF b/tests/org.eclipse.skills.test/META-INF/MANIFEST.MF
index 9a62964..80e96f4 100644
--- a/tests/org.eclipse.skills.test/META-INF/MANIFEST.MF
+++ b/tests/org.eclipse.skills.test/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: Skills Core Tests
-Bundle-SymbolicName: org.eclipse.skills.test
+Bundle-SymbolicName: org.eclipse.skills.test;singleton:=true
 Bundle-Version: 0.1.0.qualifier
 Bundle-Vendor: Eclipse.org
 Fragment-Host: org.eclipse.skills;bundle-version="0.1.0"
diff --git a/tests/org.eclipse.skills.test/build.properties b/tests/org.eclipse.skills.test/build.properties
index 34d2e4d..5ebbdd9 100644
--- a/tests/org.eclipse.skills.test/build.properties
+++ b/tests/org.eclipse.skills.test/build.properties
@@ -1,4 +1,6 @@
 source.. = src/
 output.. = bin/
 bin.includes = META-INF/,\
-               .
+               .,\
+               fragment.xml,\
+               resources/
diff --git a/tests/org.eclipse.skills.test/fragment.xml b/tests/org.eclipse.skills.test/fragment.xml
new file mode 100644
index 0000000..f484227
--- /dev/null
+++ b/tests/org.eclipse.skills.test/fragment.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<fragment>
+   <extension
+         point="org.eclipse.skills.quest">
+      <resource
+            URI="resources/UnitTest.skills">
+      </resource>
+   </extension>
+
+</fragment>
diff --git a/tests/org.eclipse.skills.test/resources/UnitTest.skills b/tests/org.eclipse.skills.test/resources/UnitTest.skills
new file mode 100644
index 0000000..4735aea
--- /dev/null
+++ b/tests/org.eclipse.skills.test/resources/UnitTest.skills
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<skills:Quest xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:skills="http://eclipse.org/skills/1.0.0" title="UnitTest Quest">
+  <tasks title="First task" autoActivation="false">
+    <description text="Simple first task"/>
+    <goal xsi:type="skills:AndDependency">
+      <dependencies xsi:type="skills:CompleteIncludedTasksDependency"/>
+    </goal>
+    <requirement xsi:type="skills:AndDependency"/>
+    <tasks title="inner task">
+      <description text="Subtask of first task"/>
+      <goal xsi:type="skills:AndDependency">
+        <dependencies xsi:type="skills:SkillDependency" minExperience="100" skill="//@skills.0"/>
+      </goal>
+      <requirement xsi:type="skills:AndDependency">
+        <dependencies xsi:type="skills:TaskDependency" task="//@tasks.0" completed="false"/>
+      </requirement>
+    </tasks>
+  </tasks>
+  <tasks title="Second Task">
+    <description text="Second dummy task"/>
+    <goal xsi:type="skills:AndDependency">
+      <dependencies xsi:type="skills:NotDependency"/>
+    </goal>
+    <requirement xsi:type="skills:AndDependency">
+      <dependencies xsi:type="skills:TaskDependency" task="//@tasks.0"/>
+    </requirement>
+  </tasks>
+  <skills name="TestSkill">
+    <description text="Unittest dummy skill"/>
+  </skills>
+</skills:Quest>
diff --git a/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/AndDependencyTest.java b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/AndDependencyTest.java
index bb8c793..cc9d033 100644
--- a/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/AndDependencyTest.java
+++ b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/AndDependencyTest.java
@@ -1,12 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2020 christian and others.
+ * Copyright (c) 2020 Christian Pontesegger and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
- *     christian - initial API and implementation
+ *     Christian Pontesegger - initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.skills.model;
diff --git a/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/DummyDependency.java b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/DummyDependency.java
new file mode 100644
index 0000000..993f353
--- /dev/null
+++ b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/DummyDependency.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.skills.model;
+
+import org.eclipse.skills.model.impl.MDependency;
+
+public class DummyDependency extends MDependency {
+
+	@Override
+	public void activate() {
+	}
+
+	@Override
+	public void deactivate() {
+	}
+}
diff --git a/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/NotDependencyTest.java b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/NotDependencyTest.java
index e5c73d6..705ebbc 100644
--- a/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/NotDependencyTest.java
+++ b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/NotDependencyTest.java
@@ -1,17 +1,20 @@
 /*******************************************************************************
- * Copyright (c) 2020 christian and others.
+ * Copyright (c) 2020 Christian Pontesegger and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
- *     christian - initial API and implementation
+ *     Christian Pontesegger - initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.skills.model;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
@@ -37,4 +40,25 @@
 		fDependency.activate();
 		assertFalse(fDependency.isFulfilled());
 	}
+
+	@Test
+	@DisplayName("Is fulfilled when child is not fulfilled")
+	public void fulfilledWhenChildIsNotFulfilled() {
+		final DummyDependency child = new DummyDependency();
+
+		fDependency.getDependencies().add(child);
+		fDependency.activate();
+		assertTrue(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Is not fulfilled when child is fulfilled")
+	public void notFulfilledWhenChildIsFulfilled() {
+		final DummyDependency child = new DummyDependency();
+		child.setFulfilled(true);
+
+		fDependency.getDependencies().add(child);
+		fDependency.activate();
+		assertFalse(fDependency.isFulfilled());
+	}
 }
diff --git a/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/SequenceDependencyTest.java b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/SequenceDependencyTest.java
new file mode 100644
index 0000000..ab53f5a
--- /dev/null
+++ b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/SequenceDependencyTest.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.skills.model;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+public class SequenceDependencyTest {
+
+	private ISequenceDependency fDependency;
+
+	@BeforeEach
+	public void setupFixture() {
+		fDependency = ISkillsFactory.eINSTANCE.createSequenceDependency();
+	}
+
+	@Test
+	@DisplayName("Empty dependency is fulfilled")
+	public void emptyDependencyIsFulfilled() {
+		fDependency.activate();
+
+		assertTrue(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Not fulfilled child dependency")
+	public void containsNotFulfilledDependency() {
+
+		fDependency.getDependencies().add(ISkillsFactory.eINSTANCE.createNotDependency());
+		fDependency.activate();
+
+		assertFalse(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Fulfilled child dependency")
+	public void containsFulfilledDependency() {
+		fDependency.getDependencies().add(ISkillsFactory.eINSTANCE.createAndDependency());
+		fDependency.activate();
+
+		assertTrue(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Child dependency changes fulfill state after activation")
+	public void childDependencyFulfillsAfterActivation() {
+
+		final DummyDependency child = new DummyDependency();
+		fDependency.getDependencies().add(child);
+		fDependency.activate();
+
+		assertFalse(fDependency.isFulfilled());
+
+		child.setFulfilled(true);
+		assertTrue(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Child dependencies fulfill in correct sequence")
+	public void childDependenciesFulfillInCorrectSequence() {
+
+		final DummyDependency child1 = new DummyDependency();
+		final DummyDependency child2 = new DummyDependency();
+		fDependency.getDependencies().add(child1);
+		fDependency.getDependencies().add(child2);
+		fDependency.activate();
+
+		assertFalse(fDependency.isFulfilled());
+
+		child1.setFulfilled(true);
+		assertFalse(fDependency.isFulfilled());
+
+		child2.setFulfilled(true);
+		assertTrue(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Child dependencies fulfill in inverse sequence")
+	public void childDependenciesFulfillInInverseSequence() {
+
+		final DummyDependency child1 = new DummyDependency();
+		final DummyDependency child2 = new DummyDependency();
+		fDependency.getDependencies().add(child1);
+		fDependency.getDependencies().add(child2);
+		fDependency.activate();
+
+		assertFalse(fDependency.isFulfilled());
+
+		child2.setFulfilled(true);
+		assertFalse(fDependency.isFulfilled());
+
+		child1.setFulfilled(true);
+		assertTrue(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Child dependencies toggle")
+	public void childDependenciesToggle() {
+
+		final DummyDependency child1 = new DummyDependency();
+		final DummyDependency child2 = new DummyDependency();
+		fDependency.getDependencies().add(child1);
+		fDependency.getDependencies().add(child2);
+		fDependency.activate();
+
+		assertFalse(fDependency.isFulfilled());
+
+		child1.setFulfilled(true);
+		assertFalse(fDependency.isFulfilled());
+
+		child1.setFulfilled(false);
+		child2.setFulfilled(true);
+		assertTrue(fDependency.isFulfilled());
+	}
+}
diff --git a/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/TaskDependencyTest.java b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/TaskDependencyTest.java
new file mode 100644
index 0000000..56863be
--- /dev/null
+++ b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/TaskDependencyTest.java
@@ -0,0 +1,227 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.skills.model;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Date;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+public class TaskDependencyTest {
+
+	private ITaskDependency fDependency;
+
+	@BeforeEach
+	public void setupFixture() {
+		fDependency = ISkillsFactory.eINSTANCE.createTaskDependency();
+	}
+
+	@Test
+	@DisplayName("getUser() uses custom user")
+	public void getUserUsesCustomUser() {
+		final IUser user = ISkillsFactory.eINSTANCE.createUser();
+
+		fDependency.setUser(user);
+		assertEquals(user, fDependency.getUser());
+	}
+
+	@Test
+	@DisplayName("getUser() has a default value")
+	public void getUserHasADefaultValue() {
+		assertNotNull(fDependency.getUser());
+	}
+
+	@Test
+	@DisplayName("Without task dependency cannot be fulfilled")
+	public void emptyDependencyIsNotFulfilled() {
+		fDependency.activate();
+
+		assertFalse(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Is not fulfilled when waiting for completion of open task")
+	public void notFulfilledWhenWaitingForOpenTask() {
+		final ITask task = ISkillsFactory.eINSTANCE.createTask();
+
+		fDependency.setTask(task);
+		fDependency.activate();
+
+		assertFalse(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Is not fulfilled when waiting for completion of scheduled task")
+	public void notFulfilledWhenWaitingForScheduledTask() {
+		final ITask task = ISkillsFactory.eINSTANCE.createTask();
+
+		final IUser user = ISkillsFactory.eINSTANCE.createUser();
+		user.addTask(task);
+
+		fDependency.setUser(user);
+		fDependency.setTask(task);
+		fDependency.activate();
+
+		assertFalse(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Is not fulfilled when waiting for completion of running task")
+	public void notFulfilledWhenWaitingForRunningTask() {
+		final ITask task = ISkillsFactory.eINSTANCE.createTask();
+		task.setGoal(ISkillsFactory.eINSTANCE.createNotDependency());
+
+		final IUser user = ISkillsFactory.eINSTANCE.createUser();
+		final IUserTask userTask = user.addTask(task);
+		userTask.setStarted(new Date());
+
+		fDependency.setUser(user);
+		fDependency.setTask(task);
+		fDependency.activate();
+
+		assertFalse(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Is fulfilled when waiting for completion of completed task")
+	public void fulfilledWhenWaitingForCompletedTask() {
+		final ITask task = ISkillsFactory.eINSTANCE.createTask();
+
+		final IUser user = ISkillsFactory.eINSTANCE.createUser();
+		final IUserTask userTask = user.addTask(task);
+		userTask.setFinished(new Date());
+
+		fDependency.setUser(user);
+		fDependency.setTask(task);
+		fDependency.activate();
+
+		assertTrue(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Is fulfilled when waiting for completion of completing task")
+	public void fulfilledWhenWaitingForCompletingTask() {
+		final ITask task = ISkillsFactory.eINSTANCE.createTask();
+
+		final IUser user = ISkillsFactory.eINSTANCE.createUser();
+		final IUserTask userTask = user.addTask(task);
+
+		fDependency.setUser(user);
+		fDependency.setTask(task);
+		fDependency.activate();
+
+		assertFalse(fDependency.isFulfilled());
+
+		userTask.setFinished(new Date());
+		assertTrue(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Activate dependency before task is started")
+	public void activateDependencyBeforeTask() {
+		final ITask task = ISkillsFactory.eINSTANCE.createTask();
+
+		final IUser user = ISkillsFactory.eINSTANCE.createUser();
+
+		fDependency.setUser(user);
+		fDependency.setTask(task);
+		fDependency.activate();
+
+		assertFalse(fDependency.isFulfilled());
+
+		final IUserTask userTask = user.addTask(task);
+		assertFalse(fDependency.isFulfilled());
+
+		userTask.setStarted(new Date());
+		assertFalse(fDependency.isFulfilled());
+
+		userTask.setFinished(new Date());
+		assertTrue(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Is not fulfilled when waiting for start of non-scheduled task")
+	public void notFulfilledWhenWaitingForNewTask() {
+		final ITask task = ISkillsFactory.eINSTANCE.createTask();
+
+		final IUser user = ISkillsFactory.eINSTANCE.createUser();
+
+		fDependency.setUser(user);
+		fDependency.setTask(task);
+		fDependency.setCompleted(false);
+		fDependency.activate();
+
+		assertFalse(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Is not fulfilled when waiting for start of open task")
+	public void notFulfilledWhenWaitingForStartOfOpenTask() {
+		final ITask task = ISkillsFactory.eINSTANCE.createTask();
+
+		final IUser user = ISkillsFactory.eINSTANCE.createUser();
+		user.addTask(task);
+
+		fDependency.setUser(user);
+		fDependency.setTask(task);
+		fDependency.setCompleted(false);
+		fDependency.activate();
+
+		assertFalse(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Is fulfilled when waiting for running task")
+	public void fulfilledWhenWaitingForRunningTask() {
+		final ITask task = ISkillsFactory.eINSTANCE.createTask();
+
+		final IUser user = ISkillsFactory.eINSTANCE.createUser();
+		final IUserTask userTask = user.addTask(task);
+		userTask.setStarted(new Date());
+
+		fDependency.setUser(user);
+		fDependency.setTask(task);
+		fDependency.setCompleted(false);
+		fDependency.activate();
+
+		assertTrue(fDependency.isFulfilled());
+	}
+
+	@Test
+	@DisplayName("Is fulfilled when waiting for task activation")
+	public void fulfilledWhenWaitingForTaskActivation() {
+		final ITask task = ISkillsFactory.eINSTANCE.createTask();
+
+		final IUser user = ISkillsFactory.eINSTANCE.createUser();
+
+		fDependency.setUser(user);
+		fDependency.setTask(task);
+		fDependency.setCompleted(false);
+		fDependency.activate();
+
+		assertFalse(fDependency.isFulfilled());
+
+		final IUserTask userTask = user.addTask(task);
+		assertFalse(fDependency.isFulfilled());
+
+		userTask.setStarted(new Date());
+		assertTrue(fDependency.isFulfilled());
+	}
+}
diff --git a/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/TaskTest.java b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/TaskTest.java
index 065a93e..e883bcf 100644
--- a/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/TaskTest.java
+++ b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/TaskTest.java
@@ -1,12 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2020 christian and others.
+ * Copyright (c) 2020 Christian Pontesegger and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
- *     christian - initial API and implementation
+ *     Christian Pontesegger - initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.skills.model;
diff --git a/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/UserTaskTest.java b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/UserTaskTest.java
index 378a4ab..6e818af 100644
--- a/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/UserTaskTest.java
+++ b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/UserTaskTest.java
@@ -1,8 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
 package org.eclipse.skills.model;
 
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+import java.util.Date;
+
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@ -15,7 +32,8 @@
 	public void setupFixture() {
 		fUserTask = ISkillsFactory.eINSTANCE.createUserTask();
 
-		ITask task = ISkillsFactory.eINSTANCE.createTask();
+		final ITask task = ISkillsFactory.eINSTANCE.createTask();
+		task.setGoal(ISkillsFactory.eINSTANCE.createAndDependency());
 		fUserTask.setTask(task);
 	}
 
@@ -51,15 +69,15 @@
 		fUserTask.getTask().getHints().add(ISkillsFactory.eINSTANCE.createHint());
 		fUserTask.getTask().getHints().add(ISkillsFactory.eINSTANCE.createHint());
 		fUserTask.getTask().getHints().add(ISkillsFactory.eINSTANCE.createHint());
-		
+
 		assertEquals(0, fUserTask.getHintsDisplayed());
 
 		fUserTask.revealNextHint();
 		assertEquals(1, fUserTask.getHintsDisplayed());
-		
+
 		fUserTask.revealNextHint();
 		assertEquals(2, fUserTask.getHintsDisplayed());
-		
+
 		fUserTask.revealNextHint();
 		assertEquals(3, fUserTask.getHintsDisplayed());
 	}
@@ -70,11 +88,66 @@
 		fUserTask.getTask().getHints().add(ISkillsFactory.eINSTANCE.createHint());
 		fUserTask.getTask().getHints().add(ISkillsFactory.eINSTANCE.createHint());
 		fUserTask.getTask().getHints().add(ISkillsFactory.eINSTANCE.createHint());
-		
+
 		fUserTask.setHintsDisplayed(3);
-		
+
 		assertEquals(3, fUserTask.getHintsDisplayed());
 		fUserTask.revealNextHint();
 		assertEquals(3, fUserTask.getHintsDisplayed());
 	}
+
+	@Test
+	@DisplayName("open task is not started, and not completed")
+	public void openTaskIsInReadyState() {
+		assertFalse(fUserTask.isStarted());
+		assertFalse(fUserTask.isCompleted());
+	}
+
+	@Test
+	@DisplayName("started task is marked started, but not completed")
+	public void startedTaskIsInRunningState() {
+		fUserTask.setStarted(new Date());
+		assertTrue(fUserTask.isStarted());
+		assertFalse(fUserTask.isCompleted());
+	}
+
+	@Test
+	@DisplayName("finshed task is marked as completed")
+	public void finishedTaskIsCompleted() {
+		fUserTask.setStarted(new Date());
+		fUserTask.setFinished(new Date());
+		assertTrue(fUserTask.isStarted());
+		assertTrue(fUserTask.isCompleted());
+	}
+
+	@Test
+	@DisplayName("activate usertask does not set started flag")
+	public void activateDoesNothingWhenNotStarted() {
+		assertFalse(fUserTask.isStarted());
+
+		fUserTask.activate();
+
+		assertFalse(fUserTask.isStarted());
+	}
+
+	@Test
+	@DisplayName("activate usertask detects changes on goal when task is started")
+	public void detectGoalChangesAfterActivation() {
+		fUserTask.getTask().setGoal(ISkillsFactory.eINSTANCE.createAndDependency());
+
+		fUserTask.setStarted(new Date());
+		assertFalse(fUserTask.isCompleted());
+
+		fUserTask.activate();
+		assertTrue(fUserTask.isCompleted());
+	}
+
+	@Test
+	@DisplayName("activate usertask ignores changes on goal when task is not started")
+	public void detectNoGoalChangesAfterActivationWehnNotStarted() {
+		fUserTask.getTask().setGoal(ISkillsFactory.eINSTANCE.createAndDependency());
+
+		fUserTask.activate();
+		assertFalse(fUserTask.isCompleted());
+	}
 }
diff --git a/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/UserTest.java b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/UserTest.java
index ecabd64..9c4d8c1 100644
--- a/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/UserTest.java
+++ b/tests/org.eclipse.skills.test/src/org/eclipse/skills/model/UserTest.java
@@ -1,12 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2020 christian and others.
+ * Copyright (c) 2020 Christian Pontesegger and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
- *     christian - initial API and implementation
+ *     Christian Pontesegger - initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.skills.model;
diff --git a/tests/org.eclipse.skills.test/src/org/eclipse/skills/service/ExtensionPointQuestProviderTest.java b/tests/org.eclipse.skills.test/src/org/eclipse/skills/service/ExtensionPointQuestProviderTest.java
new file mode 100644
index 0000000..01ec776
--- /dev/null
+++ b/tests/org.eclipse.skills.test/src/org/eclipse/skills/service/ExtensionPointQuestProviderTest.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.skills.service;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.eclipse.skills.model.IQuest;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+public class ExtensionPointQuestProviderTest {
+
+	private static IQuest getTestQuest(final IQuestProvider provider) {
+		for (final IQuest quest : provider.getQuests()) {
+			if ("UnitTest Quest".equals(quest.getTitle()))
+				return quest;
+		}
+
+		throw new RuntimeException("Test quest not found");
+	}
+
+	@Test
+	@DisplayName("Read quests from extension point")
+	public void readQuestsFromExtensionPoint() {
+		final ExtensionPointQuestProvider provider = new ExtensionPointQuestProvider();
+
+		// we only know that at minimum our test quest is available via extension point
+		assertFalse(provider.getQuests().isEmpty());
+	}
+
+	@Test
+	@DisplayName("Read tasks from extension point")
+	public void readTasksFromExtensionPoint() {
+		final ExtensionPointQuestProvider provider = new ExtensionPointQuestProvider();
+
+		final IQuest quest = getTestQuest(provider);
+		assertEquals(2, quest.getTasks().size());
+	}
+}
diff --git a/tests/org.eclipse.skills.test/src/org/eclipse/skills/service/SkillServiceTest.java b/tests/org.eclipse.skills.test/src/org/eclipse/skills/service/SkillServiceTest.java
index 531a7cb..f9fad79 100644
--- a/tests/org.eclipse.skills.test/src/org/eclipse/skills/service/SkillServiceTest.java
+++ b/tests/org.eclipse.skills.test/src/org/eclipse/skills/service/SkillServiceTest.java
@@ -1,21 +1,28 @@
 /*******************************************************************************
- * Copyright (c) 2020 christian and others.
+ * Copyright (c) 2020 Christian Pontesegger and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
  *
  * Contributors:
- *     christian - initial API and implementation
+ *     Christian Pontesegger - initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.skills.service;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+import java.util.Collection;
+import java.util.HashSet;
+
 import org.eclipse.skills.model.INotDependency;
+import org.eclipse.skills.model.IQuest;
 import org.eclipse.skills.model.ISkillsFactory;
 import org.eclipse.skills.model.ITask;
 import org.junit.jupiter.api.BeforeEach;
@@ -67,6 +74,34 @@
 		assertFalse(fService.getUser().getUsertasks().get(0).isStarted());
 	}
 
+	@Test
+	@DisplayName("Use default quest provider if not set by user")
+	public void useDefaultTestProvider() {
+		assertNotNull(fService.getQuestProvider());
+	}
+
+	@Test
+	@DisplayName("Use local quest provider")
+	public void useLocalTestProvider() {
+		final TestQuestProvider questProvider = new TestQuestProvider();
+		fService.setQuestProvider(questProvider);
+		assertEquals(questProvider, fService.getQuestProvider());
+	}
+
+	@Test
+	@DisplayName("Get all available tasks, including nested ones")
+	public void getAllAvailableTasks() {
+		final TestQuestProvider questProvider = new TestQuestProvider();
+		final IQuest quest = questProvider.getQuests().iterator().next();
+
+		fService.setQuestProvider(questProvider);
+
+		assertTrue(fService.getAllAvailableTasks().size() == 3);
+		assertTrue(fService.getAllAvailableTasks().contains(quest.getTasks().get(0)));
+		assertTrue(fService.getAllAvailableTasks().contains(quest.getTasks().get(1)));
+		assertTrue(fService.getAllAvailableTasks().contains(quest.getTasks().get(0).getTasks().get(0)));
+	}
+
 	private ITask createTask() {
 		final ITask task = ISkillsFactory.eINSTANCE.createTask();
 		final INotDependency incomleteGoal = ISkillsFactory.eINSTANCE.createNotDependency();
@@ -74,4 +109,30 @@
 
 		return task;
 	}
+
+	private class TestQuestProvider implements IQuestProvider {
+
+		private final Collection<IQuest> fQuests;
+
+		public TestQuestProvider() {
+			final IQuest quest = ISkillsFactory.eINSTANCE.createQuest();
+
+			final ITask task1 = ISkillsFactory.eINSTANCE.createTask();
+			final ITask task2 = ISkillsFactory.eINSTANCE.createTask();
+			final ITask task3 = ISkillsFactory.eINSTANCE.createTask();
+
+			task1.getTasks().add(task2);
+
+			quest.getTasks().add(task1);
+			quest.getTasks().add(task3);
+
+			fQuests = new HashSet<>();
+			fQuests.add(quest);
+		}
+
+		@Override
+		public Collection<IQuest> getQuests() {
+			return fQuests;
+		}
+	}
 }