Bug 565945: Progress display in status bar

Change-Id: I5c6348b6eb4b86cbcc42596d2b0013bd0f828c5b
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/FactorProgressionItemProvider.java b/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/FactorProgressionItemProvider.java
new file mode 100644
index 0000000..6f3d151
--- /dev/null
+++ b/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/FactorProgressionItemProvider.java
@@ -0,0 +1,180 @@
+/**
+ */
+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.common.util.ResourceLocator;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import org.eclipse.skills.model.IFactorProgression;
+import org.eclipse.skills.model.ISkillsPackage;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.skills.model.IFactorProgression} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class FactorProgressionItemProvider 
+	extends ItemProviderAdapter
+	implements
+		IEditingDomainItemProvider,
+		IStructuredItemContentProvider,
+		ITreeItemContentProvider,
+		IItemLabelProvider,
+		IItemPropertySource {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FactorProgressionItemProvider(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);
+
+			addBaseXpNeededPropertyDescriptor(object);
+			addXpFactorPropertyDescriptor(object);
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Base Xp Needed feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addBaseXpNeededPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_FactorProgression_baseXpNeeded_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_FactorProgression_baseXpNeeded_feature", "_UI_FactorProgression_type"),
+				 ISkillsPackage.Literals.FACTOR_PROGRESSION__BASE_XP_NEEDED,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Xp Factor feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addXpFactorPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_FactorProgression_xpFactor_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_FactorProgression_xpFactor_feature", "_UI_FactorProgression_type"),
+				 ISkillsPackage.Literals.FACTOR_PROGRESSION__XP_FACTOR,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This returns FactorProgression.gif.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return overlayImage(object, getResourceLocator().getImage("full/obj16/FactorProgression"));
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getText(Object object) {
+		IFactorProgression factorProgression = (IFactorProgression)object;
+		return getString("_UI_FactorProgression_type") + " " + factorProgression.getBaseXpNeeded();
+	}
+
+
+	/**
+	 * 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);
+
+		switch (notification.getFeatureID(IFactorProgression.class)) {
+			case ISkillsPackage.FACTOR_PROGRESSION__BASE_XP_NEEDED:
+			case ISkillsPackage.FACTOR_PROGRESSION__XP_FACTOR:
+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+				return;
+		}
+		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);
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return SkillsEditPlugin.INSTANCE;
+	}
+
+}
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/SkillItemProvider.java b/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/SkillItemProvider.java
index 7aa28c8..a9641ff 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/SkillItemProvider.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/SkillItemProvider.java
@@ -12,9 +12,6 @@
 import org.eclipse.emf.common.util.ResourceLocator;
 
 import org.eclipse.emf.ecore.EStructuralFeature;
-
-import org.eclipse.emf.ecore.EcoreFactory;
-import org.eclipse.emf.ecore.EcorePackage;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
 import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
 import org.eclipse.emf.edit.provider.IItemLabelProvider;
@@ -68,9 +65,6 @@
 			addNamePropertyDescriptor(object);
 			addDescriptionPropertyDescriptor(object);
 			addExperiencePropertyDescriptor(object);
-			addXpLevelFactorPropertyDescriptor(object);
-			addLevelPropertyDescriptor(object);
-			addTitlePropertyDescriptor(object);
 		}
 		return itemPropertyDescriptors;
 	}
@@ -142,72 +136,6 @@
 	}
 
 	/**
-	 * This adds a property descriptor for the Xp Level Factor feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addXpLevelFactorPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Skill_xpLevelFactor_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_Skill_xpLevelFactor_feature", "_UI_Skill_type"),
-				 ISkillsPackage.Literals.SKILL__XP_LEVEL_FACTOR,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Level feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addLevelPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Skill_level_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_Skill_level_feature", "_UI_Skill_type"),
-				 ISkillsPackage.Literals.SKILL__LEVEL,
-				 true,
-				 false,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Title feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTitlePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Skill_title_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_Skill_title_feature", "_UI_Skill_type"),
-				 ISkillsPackage.Literals.SKILL__TITLE,
-				 false,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
 	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
 	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
 	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
@@ -220,7 +148,7 @@
 		if (childrenFeatures == null) {
 			super.getChildrenFeatures(object);
 			childrenFeatures.add(ISkillsPackage.Literals.SKILL__DESCRIPTION);
-			childrenFeatures.add(ISkillsPackage.Literals.SKILL__LEVEL);
+			childrenFeatures.add(ISkillsPackage.Literals.SKILL__PROGRESSION);
 		}
 		return childrenFeatures;
 	}
@@ -278,12 +206,10 @@
 		switch (notification.getFeatureID(ISkill.class)) {
 			case ISkillsPackage.SKILL__NAME:
 			case ISkillsPackage.SKILL__EXPERIENCE:
-			case ISkillsPackage.SKILL__XP_LEVEL_FACTOR:
-			case ISkillsPackage.SKILL__TITLE:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
 				return;
 			case ISkillsPackage.SKILL__DESCRIPTION:
-			case ISkillsPackage.SKILL__LEVEL:
+			case ISkillsPackage.SKILL__PROGRESSION:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
 				return;
 		}
@@ -313,8 +239,8 @@
 
 		newChildDescriptors.add
 			(createChildParameter
-				(ISkillsPackage.Literals.SKILL__LEVEL,
-				 EcoreFactory.eINSTANCE.createFromString(EcorePackage.Literals.EINT, "0")));
+				(ISkillsPackage.Literals.SKILL__PROGRESSION,
+				 ISkillsFactory.eINSTANCE.createFactorProgression()));
 	}
 
 	/**
diff --git a/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/SkillsItemProviderAdapterFactory.java b/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/SkillsItemProviderAdapterFactory.java
index d0d0597..3bb3551 100644
--- a/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/SkillsItemProviderAdapterFactory.java
+++ b/plugins/org.eclipse.skills.ui.questeditor/src-gen/org/eclipse/skills/model/provider/SkillsItemProviderAdapterFactory.java
@@ -532,6 +532,29 @@
 	}
 
 	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.skills.model.IFactorProgression} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected FactorProgressionItemProvider factorProgressionItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.skills.model.IFactorProgression}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createFactorProgressionAdapter() {
+		if (factorProgressionItemProvider == null) {
+			factorProgressionItemProvider = new FactorProgressionItemProvider(this);
+		}
+
+		return factorProgressionItemProvider;
+	}
+
+	/**
 	 * This returns the root adapter factory that contains this factory.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -656,6 +679,7 @@
 		if (taskDependencyItemProvider != null) taskDependencyItemProvider.dispose();
 		if (skillDependencyItemProvider != null) skillDependencyItemProvider.dispose();
 		if (hintItemProvider != null) hintItemProvider.dispose();
+		if (factorProgressionItemProvider != null) factorProgressionItemProvider.dispose();
 	}
 
 }
diff --git a/plugins/org.eclipse.skills/model/Skills.ecore b/plugins/org.eclipse.skills/model/Skills.ecore
index 2dc4f84..dd8ae1f 100644
--- a/plugins/org.eclipse.skills/model/Skills.ecore
+++ b/plugins/org.eclipse.skills/model/Skills.ecore
@@ -24,7 +24,7 @@
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="skillService" eType="#//ISkillService"
         transient="true"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        changeable="false" volatile="true" transient="true" derived="true" iD="true"/>
+        changeable="false" volatile="true" transient="true" derived="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="Description">
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="text" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
@@ -66,17 +66,13 @@
     <eOperations name="addExperience">
       <eParameters name="amount" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
     </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
         defaultValueLiteral="&lt;unnamed>"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="description" lowerBound="1"
         eType="#//Description" containment="true"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="experience" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="xpLevelFactor" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"
-        defaultValueLiteral="2.4"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="level" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
-        changeable="false" volatile="true" transient="true" derived="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="title" lowerBound="1" eType="#//LevelNames"
-        changeable="false" volatile="true" transient="true" derived="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="progression" lowerBound="1"
+        eType="#//LevelProgression" containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="UserTask">
     <eOperations name="isCompleted" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
@@ -171,4 +167,18 @@
     <eStructuralFeatures xsi:type="ecore:EReference" name="user" ordered="false" unique="false"
         eType="#//User" transient="true" resolveProxies="false"/>
   </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="LevelProgression" abstract="true" interface="true">
+    <eOperations name="getMinimumXpForLevel" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt">
+      <eParameters name="level" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
+    </eOperations>
+    <eOperations name="getLevel" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt">
+      <eParameters name="xp" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
+    </eOperations>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="FactorProgression" eSuperTypes="#//LevelProgression">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="baseXpNeeded" lowerBound="1"
+        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt" defaultValueLiteral="100"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="xpFactor" lowerBound="1"
+        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble" defaultValueLiteral="2.4"/>
+  </eClassifiers>
 </ecore:EPackage>
diff --git a/plugins/org.eclipse.skills/model/Skills.genmodel b/plugins/org.eclipse.skills/model/Skills.genmodel
index 1902d4c..c0c2f64 100644
--- a/plugins/org.eclipse.skills/model/Skills.genmodel
+++ b/plugins/org.eclipse.skills/model/Skills.genmodel
@@ -3,10 +3,11 @@
     xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.skills/src-gen" editDirectory="/org.eclipse.skills.ui.questeditor/src-gen"
     editorDirectory="/org.eclipse.skills.ui.questeditor/src-gen" modelPluginID="org.eclipse.skills"
     modelName="Skills" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"
+    testsDirectory="/org.eclipse.skills.model.test/src" testSuiteClass="org.eclipse.skills.model.SkillsAllTests"
     importerID="org.eclipse.emf.importer.ecore" complianceLevel="8.0" copyrightFields="false"
     editPluginID="org.eclipse.skills.ui.questeditor" editorPluginID="org.eclipse.skills.ui.questeditor"
-    interfaceNamePattern="I{0}" classNamePattern="M{0}" operationReflection="true"
-    importOrganizing="true">
+    testsPluginID="org.eclipse.skills.model.test" interfaceNamePattern="I{0}" classNamePattern="M{0}"
+    operationReflection="true" importOrganizing="true">
   <foreignModel>Skills.ecore</foreignModel>
   <genPackages prefix="Skills" basePackage="org.eclipse.skills" disposableProviderFactory="true"
       ecorePackage="Skills.ecore#/">
@@ -68,9 +69,7 @@
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Skills.ecore#//Skill/name"/>
       <genFeatures children="true" createChild="true" propertySortChoices="true" ecoreFeature="ecore:EReference Skills.ecore#//Skill/description"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Skills.ecore#//Skill/experience"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Skills.ecore#//Skill/xpLevelFactor"/>
-      <genFeatures children="true" createChild="true" propertySortChoices="true" ecoreFeature="ecore:EAttribute Skills.ecore#//Skill/level"/>
-      <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EAttribute Skills.ecore#//Skill/title"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Skills.ecore#//Skill/progression"/>
       <genOperations ecoreOperation="Skills.ecore#//Skill/addExperience">
         <genParameters ecoreParameter="Skills.ecore#//Skill/addExperience/amount"/>
       </genOperations>
@@ -146,5 +145,17 @@
     <genClasses image="false" ecoreClass="Skills.ecore#//UserDependency">
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference Skills.ecore#//UserDependency/user"/>
     </genClasses>
+    <genClasses image="false" ecoreClass="Skills.ecore#//LevelProgression">
+      <genOperations ecoreOperation="Skills.ecore#//LevelProgression/getMinimumXpForLevel">
+        <genParameters ecoreParameter="Skills.ecore#//LevelProgression/getMinimumXpForLevel/level"/>
+      </genOperations>
+      <genOperations ecoreOperation="Skills.ecore#//LevelProgression/getLevel">
+        <genParameters ecoreParameter="Skills.ecore#//LevelProgression/getLevel/xp"/>
+      </genOperations>
+    </genClasses>
+    <genClasses ecoreClass="Skills.ecore#//FactorProgression">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Skills.ecore#//FactorProgression/baseXpNeeded"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Skills.ecore#//FactorProgression/xpFactor"/>
+    </genClasses>
   </genPackages>
 </genmodel:GenModel>
diff --git a/plugins/org.eclipse.skills/model/model.aird b/plugins/org.eclipse.skills/model/model.aird
index 1e85bfa..373d589 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="373692e4-6329-42b1-95b6-b28b9cdde2e8">
+      <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_n6l40EwrEeqwHIzbUoB2lQ" name="Skills Model" repPath="#_n4mUwEwrEeqwHIzbUoB2lQ" changeId="e98a7a72-46ad-411d-b4e9-bd05e42ca994">
         <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>
@@ -206,18 +206,6 @@
               <styles xmi:type="notation:FontStyle" xmi:id="_rIogdNrpEeq_CZJuNlb8eA" fontName="Cantarell" fontHeight="8"/>
               <layoutConstraint xmi:type="notation:Location" xmi:id="_rIogddrpEeq_CZJuNlb8eA"/>
             </children>
-            <children xmi:type="notation:Node" xmi:id="_FVwmgN4dEeq6k6a2XVHNwA" type="3010" element="_FVfgwN4dEeq6k6a2XVHNwA">
-              <styles xmi:type="notation:FontStyle" xmi:id="_FVwmgd4dEeq6k6a2XVHNwA" fontColor="2697711" fontName="Segoe UI" fontHeight="8"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_FVwmgt4dEeq6k6a2XVHNwA"/>
-            </children>
-            <children xmi:type="notation:Node" xmi:id="_x9Co4N4dEeq6k6a2XVHNwA" type="3010" element="_x8zYUN4dEeq6k6a2XVHNwA">
-              <styles xmi:type="notation:FontStyle" xmi:id="_x9Co4d4dEeq6k6a2XVHNwA" fontColor="2697711" fontName="Segoe UI" fontHeight="8"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_x9Co4t4dEeq6k6a2XVHNwA"/>
-            </children>
-            <children xmi:type="notation:Node" xmi:id="_62EfEN4dEeq6k6a2XVHNwA" type="3010" element="_614R0N4dEeq6k6a2XVHNwA">
-              <styles xmi:type="notation:FontStyle" xmi:id="_62EfEd4dEeq6k6a2XVHNwA" fontColor="2697711" fontName="Segoe UI" fontHeight="8"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_62EfEt4dEeq6k6a2XVHNwA"/>
-            </children>
             <children xmi:type="notation:Node" xmi:id="_rIogdtrpEeq_CZJuNlb8eA" type="3010" element="_rHc0sNrpEeq_CZJuNlb8eA">
               <styles xmi:type="notation:FontStyle" xmi:id="_rIogd9rpEeq_CZJuNlb8eA" fontName="Cantarell" fontHeight="8"/>
               <layoutConstraint xmi:type="notation:Location" xmi:id="_rIogeNrpEeq_CZJuNlb8eA"/>
@@ -505,7 +493,7 @@
             <styles xmi:type="notation:FilteringStyle" xmi:id="_Wt8aVd4dEeq6k6a2XVHNwA"/>
           </children>
           <styles xmi:type="notation:ShapeStyle" xmi:id="_Wt8aUN4dEeq6k6a2XVHNwA" fontName="Segoe UI" fontHeight="8"/>
-          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Wt8aUd4dEeq6k6a2XVHNwA" x="55" y="375" width="143" height="128"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Wt8aUd4dEeq6k6a2XVHNwA" x="30" y="-150" width="143" height="128"/>
         </children>
         <children xmi:type="notation:Node" xmi:id="_gWTLkOBVEeq6k6a2XVHNwA" type="2003" element="_gWD7AOBVEeq6k6a2XVHNwA">
           <children xmi:type="notation:Node" xmi:id="_gWTyoOBVEeq6k6a2XVHNwA" type="5007"/>
@@ -555,6 +543,40 @@
           <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>
+        <children xmi:type="notation:Node" xmi:id="_7eNdYAIdEeuURJHBrP3sSA" type="2003" element="_7dsgAAIdEeuURJHBrP3sSA">
+          <children xmi:type="notation:Node" xmi:id="_7eRu0AIdEeuURJHBrP3sSA" type="5007"/>
+          <children xmi:type="notation:Node" xmi:id="_7eSV4AIdEeuURJHBrP3sSA" type="7004">
+            <children xmi:type="notation:Node" xmi:id="_F6t4gAIeEeuURJHBrP3sSA" type="3010" element="_F6f2EgIeEeuURJHBrP3sSA">
+              <styles xmi:type="notation:FontStyle" xmi:id="_F6t4gQIeEeuURJHBrP3sSA" fontName="Cantarell" fontHeight="8"/>
+              <layoutConstraint xmi:type="notation:Location" xmi:id="_F6t4ggIeEeuURJHBrP3sSA"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_MaPgsAIeEeuURJHBrP3sSA" type="3010" element="_MZ9M0AIeEeuURJHBrP3sSA">
+              <styles xmi:type="notation:FontStyle" xmi:id="_MaPgsQIeEeuURJHBrP3sSA" fontName="Cantarell" fontHeight="8"/>
+              <layoutConstraint xmi:type="notation:Location" xmi:id="_MaPgsgIeEeuURJHBrP3sSA"/>
+            </children>
+            <styles xmi:type="notation:SortingStyle" xmi:id="_7eSV4QIdEeuURJHBrP3sSA"/>
+            <styles xmi:type="notation:FilteringStyle" xmi:id="_7eSV4gIdEeuURJHBrP3sSA"/>
+          </children>
+          <styles xmi:type="notation:ShapeStyle" xmi:id="_7eNdYQIdEeuURJHBrP3sSA" fontName="Cantarell" fontHeight="8" italic="true"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7eNdYgIdEeuURJHBrP3sSA" x="85" y="470" width="198" height="100"/>
+        </children>
+        <children xmi:type="notation:Node" xmi:id="_RpU0sAIeEeuURJHBrP3sSA" type="2003" element="_RpFkIAIeEeuURJHBrP3sSA">
+          <children xmi:type="notation:Node" xmi:id="_RpU0swIeEeuURJHBrP3sSA" type="5007"/>
+          <children xmi:type="notation:Node" xmi:id="_RpU0tAIeEeuURJHBrP3sSA" type="7004">
+            <children xmi:type="notation:Node" xmi:id="_VWdNwAIeEeuURJHBrP3sSA" type="3010" element="_VWNWIAIeEeuURJHBrP3sSA">
+              <styles xmi:type="notation:FontStyle" xmi:id="_VWdNwQIeEeuURJHBrP3sSA" fontColor="2697711" fontName="Cantarell" fontHeight="8"/>
+              <layoutConstraint xmi:type="notation:Location" xmi:id="_VWdNwgIeEeuURJHBrP3sSA"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_bUCmgAIeEeuURJHBrP3sSA" type="3010" element="_FVfgwN4dEeq6k6a2XVHNwA">
+              <styles xmi:type="notation:FontStyle" xmi:id="_bUCmgQIeEeuURJHBrP3sSA" fontName="Cantarell" fontHeight="8"/>
+              <layoutConstraint xmi:type="notation:Location" xmi:id="_bUCmggIeEeuURJHBrP3sSA"/>
+            </children>
+            <styles xmi:type="notation:SortingStyle" xmi:id="_RpU0tQIeEeuURJHBrP3sSA"/>
+            <styles xmi:type="notation:FilteringStyle" xmi:id="_RpU0tgIeEeuURJHBrP3sSA"/>
+          </children>
+          <styles xmi:type="notation:ShapeStyle" xmi:id="_RpU0sQIeEeuURJHBrP3sSA" fontName="Cantarell" fontHeight="8"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_RpU0sgIeEeuURJHBrP3sSA" x="85" y="650" width="198" 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">
@@ -766,17 +788,17 @@
         </edges>
         <edges xmi:type="notation:Edge" xmi:id="_rJCJENrpEeq_CZJuNlb8eA" type="4001" element="_rIA1YNrpEeq_CZJuNlb8eA" source="_rIf9lNrpEeq_CZJuNlb8eA" target="_rIc6Q9rpEeq_CZJuNlb8eA">
           <children xmi:type="notation:Node" xmi:id="_rJCwINrpEeq_CZJuNlb8eA" type="6001">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rJCwIdrpEeq_CZJuNlb8eA" x="70" y="-10"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rJCwIdrpEeq_CZJuNlb8eA" x="-61" y="153"/>
           </children>
           <children xmi:type="notation:Node" xmi:id="_rJCwItrpEeq_CZJuNlb8eA" type="6002">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rJCwI9rpEeq_CZJuNlb8eA" x="93" y="-10"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rJCwI9rpEeq_CZJuNlb8eA" x="96" y="-10"/>
           </children>
           <children xmi:type="notation:Node" xmi:id="_rJDXMNrpEeq_CZJuNlb8eA" type="6003">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rJDXMdrpEeq_CZJuNlb8eA" x="-185"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rJDXMdrpEeq_CZJuNlb8eA" x="-188"/>
           </children>
           <styles xmi:type="notation:ConnectorStyle" xmi:id="_rJCJEdrpEeq_CZJuNlb8eA" routing="Rectilinear"/>
           <styles xmi:type="notation:FontStyle" xmi:id="_rJCJEtrpEeq_CZJuNlb8eA" fontColor="7490599" fontName="Cantarell" fontHeight="8"/>
-          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_rJCJE9rpEeq_CZJuNlb8eA" points="[-59, -24, 394, 533]$[-409, -24, 44, 533]$[-409, -508, 44, 49]"/>
+          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_rJCJE9rpEeq_CZJuNlb8eA" points="[-59, -24, 391, 533]$[-384, -24, 66, 533]$[-384, -508, 66, 49]"/>
           <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_rJDXMtrpEeq_CZJuNlb8eA" id="(0.5,0.5)"/>
           <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_rJDXM9rpEeq_CZJuNlb8eA" id="(0.5,0.5)"/>
         </edges>
@@ -1054,17 +1076,17 @@
         </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="-466" y="-10"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2U2a8dyOEeq6k6a2XVHNwA" x="-442" y="-10"/>
           </children>
           <children xmi:type="notation:Node" xmi:id="_2U3CANyOEeq6k6a2XVHNwA" type="6002">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2U3CAdyOEeq6k6a2XVHNwA" x="-215" y="114"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2U3CAdyOEeq6k6a2XVHNwA" x="-208" y="114"/>
           </children>
           <children xmi:type="notation:Node" xmi:id="_2U4QINyOEeq6k6a2XVHNwA" type="6003">
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2U4QIdyOEeq6k6a2XVHNwA" x="-1"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2U4QIdyOEeq6k6a2XVHNwA" x="-8"/>
           </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="[40, 98, 1825, 681]$[40, 349, 1825, 932]$[-1888, 349, -103, 932]$[-1888, -470, -103, 113]"/>
+          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_2UvGMtyOEeq6k6a2XVHNwA" points="[20, 98, 1862, 683]$[20, 348, 1862, 933]$[-1880, 348, -38, 933]$[-1880, -497, -38, 88]"/>
           <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>
@@ -1148,6 +1170,38 @@
           <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>
+        <edges xmi:type="notation:Edge" xmi:id="_f_4DgAIeEeuURJHBrP3sSA" type="4001" element="_f_dz6AIeEeuURJHBrP3sSA" source="_rIc6Q9rpEeq_CZJuNlb8eA" target="_7eNdYAIdEeuURJHBrP3sSA">
+          <children xmi:type="notation:Node" xmi:id="_f_4qkAIeEeuURJHBrP3sSA" type="6001">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_f_4qkQIeEeuURJHBrP3sSA" x="23" y="-10"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_f_4qkgIeEeuURJHBrP3sSA" type="6002">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_f_4qkwIeEeuURJHBrP3sSA" x="6" y="10"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_f_5RoAIeEeuURJHBrP3sSA" type="6003">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_f_5RoQIeEeuURJHBrP3sSA" y="10"/>
+          </children>
+          <styles xmi:type="notation:ConnectorStyle" xmi:id="_f_4DgQIeEeuURJHBrP3sSA" routing="Rectilinear"/>
+          <styles xmi:type="notation:FontStyle" xmi:id="_f_4DggIeEeuURJHBrP3sSA" fontColor="7490599" fontName="Cantarell" fontHeight="8"/>
+          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_f_4DgwIeEeuURJHBrP3sSA" points="[-10, 0, 0, -147]$[-10, 147, 0, 0]"/>
+          <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_f_7G0AIeEeuURJHBrP3sSA" id="(0.1488095238095238,1.0)"/>
+          <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_f_7G0QIeEeuURJHBrP3sSA" id="(0.5612244897959183,0.0)"/>
+        </edges>
+        <edges xmi:type="notation:Edge" xmi:id="_okvAgAIeEeuURJHBrP3sSA" type="4001" element="_okg-HwIeEeuURJHBrP3sSA" source="_RpU0sAIeEeuURJHBrP3sSA" target="_7eNdYAIdEeuURJHBrP3sSA">
+          <children xmi:type="notation:Node" xmi:id="_okvAhAIeEeuURJHBrP3sSA" type="6001">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_okvAhQIeEeuURJHBrP3sSA" y="-10"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_okvAhgIeEeuURJHBrP3sSA" type="6002">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_okvAhwIeEeuURJHBrP3sSA" y="10"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_okvAiAIeEeuURJHBrP3sSA" type="6003">
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_okvAiQIeEeuURJHBrP3sSA" y="10"/>
+          </children>
+          <styles xmi:type="notation:ConnectorStyle" xmi:id="_okvAgQIeEeuURJHBrP3sSA" routing="Tree"/>
+          <styles xmi:type="notation:FontStyle" xmi:id="_okvAggIeEeuURJHBrP3sSA" fontName="Cantarell" fontHeight="8"/>
+          <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_okvAgwIeEeuURJHBrP3sSA" points="[0, 0, 25, 82]$[-25, -82, 0, 0]"/>
+          <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_okvnkAIeEeuURJHBrP3sSA" id="(0.5561224489795918,0.01020408163265306)"/>
+          <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_okvnkQIeEeuURJHBrP3sSA" id="(0.5,0.5)"/>
+        </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">
@@ -1362,7 +1416,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='Operation']"/>
       </ownedElements>
     </ownedDiagramElements>
-    <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_rGpjcdrpEeq_CZJuNlb8eA" name="Skill" tooltipText="" outgoingEdges="_rH785trpEeq_CZJuNlb8eA" incomingEdges="_rH5goNrpEeq_CZJuNlb8eA _rH7V1trpEeq_CZJuNlb8eA _rH_AM9rpEeq_CZJuNlb8eA _rIA1YNrpEeq_CZJuNlb8eA _2Tg-MNyOEeq6k6a2XVHNwA" width="12" height="10">
+    <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_rGpjcdrpEeq_CZJuNlb8eA" name="Skill" tooltipText="" outgoingEdges="_rH785trpEeq_CZJuNlb8eA _f_dz6AIeEeuURJHBrP3sSA" incomingEdges="_rH5goNrpEeq_CZJuNlb8eA _rH7V1trpEeq_CZJuNlb8eA _rH_AM9rpEeq_CZJuNlb8eA _rIA1YNrpEeq_CZJuNlb8eA _2Tg-MNyOEeq6k6a2XVHNwA" width="12" height="10">
       <target xmi:type="ecore:EClass" href="Skills.ecore#//Skill"/>
       <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//Skill"/>
       <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
@@ -1375,8 +1429,8 @@
       <ownedElements xmi:type="diagram:DNodeListElement" uid="_rHbmkNrpEeq_CZJuNlb8eA" name="name : EString = &lt;unnamed>" tooltipText="">
         <target xmi:type="ecore:EAttribute" href="Skills.ecore#//Skill/name"/>
         <semanticElements xmi:type="ecore:EAttribute" href="Skills.ecore#//Skill/name"/>
-        <ownedStyle xmi:type="diagram:BundledImage" uid="_rHbmkdrpEeq_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='EC%20EAttribute']/@style"/>
+        <ownedStyle xmi:type="diagram:BundledImage" uid="_5YOBQQIdEeuURJHBrP3sSA" labelAlignment="LEFT" description="_paxGE-wkEeq5FfcjywLUwQ">
+          <labelFormat>bold</labelFormat>
         </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='EC%20EAttribute']"/>
       </ownedElements>
@@ -1388,28 +1442,6 @@
         </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='EC%20EAttribute']"/>
       </ownedElements>
-      <ownedElements xmi:type="diagram:DNodeListElement" uid="_FVfgwN4dEeq6k6a2XVHNwA" name="xpLevelFactor : EDouble = 2.4" tooltipText="">
-        <target xmi:type="ecore:EAttribute" href="Skills.ecore#//Skill/xpLevelFactor"/>
-        <semanticElements xmi:type="ecore:EAttribute" href="Skills.ecore#//Skill/xpLevelFactor"/>
-        <ownedStyle xmi:type="diagram:BundledImage" uid="_SAz80d4dEeq6k6a2XVHNwA" 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='EC%20EAttribute']/@style"/>
-        </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='EC%20EAttribute']"/>
-      </ownedElements>
-      <ownedElements xmi:type="diagram:DNodeListElement" uid="_x8zYUN4dEeq6k6a2XVHNwA" name="/level : EInt" tooltipText="">
-        <target xmi:type="ecore:EAttribute" href="Skills.ecore#//Skill/level"/>
-        <semanticElements xmi:type="ecore:EAttribute" href="Skills.ecore#//Skill/level"/>
-        <ownedStyle xmi:type="diagram:BundledImage" uid="_4Yx9Qd4dEeq6k6a2XVHNwA" labelColor="39,76,114" labelAlignment="LEFT" description="_4YxWNt4dEeq6k6a2XVHNwA"/>
-        <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>
-      <ownedElements xmi:type="diagram:DNodeListElement" uid="_614R0N4dEeq6k6a2XVHNwA" name="/title : LevelNames = Apprentice" tooltipText="">
-        <target xmi:type="ecore:EAttribute" href="Skills.ecore#//Skill/title"/>
-        <semanticElements xmi:type="ecore:EAttribute" href="Skills.ecore#//Skill/title"/>
-        <ownedStyle xmi:type="diagram:BundledImage" uid="_9tf_Md4dEeq6k6a2XVHNwA" labelColor="39,76,114" labelAlignment="LEFT" description="_9tfYJN4dEeq6k6a2XVHNwA">
-          <labelFormat>bold</labelFormat>
-        </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='EC%20EAttribute']"/>
-      </ownedElements>
       <ownedElements xmi:type="diagram:DNodeListElement" uid="_rHc0sNrpEeq_CZJuNlb8eA" name="addExperience(amount EInt)" tooltipText="addExperience(amount)">
         <target xmi:type="ecore:EOperation" href="Skills.ecore#//Skill/addExperience"/>
         <semanticElements xmi:type="ecore:EOperation" href="Skills.ecore#//Skill/addExperience"/>
@@ -2375,6 +2407,86 @@
       </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="_7dsgAAIdEeuURJHBrP3sSA" name="LevelProgression" tooltipText="" incomingEdges="_f_dz6AIeEeuURJHBrP3sSA _okg-HwIeEeuURJHBrP3sSA" width="12" height="10">
+      <target xmi:type="ecore:EClass" href="Skills.ecore#//LevelProgression"/>
+      <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//LevelProgression"/>
+      <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+      <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+      <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_8XSdpgIhEeuoCenS4mFLPw" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_interface.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.0/@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']"/>
+      <ownedElements xmi:type="diagram:DNodeListElement" uid="_F6f2EgIeEeuURJHBrP3sSA" name="getMinimumXpForLevel(level EInt) : EInt" tooltipText="getMinimumXpForLevel(level) : EInt">
+        <target xmi:type="ecore:EOperation" href="Skills.ecore#//LevelProgression/getMinimumXpForLevel"/>
+        <semanticElements xmi:type="ecore:EOperation" href="Skills.ecore#//LevelProgression/getMinimumXpForLevel"/>
+        <semanticElements xmi:type="ecore:EParameter" href="Skills.ecore#//LevelProgression/getMinimumXpForLevel/level"/>
+        <ownedStyle xmi:type="diagram:BundledImage" uid="_F6gdIAIeEeuURJHBrP3sSA" 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>
+        <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="_MZ9M0AIeEeuURJHBrP3sSA" name="getLevel(xp EInt) : EInt" tooltipText="getLevel(xp) : EInt">
+        <target xmi:type="ecore:EOperation" href="Skills.ecore#//LevelProgression/getLevel"/>
+        <semanticElements xmi:type="ecore:EOperation" href="Skills.ecore#//LevelProgression/getLevel"/>
+        <semanticElements xmi:type="ecore:EParameter" href="Skills.ecore#//LevelProgression/getLevel/xp"/>
+        <ownedStyle xmi:type="diagram:BundledImage" uid="_MZ9z4AIeEeuURJHBrP3sSA" 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>
+        <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>
+    </ownedDiagramElements>
+    <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_RpFkIAIeEeuURJHBrP3sSA" name="FactorProgression" tooltipText="" outgoingEdges="_okg-HwIeEeuURJHBrP3sSA" width="12" height="10">
+      <target xmi:type="ecore:EClass" href="Skills.ecore#//FactorProgression"/>
+      <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//FactorProgression"/>
+      <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+      <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+      <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_a5PhAAIeEeuURJHBrP3sSA" 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']"/>
+      <ownedElements xmi:type="diagram:DNodeListElement" uid="_VWNWIAIeEeuURJHBrP3sSA" name="baseXpNeeded : EInt = 100" tooltipText="">
+        <target xmi:type="ecore:EAttribute" href="Skills.ecore#//FactorProgression/baseXpNeeded"/>
+        <semanticElements xmi:type="ecore:EAttribute" href="Skills.ecore#//FactorProgression/baseXpNeeded"/>
+        <ownedStyle xmi:type="diagram:BundledImage" uid="_YYNulQIeEeuURJHBrP3sSA" labelAlignment="LEFT" description="_paxGE-wkEeq5FfcjywLUwQ">
+          <labelFormat>bold</labelFormat>
+        </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='EC%20EAttribute']"/>
+      </ownedElements>
+      <ownedElements xmi:type="diagram:DNodeListElement" uid="_FVfgwN4dEeq6k6a2XVHNwA" name="xpFactor : EDouble = 2.4" tooltipText="">
+        <target xmi:type="ecore:EAttribute" href="Skills.ecore#//FactorProgression/xpFactor"/>
+        <semanticElements xmi:type="ecore:EAttribute" href="Skills.ecore#//FactorProgression/xpFactor"/>
+        <ownedStyle xmi:type="diagram:BundledImage" uid="_crBAiQIeEeuURJHBrP3sSA" labelAlignment="LEFT" description="_paxGE-wkEeq5FfcjywLUwQ">
+          <labelFormat>bold</labelFormat>
+        </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='EC%20EAttribute']"/>
+      </ownedElements>
+    </ownedDiagramElements>
+    <ownedDiagramElements xmi:type="diagram:DEdge" uid="_f_dz6AIeEeuURJHBrP3sSA" name="[1..1] progression" sourceNode="_rGpjcdrpEeq_CZJuNlb8eA" targetNode="_7dsgAAIdEeuURJHBrP3sSA">
+      <target xmi:type="ecore:EReference" href="Skills.ecore#//Skill/progression"/>
+      <semanticElements xmi:type="ecore:EReference" href="Skills.ecore#//Skill/progression"/>
+      <ownedStyle xmi:type="diagram:EdgeStyle" uid="_hJsLXgIeEeuURJHBrP3sSA" description="_rHw9wNrpEeq_CZJuNlb8eA" sourceArrow="FillDiamond" routingStyle="manhattan" strokeColor="0,0,0">
+        <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_hJsLYAIeEeuURJHBrP3sSA" showIcon="false">
+          <labelFormat>bold</labelFormat>
+        </centerLabelStyle>
+        <endLabelStyle xmi:type="diagram:EndLabelStyle" uid="_hJsLXwIeEeuURJHBrP3sSA" 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>
+    <ownedDiagramElements xmi:type="diagram:DEdge" uid="_okg-HwIeEeuURJHBrP3sSA" sourceNode="_RpFkIAIeEeuURJHBrP3sSA" targetNode="_7dsgAAIdEeuURJHBrP3sSA">
+      <target xmi:type="ecore:EClass" href="Skills.ecore#//FactorProgression"/>
+      <semanticElements xmi:type="ecore:EClass" href="Skills.ecore#//FactorProgression"/>
+      <ownedStyle xmi:type="diagram:EdgeStyle" uid="_okhlIAIeEeuURJHBrP3sSA" lineStyle="dash" 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']/@conditionnalStyles.0/@style"/>
+        <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_okhlIQIeEeuURJHBrP3sSA" showIcon="false">
+          <labelFormat>italic</labelFormat>
+        </beginLabelStyle>
+        <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_okhlIgIeEeuURJHBrP3sSA" 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>
     <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/plugin.xml b/plugins/org.eclipse.skills/plugin.xml
index 509fa50..09da9f7 100644
--- a/plugins/org.eclipse.skills/plugin.xml
+++ b/plugins/org.eclipse.skills/plugin.xml
@@ -75,5 +75,19 @@
             class="org.eclipse.skills.preferences.SkillsPreferenceInitializer">

       </initializer>

    </extension>

+   <extension

+         point="org.eclipse.ui.menus">

+      <menuContribution

+            allPopups="false"

+            locationURI="toolbar:org.eclipse.ui.trim.status">

+         <toolbar

+               id="org.eclipse.skills.progress"

+               label="Skills">

+            <control

+                  class="org.eclipse.skills.ui.status.StatusBarProgressContribution">

+            </control>

+         </toolbar>

+      </menuContribution>

+   </extension>

 

 </plugin>

diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/IFactorProgression.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/IFactorProgression.java
new file mode 100644
index 0000000..c7076df
--- /dev/null
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/IFactorProgression.java
@@ -0,0 +1,70 @@
+/**
+ */
+package org.eclipse.skills.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Factor Progression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.skills.model.IFactorProgression#getBaseXpNeeded <em>Base Xp Needed</em>}</li>
+ *   <li>{@link org.eclipse.skills.model.IFactorProgression#getXpFactor <em>Xp Factor</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.skills.model.ISkillsPackage#getFactorProgression()
+ * @model
+ * @generated
+ */
+public interface IFactorProgression extends ILevelProgression {
+	/**
+	 * Returns the value of the '<em><b>Base Xp Needed</b></em>' attribute.
+	 * The default value is <code>"100"</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Xp Needed</em>' attribute.
+	 * @see #setBaseXpNeeded(int)
+	 * @see org.eclipse.skills.model.ISkillsPackage#getFactorProgression_BaseXpNeeded()
+	 * @model default="100" required="true"
+	 * @generated
+	 */
+	int getBaseXpNeeded();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.skills.model.IFactorProgression#getBaseXpNeeded <em>Base Xp Needed</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Xp Needed</em>' attribute.
+	 * @see #getBaseXpNeeded()
+	 * @generated
+	 */
+	void setBaseXpNeeded(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Xp Factor</b></em>' attribute.
+	 * The default value is <code>"2.4"</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Xp Factor</em>' attribute.
+	 * @see #setXpFactor(double)
+	 * @see org.eclipse.skills.model.ISkillsPackage#getFactorProgression_XpFactor()
+	 * @model default="2.4" required="true"
+	 * @generated
+	 */
+	double getXpFactor();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.skills.model.IFactorProgression#getXpFactor <em>Xp Factor</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Xp Factor</em>' attribute.
+	 * @see #getXpFactor()
+	 * @generated
+	 */
+	void setXpFactor(double value);
+
+} // IFactorProgression
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ILevelProgression.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ILevelProgression.java
new file mode 100644
index 0000000..4b2db86
--- /dev/null
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ILevelProgression.java
@@ -0,0 +1,34 @@
+/**
+ */
+package org.eclipse.skills.model;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Level Progression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.skills.model.ISkillsPackage#getLevelProgression()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface ILevelProgression extends EObject {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model required="true"
+	 * @generated
+	 */
+	int getMinimumXpForLevel(int level);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model required="true"
+	 * @generated
+	 */
+	int getLevel(int xp);
+
+} // ILevelProgression
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkill.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkill.java
index aa1846f..919fafb 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkill.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkill.java
@@ -16,9 +16,7 @@
  *   <li>{@link org.eclipse.skills.model.ISkill#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.skills.model.ISkill#getDescription <em>Description</em>}</li>
  *   <li>{@link org.eclipse.skills.model.ISkill#getExperience <em>Experience</em>}</li>
- *   <li>{@link org.eclipse.skills.model.ISkill#getXpLevelFactor <em>Xp Level Factor</em>}</li>
- *   <li>{@link org.eclipse.skills.model.ISkill#getLevel <em>Level</em>}</li>
- *   <li>{@link org.eclipse.skills.model.ISkill#getTitle <em>Title</em>}</li>
+ *   <li>{@link org.eclipse.skills.model.ISkill#getProgression <em>Progression</em>}</li>
  * </ul>
  *
  * @see org.eclipse.skills.model.ISkillsPackage#getSkill()
@@ -34,7 +32,7 @@
 	 * @return the value of the '<em>Name</em>' attribute.
 	 * @see #setName(String)
 	 * @see org.eclipse.skills.model.ISkillsPackage#getSkill_Name()
-	 * @model default="&lt;unnamed&gt;"
+	 * @model default="&lt;unnamed&gt;" required="true"
 	 * @generated
 	 */
 	String getName();
@@ -94,51 +92,26 @@
 	void setExperience(int value);
 
 	/**
-	 * Returns the value of the '<em><b>Xp Level Factor</b></em>' attribute.
-	 * The default value is <code>"2.4"</code>.
+	 * Returns the value of the '<em><b>Progression</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Xp Level Factor</em>' attribute.
-	 * @see #setXpLevelFactor(double)
-	 * @see org.eclipse.skills.model.ISkillsPackage#getSkill_XpLevelFactor()
-	 * @model default="2.4"
+	 * @return the value of the '<em>Progression</em>' containment reference.
+	 * @see #setProgression(ILevelProgression)
+	 * @see org.eclipse.skills.model.ISkillsPackage#getSkill_Progression()
+	 * @model containment="true" required="true"
 	 * @generated
 	 */
-	double getXpLevelFactor();
+	ILevelProgression getProgression();
 
 	/**
-	 * Sets the value of the '{@link org.eclipse.skills.model.ISkill#getXpLevelFactor <em>Xp Level Factor</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipse.skills.model.ISkill#getProgression <em>Progression</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Xp Level Factor</em>' attribute.
-	 * @see #getXpLevelFactor()
+	 * @param value the new value of the '<em>Progression</em>' containment reference.
+	 * @see #getProgression()
 	 * @generated
 	 */
-	void setXpLevelFactor(double value);
-
-	/**
-	 * Returns the value of the '<em><b>Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Level</em>' attribute.
-	 * @see org.eclipse.skills.model.ISkillsPackage#getSkill_Level()
-	 * @model transient="true" changeable="false" volatile="true" derived="true"
-	 * @generated
-	 */
-	int getLevel();
-
-	/**
-	 * Returns the value of the '<em><b>Title</b></em>' attribute.
-	 * The literals are from the enumeration {@link org.eclipse.skills.model.LevelNames}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Title</em>' attribute.
-	 * @see org.eclipse.skills.model.LevelNames
-	 * @see org.eclipse.skills.model.ISkillsPackage#getSkill_Title()
-	 * @model required="true" transient="true" changeable="false" volatile="true" derived="true"
-	 * @generated
-	 */
-	LevelNames getTitle();
+	void setProgression(ILevelProgression value);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkillsFactory.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkillsFactory.java
index 546dd64..b8b65ed 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkillsFactory.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ISkillsFactory.java
@@ -202,6 +202,15 @@
 	IHint createHint();
 
 	/**
+	 * Returns a new object of class '<em>Factor Progression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Factor Progression</em>'.
+	 * @generated
+	 */
+	IFactorProgression createFactorProgression();
+
+	/**
 	 * Returns the package supported by this factory.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
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 08c3824..5921bac 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
@@ -471,31 +471,13 @@
 	int SKILL__EXPERIENCE = 2;
 
 	/**
-	 * The feature id for the '<em><b>Xp Level Factor</b></em>' attribute.
+	 * The feature id for the '<em><b>Progression</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int SKILL__XP_LEVEL_FACTOR = 3;
-
-	/**
-	 * The feature id for the '<em><b>Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SKILL__LEVEL = 4;
-
-	/**
-	 * The feature id for the '<em><b>Title</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SKILL__TITLE = 5;
+	int SKILL__PROGRESSION = 3;
 
 	/**
 	 * The number of structural features of the '<em>Skill</em>' class.
@@ -504,7 +486,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int SKILL_FEATURE_COUNT = 6;
+	int SKILL_FEATURE_COUNT = 4;
 
 	/**
 	 * The operation id for the '<em>Add Experience</em>' operation.
@@ -1858,6 +1840,116 @@
 	int HINT_OPERATION_COUNT = DESCRIPTION_OPERATION_COUNT + 0;
 
 	/**
+	 * The meta object id for the '{@link org.eclipse.skills.model.ILevelProgression <em>Level Progression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.skills.model.ILevelProgression
+	 * @see org.eclipse.skills.model.impl.MSkillsPackage#getLevelProgression()
+	 * @generated
+	 */
+	int LEVEL_PROGRESSION = 25;
+
+	/**
+	 * The number of structural features of the '<em>Level Progression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LEVEL_PROGRESSION_FEATURE_COUNT = 0;
+
+	/**
+	 * The operation id for the '<em>Get Minimum Xp For Level</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LEVEL_PROGRESSION___GET_MINIMUM_XP_FOR_LEVEL__INT = 0;
+
+	/**
+	 * The operation id for the '<em>Get Level</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LEVEL_PROGRESSION___GET_LEVEL__INT = 1;
+
+	/**
+	 * The number of operations of the '<em>Level Progression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LEVEL_PROGRESSION_OPERATION_COUNT = 2;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.skills.model.impl.MFactorProgression <em>Factor Progression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.skills.model.impl.MFactorProgression
+	 * @see org.eclipse.skills.model.impl.MSkillsPackage#getFactorProgression()
+	 * @generated
+	 */
+	int FACTOR_PROGRESSION = 26;
+
+	/**
+	 * The feature id for the '<em><b>Base Xp Needed</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FACTOR_PROGRESSION__BASE_XP_NEEDED = LEVEL_PROGRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Xp Factor</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FACTOR_PROGRESSION__XP_FACTOR = LEVEL_PROGRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Factor Progression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FACTOR_PROGRESSION_FEATURE_COUNT = LEVEL_PROGRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>Get Minimum Xp For Level</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FACTOR_PROGRESSION___GET_MINIMUM_XP_FOR_LEVEL__INT = LEVEL_PROGRESSION___GET_MINIMUM_XP_FOR_LEVEL__INT;
+
+	/**
+	 * The operation id for the '<em>Get Level</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FACTOR_PROGRESSION___GET_LEVEL__INT = LEVEL_PROGRESSION___GET_LEVEL__INT;
+
+	/**
+	 * The number of operations of the '<em>Factor Progression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FACTOR_PROGRESSION_OPERATION_COUNT = LEVEL_PROGRESSION_OPERATION_COUNT + 0;
+
+	/**
 	 * The meta object id for the '{@link org.eclipse.skills.model.LevelNames <em>Level Names</em>}' enum.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1865,7 +1957,7 @@
 	 * @see org.eclipse.skills.model.impl.MSkillsPackage#getLevelNames()
 	 * @generated
 	 */
-	int LEVEL_NAMES = 25;
+	int LEVEL_NAMES = 27;
 
 	/**
 	 * The meta object id for the '<em>Date</em>' data type.
@@ -1875,7 +1967,7 @@
 	 * @see org.eclipse.skills.model.impl.MSkillsPackage#getDate()
 	 * @generated
 	 */
-	int DATE = 26;
+	int DATE = 28;
 
 
 	/**
@@ -1886,7 +1978,7 @@
 	 * @see org.eclipse.skills.model.impl.MSkillsPackage#getCustomDependencyDefinition()
 	 * @generated
 	 */
-	int CUSTOM_DEPENDENCY_DEFINITION = 27;
+	int CUSTOM_DEPENDENCY_DEFINITION = 29;
 
 
 	/**
@@ -1897,7 +1989,7 @@
 	 * @see org.eclipse.skills.model.impl.MSkillsPackage#getImageData()
 	 * @generated
 	 */
-	int IMAGE_DATA = 28;
+	int IMAGE_DATA = 30;
 
 
 	/**
@@ -1908,7 +2000,7 @@
 	 * @see org.eclipse.skills.model.impl.MSkillsPackage#getISkillService()
 	 * @generated
 	 */
-	int ISKILL_SERVICE = 29;
+	int ISKILL_SERVICE = 31;
 
 
 	/**
@@ -2284,37 +2376,15 @@
 	EAttribute getSkill_Experience();
 
 	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.skills.model.ISkill#getXpLevelFactor <em>Xp Level Factor</em>}'.
+	 * Returns the meta object for the containment reference '{@link org.eclipse.skills.model.ISkill#getProgression <em>Progression</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Xp Level Factor</em>'.
-	 * @see org.eclipse.skills.model.ISkill#getXpLevelFactor()
+	 * @return the meta object for the containment reference '<em>Progression</em>'.
+	 * @see org.eclipse.skills.model.ISkill#getProgression()
 	 * @see #getSkill()
 	 * @generated
 	 */
-	EAttribute getSkill_XpLevelFactor();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.skills.model.ISkill#getLevel <em>Level</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Level</em>'.
-	 * @see org.eclipse.skills.model.ISkill#getLevel()
-	 * @see #getSkill()
-	 * @generated
-	 */
-	EAttribute getSkill_Level();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.skills.model.ISkill#getTitle <em>Title</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Title</em>'.
-	 * @see org.eclipse.skills.model.ISkill#getTitle()
-	 * @see #getSkill()
-	 * @generated
-	 */
-	EAttribute getSkill_Title();
+	EReference getSkill_Progression();
 
 	/**
 	 * Returns the meta object for the '{@link org.eclipse.skills.model.ISkill#addExperience(int) <em>Add Experience</em>}' operation.
@@ -2893,6 +2963,68 @@
 	EReference getUserDependency_User();
 
 	/**
+	 * Returns the meta object for class '{@link org.eclipse.skills.model.ILevelProgression <em>Level Progression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Level Progression</em>'.
+	 * @see org.eclipse.skills.model.ILevelProgression
+	 * @generated
+	 */
+	EClass getLevelProgression();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.skills.model.ILevelProgression#getMinimumXpForLevel(int) <em>Get Minimum Xp For Level</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Get Minimum Xp For Level</em>' operation.
+	 * @see org.eclipse.skills.model.ILevelProgression#getMinimumXpForLevel(int)
+	 * @generated
+	 */
+	EOperation getLevelProgression__GetMinimumXpForLevel__int();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.skills.model.ILevelProgression#getLevel(int) <em>Get Level</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Get Level</em>' operation.
+	 * @see org.eclipse.skills.model.ILevelProgression#getLevel(int)
+	 * @generated
+	 */
+	EOperation getLevelProgression__GetLevel__int();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.skills.model.IFactorProgression <em>Factor Progression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Factor Progression</em>'.
+	 * @see org.eclipse.skills.model.IFactorProgression
+	 * @generated
+	 */
+	EClass getFactorProgression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.skills.model.IFactorProgression#getBaseXpNeeded <em>Base Xp Needed</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Base Xp Needed</em>'.
+	 * @see org.eclipse.skills.model.IFactorProgression#getBaseXpNeeded()
+	 * @see #getFactorProgression()
+	 * @generated
+	 */
+	EAttribute getFactorProgression_BaseXpNeeded();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.skills.model.IFactorProgression#getXpFactor <em>Xp Factor</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Xp Factor</em>'.
+	 * @see org.eclipse.skills.model.IFactorProgression#getXpFactor()
+	 * @see #getFactorProgression()
+	 * @generated
+	 */
+	EAttribute getFactorProgression_XpFactor();
+
+	/**
 	 * Returns the meta object for enum '{@link org.eclipse.skills.model.LevelNames <em>Level Names</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3262,28 +3394,12 @@
 		EAttribute SKILL__EXPERIENCE = eINSTANCE.getSkill_Experience();
 
 		/**
-		 * The meta object literal for the '<em><b>Xp Level Factor</b></em>' attribute feature.
+		 * The meta object literal for the '<em><b>Progression</b></em>' containment reference feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EAttribute SKILL__XP_LEVEL_FACTOR = eINSTANCE.getSkill_XpLevelFactor();
-
-		/**
-		 * The meta object literal for the '<em><b>Level</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SKILL__LEVEL = eINSTANCE.getSkill_Level();
-
-		/**
-		 * The meta object literal for the '<em><b>Title</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SKILL__TITLE = eINSTANCE.getSkill_Title();
+		EReference SKILL__PROGRESSION = eINSTANCE.getSkill_Progression();
 
 		/**
 		 * The meta object literal for the '<em><b>Add Experience</b></em>' operation.
@@ -3764,6 +3880,58 @@
 		EReference USER_DEPENDENCY__USER = eINSTANCE.getUserDependency_User();
 
 		/**
+		 * The meta object literal for the '{@link org.eclipse.skills.model.ILevelProgression <em>Level Progression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.skills.model.ILevelProgression
+		 * @see org.eclipse.skills.model.impl.MSkillsPackage#getLevelProgression()
+		 * @generated
+		 */
+		EClass LEVEL_PROGRESSION = eINSTANCE.getLevelProgression();
+
+		/**
+		 * The meta object literal for the '<em><b>Get Minimum Xp For Level</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation LEVEL_PROGRESSION___GET_MINIMUM_XP_FOR_LEVEL__INT = eINSTANCE.getLevelProgression__GetMinimumXpForLevel__int();
+
+		/**
+		 * The meta object literal for the '<em><b>Get Level</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation LEVEL_PROGRESSION___GET_LEVEL__INT = eINSTANCE.getLevelProgression__GetLevel__int();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.skills.model.impl.MFactorProgression <em>Factor Progression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.skills.model.impl.MFactorProgression
+		 * @see org.eclipse.skills.model.impl.MSkillsPackage#getFactorProgression()
+		 * @generated
+		 */
+		EClass FACTOR_PROGRESSION = eINSTANCE.getFactorProgression();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Xp Needed</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute FACTOR_PROGRESSION__BASE_XP_NEEDED = eINSTANCE.getFactorProgression_BaseXpNeeded();
+
+		/**
+		 * The meta object literal for the '<em><b>Xp Factor</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute FACTOR_PROGRESSION__XP_FACTOR = eINSTANCE.getFactorProgression_XpFactor();
+
+		/**
 		 * 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/ITask.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ITask.java
index 0e1bd10..a6091db 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ITask.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/ITask.java
@@ -208,7 +208,7 @@
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Id</em>' attribute.
 	 * @see org.eclipse.skills.model.ISkillsPackage#getTask_Id()
-	 * @model id="true" required="true" transient="true" changeable="false" volatile="true" derived="true"
+	 * @model required="true" transient="true" changeable="false" volatile="true" derived="true"
 	 * @generated
 	 */
 	String getId();
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MFactorProgression.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MFactorProgression.java
new file mode 100644
index 0000000..6f3f25e
--- /dev/null
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MFactorProgression.java
@@ -0,0 +1,245 @@
+/**
+ */
+package org.eclipse.skills.model.impl;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.eclipse.skills.model.IFactorProgression;
+import org.eclipse.skills.model.ISkillsPackage;
+
+/**
+ * <!-- begin-user-doc --> An implementation of the model object '<em><b>Factor Progression</b></em>'. <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.skills.model.impl.MFactorProgression#getBaseXpNeeded <em>Base Xp Needed</em>}</li>
+ *   <li>{@link org.eclipse.skills.model.impl.MFactorProgression#getXpFactor <em>Xp Factor</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class MFactorProgression extends MinimalEObjectImpl.Container implements IFactorProgression {
+	/**
+	 * The default value of the '{@link #getBaseXpNeeded() <em>Base Xp Needed</em>}' attribute.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @see #getBaseXpNeeded()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int BASE_XP_NEEDED_EDEFAULT = 100;
+
+	/**
+	 * The cached value of the '{@link #getBaseXpNeeded() <em>Base Xp Needed</em>}' attribute.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @see #getBaseXpNeeded()
+	 * @generated
+	 * @ordered
+	 */
+	protected int baseXpNeeded = BASE_XP_NEEDED_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getXpFactor() <em>Xp Factor</em>}' attribute.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @see #getXpFactor()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double XP_FACTOR_EDEFAULT = 2.4;
+
+	/**
+	 * The cached value of the '{@link #getXpFactor() <em>Xp Factor</em>}' attribute.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @see #getXpFactor()
+	 * @generated
+	 * @ordered
+	 */
+	protected double xpFactor = XP_FACTOR_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected MFactorProgression() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ISkillsPackage.Literals.FACTOR_PROGRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public int getBaseXpNeeded() {
+		return baseXpNeeded;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setBaseXpNeeded(int newBaseXpNeeded) {
+		int oldBaseXpNeeded = baseXpNeeded;
+		baseXpNeeded = newBaseXpNeeded;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ISkillsPackage.FACTOR_PROGRESSION__BASE_XP_NEEDED, oldBaseXpNeeded, baseXpNeeded));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public double getXpFactor() {
+		return xpFactor;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setXpFactor(double newXpFactor) {
+		double oldXpFactor = xpFactor;
+		xpFactor = newXpFactor;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ISkillsPackage.FACTOR_PROGRESSION__XP_FACTOR, oldXpFactor, xpFactor));
+	}
+
+	/**
+	 * @generated NOT
+	 */
+	@Override
+	public int getMinimumXpForLevel(int level) {
+		if (level > 2)
+			return (int) (getMinimumXpForLevel(level - 1) * getXpFactor());
+
+		if (level == 2)
+			return getBaseXpNeeded();
+
+		return 0;
+	}
+
+	/**
+	 * @generated NOT
+	 */
+	@Override
+	public int getLevel(int xp) {
+		int candidate = 1;
+		while (getMinimumXpForLevel(candidate) <= xp)
+			candidate++;
+
+		return candidate - 1;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ISkillsPackage.FACTOR_PROGRESSION__BASE_XP_NEEDED:
+				return getBaseXpNeeded();
+			case ISkillsPackage.FACTOR_PROGRESSION__XP_FACTOR:
+				return getXpFactor();
+		}
+		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.FACTOR_PROGRESSION__BASE_XP_NEEDED:
+				setBaseXpNeeded((Integer)newValue);
+				return;
+			case ISkillsPackage.FACTOR_PROGRESSION__XP_FACTOR:
+				setXpFactor((Double)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ISkillsPackage.FACTOR_PROGRESSION__BASE_XP_NEEDED:
+				setBaseXpNeeded(BASE_XP_NEEDED_EDEFAULT);
+				return;
+			case ISkillsPackage.FACTOR_PROGRESSION__XP_FACTOR:
+				setXpFactor(XP_FACTOR_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ISkillsPackage.FACTOR_PROGRESSION__BASE_XP_NEEDED:
+				return baseXpNeeded != BASE_XP_NEEDED_EDEFAULT;
+			case ISkillsPackage.FACTOR_PROGRESSION__XP_FACTOR:
+				return xpFactor != XP_FACTOR_EDEFAULT;
+		}
+		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.FACTOR_PROGRESSION___GET_MINIMUM_XP_FOR_LEVEL__INT:
+				return getMinimumXpForLevel((Integer)arguments.get(0));
+			case ISkillsPackage.FACTOR_PROGRESSION___GET_LEVEL__INT:
+				return getLevel((Integer)arguments.get(0));
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuilder result = new StringBuilder(super.toString());
+		result.append(" (baseXpNeeded: ");
+		result.append(baseXpNeeded);
+		result.append(", xpFactor: ");
+		result.append(xpFactor);
+		result.append(')');
+		return result.toString();
+	}
+
+} // MFactorProgression
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkill.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkill.java
index 8903ee5..0137051 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkill.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkill.java
@@ -12,9 +12,10 @@
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
 import org.eclipse.skills.model.IDescription;
+import org.eclipse.skills.model.ILevelProgression;
 import org.eclipse.skills.model.ISkill;
+import org.eclipse.skills.model.ISkillsFactory;
 import org.eclipse.skills.model.ISkillsPackage;
-import org.eclipse.skills.model.LevelNames;
 
 /**
  * <!-- begin-user-doc --> An implementation of the model object '<em><b>Skill</b></em>'. <!-- end-user-doc -->
@@ -25,9 +26,7 @@
  *   <li>{@link org.eclipse.skills.model.impl.MSkill#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.skills.model.impl.MSkill#getDescription <em>Description</em>}</li>
  *   <li>{@link org.eclipse.skills.model.impl.MSkill#getExperience <em>Experience</em>}</li>
- *   <li>{@link org.eclipse.skills.model.impl.MSkill#getXpLevelFactor <em>Xp Level Factor</em>}</li>
- *   <li>{@link org.eclipse.skills.model.impl.MSkill#getLevel <em>Level</em>}</li>
- *   <li>{@link org.eclipse.skills.model.impl.MSkill#getTitle <em>Title</em>}</li>
+ *   <li>{@link org.eclipse.skills.model.impl.MSkill#getProgression <em>Progression</em>}</li>
  * </ul>
  *
  * @generated
@@ -79,40 +78,13 @@
 	protected int experience = EXPERIENCE_EDEFAULT;
 
 	/**
-	 * The default value of the '{@link #getXpLevelFactor() <em>Xp Level Factor</em>}' attribute.
+	 * The cached value of the '{@link #getProgression() <em>Progression</em>}' containment reference.
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getXpLevelFactor()
+	 * @see #getProgression()
 	 * @generated
 	 * @ordered
 	 */
-	protected static final double XP_LEVEL_FACTOR_EDEFAULT = 2.4;
-
-	/**
-	 * The cached value of the '{@link #getXpLevelFactor() <em>Xp Level Factor</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getXpLevelFactor()
-	 * @generated
-	 * @ordered
-	 */
-	protected double xpLevelFactor = XP_LEVEL_FACTOR_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLevel() <em>Level</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int LEVEL_EDEFAULT = 0;
-
-	/**
-	 * The default value of the '{@link #getTitle() <em>Title</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getTitle()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final LevelNames TITLE_EDEFAULT = LevelNames.APPRENTICE;
+	protected ILevelProgression progression;
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
@@ -219,9 +191,35 @@
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @generated
 	 */
+	public ILevelProgression getProgressionGen() {
+		return progression;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 *
+	 * @generated NOT
+	 */
 	@Override
-	public double getXpLevelFactor() {
-		return xpLevelFactor;
+	public ILevelProgression getProgression() {
+		if (getProgressionGen() == null)
+			setProgression(ISkillsFactory.eINSTANCE.createFactorProgression());
+
+		return getProgressionGen();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetProgression(ILevelProgression newProgression, NotificationChain msgs) {
+		ILevelProgression oldProgression = progression;
+		progression = newProgression;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ISkillsPackage.SKILL__PROGRESSION, oldProgression, newProgression);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
 	}
 
 	/**
@@ -229,44 +227,18 @@
 	 * @generated
 	 */
 	@Override
-	public void setXpLevelFactor(double newXpLevelFactor) {
-		double oldXpLevelFactor = xpLevelFactor;
-		xpLevelFactor = newXpLevelFactor;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ISkillsPackage.SKILL__XP_LEVEL_FACTOR, oldXpLevelFactor, xpLevelFactor));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
-	 * @generated NOT
-	 */
-	@Override
-	public int getLevel() {
-		double xp = getExperience();
-
-		int level = 1;
-		while (xp >= 100) {
-			xp /= getXpLevelFactor();
-			level++;
+	public void setProgression(ILevelProgression newProgression) {
+		if (newProgression != progression) {
+			NotificationChain msgs = null;
+			if (progression != null)
+				msgs = ((InternalEObject)progression).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ISkillsPackage.SKILL__PROGRESSION, null, msgs);
+			if (newProgression != null)
+				msgs = ((InternalEObject)newProgression).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ISkillsPackage.SKILL__PROGRESSION, null, msgs);
+			msgs = basicSetProgression(newProgression, msgs);
+			if (msgs != null) msgs.dispatch();
 		}
-
-		return level;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 *
-	 * @generated NOT
-	 */
-	@Override
-	public LevelNames getTitle() {
-		LevelNames title = LevelNames.get(getLevel());
-
-		if (title == null)
-			title = LevelNames.VALUES.get(LevelNames.VALUES.size() - 1);
-
-		return title;
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ISkillsPackage.SKILL__PROGRESSION, newProgression, newProgression));
 	}
 
 	/**
@@ -288,6 +260,8 @@
 		switch (featureID) {
 			case ISkillsPackage.SKILL__DESCRIPTION:
 				return basicSetDescription(null, msgs);
+			case ISkillsPackage.SKILL__PROGRESSION:
+				return basicSetProgression(null, msgs);
 		}
 		return super.eInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -305,12 +279,8 @@
 				return getDescription();
 			case ISkillsPackage.SKILL__EXPERIENCE:
 				return getExperience();
-			case ISkillsPackage.SKILL__XP_LEVEL_FACTOR:
-				return getXpLevelFactor();
-			case ISkillsPackage.SKILL__LEVEL:
-				return getLevel();
-			case ISkillsPackage.SKILL__TITLE:
-				return getTitle();
+			case ISkillsPackage.SKILL__PROGRESSION:
+				return getProgression();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -331,8 +301,8 @@
 			case ISkillsPackage.SKILL__EXPERIENCE:
 				setExperience((Integer)newValue);
 				return;
-			case ISkillsPackage.SKILL__XP_LEVEL_FACTOR:
-				setXpLevelFactor((Double)newValue);
+			case ISkillsPackage.SKILL__PROGRESSION:
+				setProgression((ILevelProgression)newValue);
 				return;
 		}
 		super.eSet(featureID, newValue);
@@ -354,8 +324,8 @@
 			case ISkillsPackage.SKILL__EXPERIENCE:
 				setExperience(EXPERIENCE_EDEFAULT);
 				return;
-			case ISkillsPackage.SKILL__XP_LEVEL_FACTOR:
-				setXpLevelFactor(XP_LEVEL_FACTOR_EDEFAULT);
+			case ISkillsPackage.SKILL__PROGRESSION:
+				setProgression((ILevelProgression)null);
 				return;
 		}
 		super.eUnset(featureID);
@@ -374,12 +344,8 @@
 				return description != null;
 			case ISkillsPackage.SKILL__EXPERIENCE:
 				return experience != EXPERIENCE_EDEFAULT;
-			case ISkillsPackage.SKILL__XP_LEVEL_FACTOR:
-				return xpLevelFactor != XP_LEVEL_FACTOR_EDEFAULT;
-			case ISkillsPackage.SKILL__LEVEL:
-				return getLevel() != LEVEL_EDEFAULT;
-			case ISkillsPackage.SKILL__TITLE:
-				return getTitle() != TITLE_EDEFAULT;
+			case ISkillsPackage.SKILL__PROGRESSION:
+				return progression != null;
 		}
 		return super.eIsSet(featureID);
 	}
@@ -411,8 +377,6 @@
 		result.append(name);
 		result.append(", experience: ");
 		result.append(experience);
-		result.append(", xpLevelFactor: ");
-		result.append(xpLevelFactor);
 		result.append(')');
 		return result.toString();
 	}
diff --git a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkillsFactory.java b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkillsFactory.java
index f481578..72dde7a 100644
--- a/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkillsFactory.java
+++ b/plugins/org.eclipse.skills/src-gen/org/eclipse/skills/model/impl/MSkillsFactory.java
@@ -82,6 +82,7 @@
 			case ISkillsPackage.TASK_DEPENDENCY: return createTaskDependency();
 			case ISkillsPackage.SKILL_DEPENDENCY: return createSkillDependency();
 			case ISkillsPackage.HINT: return createHint();
+			case ISkillsPackage.FACTOR_PROGRESSION: return createFactorProgression();
 			default:
 				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
 		}
@@ -358,6 +359,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
+	public IFactorProgression createFactorProgression() {
+		MFactorProgression factorProgression = new MFactorProgression();
+		return factorProgression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public LevelNames createLevelNamesFromString(EDataType eDataType, String initialValue) {
 		LevelNames result = LevelNames.get(initialValue);
 		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
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 26c4f18..9408b16 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
@@ -26,7 +26,9 @@
 import org.eclipse.skills.model.IDependencyWithAttributes;
 import org.eclipse.skills.model.IDescription;
 import org.eclipse.skills.model.IExperienceReward;
+import org.eclipse.skills.model.IFactorProgression;
 import org.eclipse.skills.model.IHint;
+import org.eclipse.skills.model.ILevelProgression;
 import org.eclipse.skills.model.INotDependency;
 import org.eclipse.skills.model.IOrDependency;
 import org.eclipse.skills.model.IQuest;
@@ -233,6 +235,20 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	private EClass levelProgressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass factorProgressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	private EEnum levelNamesEEnum = null;
 
 	/**
@@ -680,28 +696,8 @@
 	 * @generated
 	 */
 	@Override
-	public EAttribute getSkill_XpLevelFactor() {
-		return (EAttribute)skillEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public EAttribute getSkill_Level() {
-		return (EAttribute)skillEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public EAttribute getSkill_Title() {
-		return (EAttribute)skillEClass.getEStructuralFeatures().get(5);
+	public EReference getSkill_Progression() {
+		return (EReference)skillEClass.getEStructuralFeatures().get(3);
 	}
 
 	/**
@@ -1260,6 +1256,66 @@
 	 * @generated
 	 */
 	@Override
+	public EClass getLevelProgression() {
+		return levelProgressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EOperation getLevelProgression__GetMinimumXpForLevel__int() {
+		return levelProgressionEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EOperation getLevelProgression__GetLevel__int() {
+		return levelProgressionEClass.getEOperations().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EClass getFactorProgression() {
+		return factorProgressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EAttribute getFactorProgression_BaseXpNeeded() {
+		return (EAttribute)factorProgressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EAttribute getFactorProgression_XpFactor() {
+		return (EAttribute)factorProgressionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EEnum getLevelNames() {
 		return levelNamesEEnum;
 	}
@@ -1373,9 +1429,7 @@
 		createEAttribute(skillEClass, SKILL__NAME);
 		createEReference(skillEClass, SKILL__DESCRIPTION);
 		createEAttribute(skillEClass, SKILL__EXPERIENCE);
-		createEAttribute(skillEClass, SKILL__XP_LEVEL_FACTOR);
-		createEAttribute(skillEClass, SKILL__LEVEL);
-		createEAttribute(skillEClass, SKILL__TITLE);
+		createEReference(skillEClass, SKILL__PROGRESSION);
 		createEOperation(skillEClass, SKILL___ADD_EXPERIENCE__INT);
 
 		userTaskEClass = createEClass(USER_TASK);
@@ -1451,6 +1505,14 @@
 		userDependencyEClass = createEClass(USER_DEPENDENCY);
 		createEReference(userDependencyEClass, USER_DEPENDENCY__USER);
 
+		levelProgressionEClass = createEClass(LEVEL_PROGRESSION);
+		createEOperation(levelProgressionEClass, LEVEL_PROGRESSION___GET_MINIMUM_XP_FOR_LEVEL__INT);
+		createEOperation(levelProgressionEClass, LEVEL_PROGRESSION___GET_LEVEL__INT);
+
+		factorProgressionEClass = createEClass(FACTOR_PROGRESSION);
+		createEAttribute(factorProgressionEClass, FACTOR_PROGRESSION__BASE_XP_NEEDED);
+		createEAttribute(factorProgressionEClass, FACTOR_PROGRESSION__XP_FACTOR);
+
 		// Create enums
 		levelNamesEEnum = createEEnum(LEVEL_NAMES);
 
@@ -1505,6 +1567,7 @@
 		skillDependencyEClass.getESuperTypes().add(this.getUserDependency());
 		hintEClass.getESuperTypes().add(this.getDescription());
 		userDependencyEClass.getESuperTypes().add(this.getDependency());
+		factorProgressionEClass.getESuperTypes().add(this.getLevelProgression());
 
 		// Initialize classes, features, and operations; add parameters
 		initEClass(taskEClass, ITask.class, "Task", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
@@ -1517,7 +1580,7 @@
 		initEReference(getTask_Hints(), this.getHint(), null, "hints", null, 0, -1, ITask.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getTask_AutoActivation(), ecorePackage.getEBoolean(), "autoActivation", "true", 0, 1, ITask.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getTask_SkillService(), this.getISkillService(), "skillService", null, 0, 1, ITask.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTask_Id(), ecorePackage.getEString(), "id", null, 1, 1, ITask.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+		initEAttribute(getTask_Id(), ecorePackage.getEString(), "id", null, 1, 1, ITask.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
 
 		initEOperation(getTask__IsAvailable(), ecorePackage.getEBoolean(), "isAvailable", 0, 1, IS_UNIQUE, IS_ORDERED);
 
@@ -1556,12 +1619,10 @@
 		initEOperation(getUser__GetAvatar(), this.getImageData(), "getAvatar", 0, 1, IS_UNIQUE, IS_ORDERED);
 
 		initEClass(skillEClass, ISkill.class, "Skill", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getSkill_Name(), ecorePackage.getEString(), "name", "<unnamed>", 0, 1, ISkill.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getSkill_Name(), ecorePackage.getEString(), "name", "<unnamed>", 1, 1, ISkill.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getSkill_Description(), this.getDescription(), null, "description", null, 1, 1, ISkill.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getSkill_Experience(), ecorePackage.getEInt(), "experience", null, 0, 1, ISkill.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSkill_XpLevelFactor(), ecorePackage.getEDouble(), "xpLevelFactor", "2.4", 0, 1, ISkill.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSkill_Level(), ecorePackage.getEInt(), "level", null, 0, 1, ISkill.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSkill_Title(), this.getLevelNames(), "title", null, 1, 1, ISkill.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
+		initEReference(getSkill_Progression(), this.getLevelProgression(), null, "progression", null, 1, 1, ISkill.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		op = initEOperation(getSkill__AddExperience__int(), null, "addExperience", 0, 1, IS_UNIQUE, IS_ORDERED);
 		addEParameter(op, ecorePackage.getEInt(), "amount", 0, 1, IS_UNIQUE, IS_ORDERED);
@@ -1649,6 +1710,18 @@
 		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);
 
+		initEClass(levelProgressionEClass, ILevelProgression.class, "LevelProgression", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		op = initEOperation(getLevelProgression__GetMinimumXpForLevel__int(), ecorePackage.getEInt(), "getMinimumXpForLevel", 1, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "level", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = initEOperation(getLevelProgression__GetLevel__int(), ecorePackage.getEInt(), "getLevel", 1, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "xp", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		initEClass(factorProgressionEClass, IFactorProgression.class, "FactorProgression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getFactorProgression_BaseXpNeeded(), ecorePackage.getEInt(), "baseXpNeeded", "100", 1, 1, IFactorProgression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getFactorProgression_XpFactor(), ecorePackage.getEDouble(), "xpFactor", "2.4", 1, 1, IFactorProgression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, 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 c573401..107e041 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
@@ -2,6 +2,8 @@
  */
 package org.eclipse.skills.model.impl;
 
+import java.util.Objects;
+
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.impl.AdapterImpl;
 import org.eclipse.emf.ecore.EClass;
@@ -253,8 +255,7 @@
 	 */
 	private IUserTask getUsertask() {
 		for (final IUserTask usertask : getUser().getUsertasks()) {
-
-			if (getTask().equals(usertask.getTask()))
+			if (Objects.equals(getTask(), usertask.getTask()))
 				return usertask;
 		}
 
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 4cf06c5..dec2cec 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
@@ -168,6 +168,14 @@
 				return createUserDependencyAdapter();
 			}
 			@Override
+			public Adapter caseLevelProgression(ILevelProgression object) {
+				return createLevelProgressionAdapter();
+			}
+			@Override
+			public Adapter caseFactorProgression(IFactorProgression object) {
+				return createFactorProgressionAdapter();
+			}
+			@Override
 			public Adapter defaultCase(EObject object) {
 				return createEObjectAdapter();
 			}
@@ -538,6 +546,34 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.skills.model.ILevelProgression <em>Level Progression</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.ILevelProgression
+	 * @generated
+	 */
+	public Adapter createLevelProgressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.skills.model.IFactorProgression <em>Factor Progression</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.IFactorProgression
+	 * @generated
+	 */
+	public Adapter createFactorProgressionAdapter() {
+		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 6e7e9c6..6d6737c 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
@@ -242,6 +242,19 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case ISkillsPackage.LEVEL_PROGRESSION: {
+				ILevelProgression levelProgression = (ILevelProgression)theEObject;
+				T result = caseLevelProgression(levelProgression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ISkillsPackage.FACTOR_PROGRESSION: {
+				IFactorProgression factorProgression = (IFactorProgression)theEObject;
+				T result = caseFactorProgression(factorProgression);
+				if (result == null) result = caseLevelProgression(factorProgression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			default: return defaultCase(theEObject);
 		}
 	}
@@ -622,6 +635,36 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Level Progression</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>Level Progression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLevelProgression(ILevelProgression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Factor Progression</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>Factor Progression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseFactorProgression(IFactorProgression 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/service/SkillService.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/SkillService.java
index e9a5751..3f82dc6 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
@@ -109,35 +109,6 @@
 		return Activator.getDefault().getPreferenceStore().getBoolean(IPreferenceConstants.ACTIVATE_SKILLS);
 	}
 
-	private class InitializerJob extends Job {
-
-		public InitializerJob() {
-			super("Initialize Skills System");
-		}
-
-		@Override
-		protected IStatus run(IProgressMonitor monitor) {
-			if (isServiceEnabledByPreferences()) {
-
-				loadUser();
-
-				registerForEvents();
-
-				startUserTasks();
-				activateOpenTasks();
-
-			} else {
-
-				stopUserTasks();
-				deactivateOpenTasks();
-
-				unregisterFromEvents();
-			}
-
-			return Status.OK_STATUS;
-		}
-	}
-
 	private void initializeService() {
 		new InitializerJob().schedule();
 	}
@@ -365,4 +336,33 @@
 
 		return tasks;
 	}
+
+	private class InitializerJob extends Job {
+
+		public InitializerJob() {
+			super("Initialize Skills System");
+		}
+
+		@Override
+		protected IStatus run(IProgressMonitor monitor) {
+			if (isServiceEnabledByPreferences()) {
+
+				getUser();
+
+				registerForEvents();
+
+				startUserTasks();
+				activateOpenTasks();
+
+			} else {
+
+				stopUserTasks();
+				deactivateOpenTasks();
+
+				unregisterFromEvents();
+			}
+
+			return Status.OK_STATUS;
+		}
+	}
 }
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/status/CustomDrawProgressBar.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/status/CustomDrawProgressBar.java
new file mode 100644
index 0000000..5240381
--- /dev/null
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/status/CustomDrawProgressBar.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * 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.status;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.internal.TrimUtil;
+
+/**
+ * The Heap Status control, which shows the heap usage statistics in the window trim.
+ *
+ * @since 3.1
+ */
+public class CustomDrawProgressBar extends Canvas {
+
+	private static final int MIN_WIDTH = 150;
+	private String fStatusText = null;
+	private int fMinimum = 0;
+	private int fMaximum = 100;
+	private int fSelection = 0;
+
+	/**
+	 * Creates a new heap status control with the given parent, and using the given preference store to obtain settings such as the refresh interval.
+	 *
+	 * @param parent
+	 *            the parent composite
+	 * @param prefStore
+	 *            the preference store
+	 */
+	public CustomDrawProgressBar(Composite parent) {
+		super(parent, SWT.NONE);
+
+		addPaintListener(e -> {
+			final GC gc = e.gc;
+			final Rectangle area = getClientArea();
+
+			gc.setBackground(getBackground());
+			gc.setForeground(getBackground());
+			gc.fillRectangle(area);
+
+			final int fillWidth = (int) (getFillPercentage() * area.width);
+			gc.setBackground(getForeground());
+			gc.fillRectangle(area.x, area.y, fillWidth, area.height);
+
+			final String statusText = getStatusText();
+			if (statusText != null) {
+				final Point textSize = gc.textExtent(statusText);
+				final int sx = ((area.width - textSize.x) / 2) + area.x + 1;
+				final int sy = ((area.height - textSize.y) / 2) + area.y + 1;
+				gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_BLACK));
+				gc.drawString(statusText, sx, sy, true);
+			}
+		});
+	}
+
+	private double getFillPercentage() {
+		return ((double) (fSelection - fMinimum) / (fMaximum - fMinimum));
+	}
+
+	@Override
+	public Point computeSize(int wHint, int hHint, boolean changed) {
+		final String statusText = getStatusText();
+		final GC gc = new GC(this);
+		final Point p = gc.textExtent((statusText != null) ? statusText : "Lev");
+		int height = p.y + 4;
+		height = Math.max(TrimUtil.TRIM_DEFAULT_HEIGHT, height);
+		final int width = Math.max(p.x, MIN_WIDTH);
+		gc.dispose();
+
+		return new Point(width, height);
+	}
+
+	public String getStatusText() {
+		return fStatusText;
+	}
+
+	public void setStatusText(String statusText) {
+		fStatusText = statusText;
+		// update();
+		getParent().requestLayout();
+	}
+
+	public void setMinimum(int minimum) {
+		fMinimum = minimum;
+	}
+
+	public void setMaximum(int maximum) {
+		fMaximum = maximum;
+	}
+
+	public void setSelection(int selection) {
+		fSelection = selection;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/status/StatusBarProgressContribution.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/status/StatusBarProgressContribution.java
new file mode 100644
index 0000000..8ab53ba
--- /dev/null
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/ui/status/StatusBarProgressContribution.java
@@ -0,0 +1,71 @@
+package org.eclipse.skills.ui.status;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.skills.model.ISkill;
+import org.eclipse.skills.model.ISkillsPackage;
+import org.eclipse.skills.service.ISkillService;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.menus.WorkbenchWindowControlContribution;
+
+public class StatusBarProgressContribution extends WorkbenchWindowControlContribution {
+
+	public StatusBarProgressContribution() {
+	}
+
+	public StatusBarProgressContribution(String id) {
+		super(id);
+	}
+
+	@Override
+	protected Control createControl(Composite parent) {
+		final CustomDrawProgressBar progressBar = new CustomDrawProgressBar(parent);
+
+		progressBar.setMinimum(0);
+		progressBar.setMaximum(100);
+		progressBar.setSelection(0);
+		progressBar.setStatusText("Level 1");
+		progressBar.setToolTipText("");
+		progressBar.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_YELLOW));
+
+		addModelListener(progressBar);
+
+		return progressBar;
+	}
+
+	private void addModelListener(CustomDrawProgressBar progressBar) {
+		final ISkillService skillService = PlatformUI.getWorkbench().getService(ISkillService.class);
+		skillService.getUser().getExperience().eAdapters().add(new AdapterImpl() {
+			@Override
+			public void notifyChanged(Notification msg) {
+				if (ISkillsPackage.eINSTANCE.getSkill_Experience().equals(msg.getFeature())) {
+					if (msg.getNotifier() instanceof ISkill)
+						updateProgressBar(progressBar, msg);
+				}
+			}
+		});
+	}
+
+	private void updateProgressBar(CustomDrawProgressBar progressBar, Notification msg) {
+		final ISkill skill = (ISkill) msg.getNotifier();
+		final int currentLevel = skill.getProgression().getLevel(skill.getExperience());
+		final int levelStart = skill.getProgression().getMinimumXpForLevel(currentLevel);
+		final int nextLevelStart = skill.getProgression().getMinimumXpForLevel(currentLevel + 1);
+
+		Display.getDefault().asyncExec(() -> {
+			progressBar.setMinimum(levelStart);
+			progressBar.setMaximum(nextLevelStart);
+			progressBar.setSelection(skill.getExperience());
+
+			progressBar.setStatusText(String.format("Level %d", currentLevel));
+			progressBar.setToolTipText(String.format("%d XP to reach next level", (nextLevelStart - skill.getExperience())));
+
+			progressBar.redraw();
+		});
+	}
+
+}
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 7ccc8d3..33aaff4 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
@@ -62,21 +62,26 @@
 		final ISkill xp = ISkillsFactory.eINSTANCE.createSkill();
 		xp.setName("XP");
 		xp.setExperience(12345);
+		xp.setProgression(ISkillsFactory.eINSTANCE.createFactorProgression());
+
 		user.setExperience(xp);
 
 		final ISkill flexibility = ISkillsFactory.eINSTANCE.createSkill();
 		flexibility.setName("Flexibility");
 		flexibility.setExperience(445);
+		flexibility.setProgression(ISkillsFactory.eINSTANCE.createFactorProgression());
 		user.getSkills().add(flexibility);
 
 		final ISkill knowledge = ISkillsFactory.eINSTANCE.createSkill();
 		knowledge.setName("Knowledge");
 		knowledge.setExperience(5774);
+		knowledge.setProgression(ISkillsFactory.eINSTANCE.createFactorProgression());
 		user.getSkills().add(knowledge);
 
 		final ISkill scripting = ISkillsFactory.eINSTANCE.createSkill();
 		scripting.setName("Scripting");
 		scripting.setExperience(1111);
+		scripting.setProgression(ISkillsFactory.eINSTANCE.createFactorProgression());
 		user.getSkills().add(scripting);
 
 		user.setName("Hendrik");
@@ -212,7 +217,7 @@
 
 		final Label lblNewLabel_1 = new Label(fDataComposite, SWT.NONE);
 		lblNewLabel_1.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-		lblNewLabel_1.setText("Level " + skill.getLevel());
+		lblNewLabel_1.setText("Level " + skill.getProgression().getLevel(skill.getExperience()));
 	}
 
 	/**
@@ -267,10 +272,10 @@
 	private List<ISkill> getSkillsSortedByProgress(final IUser user) {
 		final List<ISkill> skills = new ArrayList<>(user.getSkills());
 		Collections.sort(skills, (o1, o2) -> {
-			if (o1.getLevel() == o2.getLevel())
+			if (o1.getProgression().getLevel(o1.getExperience()) == o2.getProgression().getLevel(o2.getExperience()))
 				return o2.getExperience() - o1.getExperience();
 
-			return o2.getLevel() - o1.getLevel();
+			return o2.getProgression().getLevel(o2.getExperience()) - o1.getProgression().getLevel(o1.getExperience());
 		});
 
 		return skills;
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 ce70ac7..a67dd5c 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
@@ -16,6 +16,10 @@
 import java.text.DateFormat;
 import java.util.Date;
 
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.skills.model.IUserTask;
 import org.eclipse.skills.service.ISkillService;
@@ -113,7 +117,15 @@
 
 			@Override
 			public void linkActivated(HyperlinkEvent e) {
-				PlatformUI.getWorkbench().getService(ISkillService.class).startTask(getUserTask());
+				new Job("Start skill task") {
+
+					@Override
+					protected IStatus run(IProgressMonitor monitor) {
+						PlatformUI.getWorkbench().getService(ISkillService.class).startTask(getUserTask());
+
+						return Status.OK_STATUS;
+					}
+				}.schedule();
 			}
 		});
 		toolkit.paintBordersFor(hprlnkStartTask);