catch up with development

Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..cad8a61
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,39 @@
+**/bin/
+**/target/
+**._trace
+**git.properties
+**.log.properties
+git.properties
+**/target/
+**/.metadata/
+
+**/emf-gen/**/.gitignore
+**/src-gen/**/.gitignore
+**/git.properties
+**/*.java._trace
+**/*.log
+**/*.log.properties
+
+**/bin/
+**/build/
+*.class
+*.ctrl
+**/Debug/
+.DS_Store
+*.ear
+*.war
+
+**/*.actionbin
+**/*.blipbin
+**/*.chartbin
+**/*.cubebin
+**/*.datatypebin
+**/*.dtobin
+**/*.entitybin
+**/*.servicebin
+**/*.tablebin
+**/*.uibin
+**/*.uisemanticbin
+**/*.xtendbin
+**/*.xtextbin
+
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/jenkins.build.config.xml b/jenkins.build.config.xml
index 663dcfe..e65d078 100644
--- a/jenkins.build.config.xml
+++ b/jenkins.build.config.xml
@@ -16,14 +16,20 @@
 	<!-- DO NOT EDIT BELOW THIS LINE -->
         <jenkins.build.dependencies>
                 <jenkins.build.dependency>org.eclipse.osbp.authentication</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.blob</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.bpm</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.bpm.api</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.core.api</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.datainterchange.api</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.dsl</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.dsl.metadata.service</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.ecview.addons</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.ecview.core</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.ecview.extension.api</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.eventbroker</jenkins.build.dependency>
-                <jenkins.build.dependency>org.eclipse.osbp.i18n.common</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.infogrid</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.jpa.services</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.osgi.hybrid.api</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.persistence</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.preferences</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.report</jenkins.build.dependency>
@@ -32,12 +38,14 @@
                 <jenkins.build.dependency>org.eclipse.osbp.ui.api</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.ui.common</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.utils</jenkins.build.dependency>
-                <jenkins.build.dependency>org.eclipse.osbp.utils.blob</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.utils.bpmn</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.utils.themes.ui</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.utils.ui</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.vaaclipse</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.vaaclipse.addons</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.vaaclipse.addons.common.api</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.vaadin.emf</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.xtext.datainterchange</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.i18n</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.menu</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.perspective</jenkins.build.dependency>
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/.project b/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/.project
index e04d0be..4873af2 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/.project
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/.project
@@ -16,12 +16,12 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<name>org.sonarlint.eclipse.core.sonarlintBuilder</name>
 			<arguments>
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.sonarlint.eclipse.core.sonarlintBuilder</name>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
 		</buildCommand>
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/feature.xml b/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/feature.xml
index b2cc6ba..f6d95d4 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/feature.xml
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/feature.xml
@@ -14,7 +14,8 @@
         id="org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature"
         label="%featureName"
         version="0.9.0.qualifier"
-        provider-name="%providerName">
+        provider-name="%providerName"
+		plugin="org.eclipse.osbp.vaaclipse.addons.softwarefactory">
         
     <description>
         %description
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.classpath b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.classpath
new file mode 100644
index 0000000..cf36b56
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/META-INF/MANIFEST.MF b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/META-INF/MANIFEST.MF
index 52c8e80..e09fe26 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/META-INF/MANIFEST.MF
@@ -6,38 +6,34 @@
 Bundle-Version: 0.9.0.qualifier
 Require-Bundle: org.slf4j.api;bundle-version="1.7.2",
  org.eclipse.core.runtime;bundle-version="3.10.0",
- com.vaadin.shared;bundle-version="[7.5.7,7.7.0)",
- com.vaadin.client;bundle-version="[7.5.7,7.7.0)",
- com.vaadin.server;bundle-version="[7.5.7,7.7.0)",
+ com.vaadin.shared;bundle-version="[7.7.6,7.8.0)",
+ com.vaadin.client;bundle-version="[7.7.6,7.8.0)",
+ com.vaadin.server;bundle-version="[7.7.6,7.8.0)",
  org.eclipse.e4.core.contexts;bundle-version="1.3.100",
  org.eclipse.e4.ui.di;bundle-version="1.0.0",
  org.eclipse.e4.ui.workbench;bundle-version="1.2.2",
  org.eclipse.e4.ui.model.workbench;bundle-version="1.1.0",
  org.eclipse.e4.core.services;bundle-version="1.2.1",
  org.eclipse.e4.core.di;bundle-version="1.4.0",
+ org.eclipse.osbp.runtime.common;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.e4.core.di.extensions;bundle-version="0.12.0",
- org.eclipse.core.databinding;bundle-version="1.4.2",
+ org.eclipse.core.databinding;bundle-version="[1.6.0,1.7.0)",
  org.eclipse.osbp.vaaclipse.presentation;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.xtext.common.types;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext.common.types;bundle-version="[2.11.0,2.12.0)",
  org.apache.commons.lang3;bundle-version="3.4.0",
  org.eclipse.osgi.services;bundle-version="3.4.0",
  osgi.enterprise;bundle-version="4.2.0",
  javax.persistence;bundle-version="2.1.0",
- javax.annotation;bundle-version="[1.1.0,1.2.0)",
  javax.inject;bundle-version="1.0.0",
  org.eclipse.osbp.vaaclipse.api;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.vaaclipse.publicapi;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.runtime.common;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.runtime.web.vaadin.databinding;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.dsl.entity.xtext;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.core.common.model;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.core.extension.model;bundle-version="[0.9.0,0.10.0)",
- org.drools.api;bundle-version="[5.5.1,5.5.2)",
  org.eclipse.osbp.preferences;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.utils;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.perspective;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.eventbroker;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.persistence;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.utils.themes.ui;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.utils.ui;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.extension.api;bundle-version="[0.9.0,0.10.0)",
@@ -45,34 +41,56 @@
  org.eclipse.osbp.gitinfo;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.core.common;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ui.common;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.dsl.metadata.service;bundle-version="0.9.0",
- org.eclipse.osbp.dsl.dto.lib;bundle-version="0.9.0",
- org.eclipse.core.databinding.beans,
- org.eclipse.osbp.infogrid.vaaclipse;bundle-version="0.9.0",
+ org.eclipse.osbp.dsl.metadata.service;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.dsl.dto.lib;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.core.databinding.beans;bundle-version="[1.3.100,1.4.0)",
+ org.eclipse.osbp.infogrid.vaaclipse;bundle-version="[0.9.0,0.10.0)",
  javax.servlet;bundle-version="3.0.0",
- org.eclipse.osbp.report;bundle-version="0.9.0"
+ org.eclipse.osbp.report;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osgi,
+ org.eclipse.osbp.osgi.hybrid.api;bundle-version="0.9.0",
+ org.apache.commons.lang;bundle-version="2.6.0",
+ org.eclipse.osbp.datainterchange.api;bundle-version="0.9.0",
+ org.eclipse.osbp.xtext.datainterchange;bundle-version="0.9.0",
+ org.eclipse.osbp.persistence;bundle-version="0.9.0",
+ org.jsoup;bundle-version="1.8.3",
+ org.eclipse.xtend.lib.macro,
+ org.eclipse.osbp.vaaclipse.addons.keybinding;bundle-version="0.9.0",
+ org.eclipse.core.commands;bundle-version="3.8.1",
+ org.eclipse.osbp.jpa.services;bundle-version="0.9.0",
+ org.eclipse.osbp.blob;bundle-version="0.9.0",
+ org.eclipse.osbp.bpm;bundle-version="0.9.0",
+ org.eclipse.osbp.bpm.api;bundle-version="0.9.0",
+ org.eclipse.osbp.ecview.dsl;bundle-version="0.9.0",
+ org.eclipse.osbp.vaaclipse.addons.common.api;bundle-version="0.9.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Import-Package: javax.validation,
+Import-Package: javax.annotation,
+ javax.validation,
+ org.apache.commons.lang,
  org.eclipse.osbp.authentication.account.dtos;version="0.9.0",
  org.eclipse.osbp.authentication.account.dtos.mapper;version="0.9.0",
  org.eclipse.osbp.authentication.account.dtos.service;version="0.9.0",
  org.eclipse.osbp.authentication.account.entities;version="0.9.0",
  org.eclipse.osbp.bpm.api;version="0.9.0",
+ org.eclipse.osbp.core.api.persistence;version="0.9.0",
  org.eclipse.osbp.dsl.common.datatypes;version="0.9.0",
  org.eclipse.osbp.dsl.xtext.builder.participant;version="0.9.0",
- org.eclipse.osbp.i18n.common;version="0.9.0",
+ org.eclipse.osbp.runtime.web.ecview.presentation.vaadin.common;version="0.9.0",
  org.eclipse.osbp.runtime.web.vaadin.common.data;version="0.9.0",
  org.eclipse.osbp.ui.api.contextfunction;version="0.9.0",
  org.eclipse.osbp.ui.api.customfields;version="0.9.0",
+ org.eclipse.osbp.ui.api.e4;version="0.9.0",
+ org.eclipse.osbp.ui.api.message;version="0.9.0",
  org.eclipse.osbp.ui.api.metadata;version="0.9.0",
  org.eclipse.osbp.ui.api.organization;version="0.9.0",
+ org.eclipse.osbp.ui.api.perspective;version="0.9.0",
  org.eclipse.osbp.ui.api.report;version="0.9.0",
  org.eclipse.osbp.ui.api.themes;version="0.9.0",
  org.eclipse.osbp.ui.api.user;version="0.9.0",
  org.eclipse.osbp.ui.api.useraccess;version="0.9.0",
  org.eclipse.osbp.ui.api.userfilter;version="0.9.0",
- org.eclipse.osbp.utils.blob.component;version="0.9.0",
  org.eclipse.osbp.utils.bpmn.views;version="0.9.0",
+ org.eclipse.osbp.utils.common;version="0.9.0",
  org.eclipse.osbp.vaaclipse.common.ecview.api;version="0.9.0",
  org.eclipse.osbp.vaadin.emf.api;version="0.9.0",
  org.eclipse.osbp.vaadin.emf.data.fields;version="0.9.0",
@@ -82,10 +100,10 @@
  org.eclipse.osbp.xtext.strategy;version="0.9.0",
  org.eclipse.osbp.xtext.table;version="0.9.0",
  org.eclipse.xtext.resource,
- org.jbpm.task.query,
  org.vaadin.hene.popupbutton;version="2.5.0"
-Export-Package: org.eclipse.osbp.vaaclipse.addons.softwarefactory.bpmImpl;version="0.9.0",
+Export-Package: org.eclipse.osbp.vaaclipse.addons.softwarefactory;version="0.9.0",
  org.eclipse.osbp.vaaclipse.addons.softwarefactory.handler;version="0.9.0",
+ org.eclipse.osbp.vaaclipse.addons.softwarefactory.keybinding;version="0.9.0",
  org.eclipse.osbp.vaaclipse.addons.softwarefactory.maintoolbar;version="0.9.0",
  org.eclipse.osbp.vaaclipse.addons.softwarefactory.perspective;version="0.9.0",
  org.eclipse.osbp.vaaclipse.addons.softwarefactory.service;version="0.9.0",
@@ -95,4 +113,3 @@
 Bundle-Activator: org.eclipse.osbp.vaaclipse.addons.softwarefactory.Activator
 Service-Component: OSGI-INF/*.xml
 Factory-Translations: 
-
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/OSGI-INF/org.eclipse.osbp.vaaclipse.addons.softwarefactory.keybinding.KeyBindingDialogContextFunction.xml b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/OSGI-INF/org.eclipse.osbp.vaaclipse.addons.softwarefactory.keybinding.KeyBindingDialogContextFunction.xml
new file mode 100644
index 0000000..38505fe
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/OSGI-INF/org.eclipse.osbp.vaaclipse.addons.softwarefactory.keybinding.KeyBindingDialogContextFunction.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osbp.vaaclipse.addons.softwarefactory.keybinding.KeyBindingDialogContextFunction">
+   <property name="service.context.key" value="KeyBindingDialog"/>
+   <service>
+      <provide interface="org.eclipse.e4.core.contexts.IContextFunction"/>
+   </service>
+   <implementation class="org.eclipse.osbp.vaaclipse.addons.softwarefactory.keybinding.KeyBindingDialogContextFunction"/>
+</scr:component>
\ No newline at end of file
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/OSGI-INF/org.eclipse.osbp.vaaclipse.addons.softwarefactory.service.OSBPCommandsBinder.xml b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/OSGI-INF/org.eclipse.osbp.vaaclipse.addons.softwarefactory.service.OSBPCommandsBinder.xml
new file mode 100644
index 0000000..aebd89f
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/OSGI-INF/org.eclipse.osbp.vaaclipse.addons.softwarefactory.service.OSBPCommandsBinder.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osbp.vaaclipse.addons.softwarefactory.service.OSBPCommandsBinder">
+   <reference bind="bindCommandsProvider" cardinality="0..n" interface="org.eclipse.osbp.ui.api.contextfunction.ICommandsProvider" name="CommandsProvider" policy="dynamic" unbind="unbindCommandsProvider"/>
+   <implementation class="org.eclipse.osbp.vaaclipse.addons.softwarefactory.service.OSBPCommandsBinder"/>
+</scr:component>
\ No newline at end of file
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/OSGI-INF/org.eclipse.osbp.vaaclipse.addons.softwarefactory.service.ThemeResourceService.xml b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/OSGI-INF/org.eclipse.osbp.vaaclipse.addons.softwarefactory.service.ThemeResourceService.xml
new file mode 100644
index 0000000..4780f39
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/OSGI-INF/org.eclipse.osbp.vaaclipse.addons.softwarefactory.service.ThemeResourceService.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="org.eclipse.osbp.vaaclipse.addons.softwarefactory.service.ThemeResourceService">
+   <service>
+      <provide interface="org.eclipse.osbp.ui.api.themes.IThemeResourceService"/>
+   </service>
+   <implementation class="org.eclipse.osbp.vaaclipse.addons.softwarefactory.service.ThemeResourceService"/>
+</scr:component>
\ No newline at end of file
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N.properties b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N.properties
index 3e9888f..b7eee05 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N.properties
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N.properties
@@ -1,42 +1,142 @@
 #Generated by Eclipse Messages Editor (Eclipse Babel)
 #default
 
+acceptdelete_description = acceptdelete_description\u0009\u0009\u0009\u0009
+
+acceptdelete_message = acceptdelete_message\u0009\u0009\u0009\u0009\u0009
+
+acceptdelete_title = acceptdelete_title\u0009\u0009\u0009\u0009\u0009\u0009
+
+acceptloosingdata_description = acceptloosingdata_description\u0009\u0009\u0009
+
+acceptloosingdata_message = acceptloosingdata_message\u0009\u0009\u0009\u0009
+
+acceptloosingdata_title = acceptloosingdata_title\u0009\u0009\u0009\u0009\u0009
+
+acceptreload_description = acceptreload_description\u0009\u0009\u0009\u0009
+
+acceptreload_message = acceptreload_message\u0009\u0009\u0009\u0009\u0009
+
+acceptreload_title = acceptreload_title\u0009\u0009\u0009\u0009\u0009\u0009
+
+acceptsave_description = acceptsave_description\u0009\u0009\u0009\u0009
+
+acceptsave_message = acceptsave_message\u0009\u0009\u0009\u0009\u0009
+
+acceptsave_title = acceptsave_title\u0009\u0009\u0009\u0009\u0009\u0009
+
 all = all
 
 all_tip = all_tip\u0009
 
+alt = alt
+
+ctrl = ctrl
+
 data = data
 
 data_tip = All entries of the entity are displayed here
 
+datainterchange_started = datainterchange_started
+
+del = del
+
+deleted = deleted
+
 entity = entity
 
 entity_tip = Choose here  which entity data is to be locked or unlocked
 
+eq = equal
+
+ge = greater equal
+
+gt = greater
+
 invers = inverse
 
 invers_tip = If you check this box then the selected data is locked. Unselected data will be unlocked.
 
+javax_validation_constraints_not_null_message = must not be null
+
+javax_validation_constraints_past_message = must_be_in_past
+
+keybinding_category = keybindingCategory
+
+keybinding_context_description = keybindingContextDescription
+
+keybinding_context_name = keybindingContextName
+
+keybinding_description = keybindingDescription
+
+keybinding_key_sequence = keybindingKeySequence
+
+keybinding_name = keybindingName
+
+le = less equal
+
+like = like
+
 locale_tooltip = locale_tooltip
 
 logout_button_tooltip = logout_button_tooltip
 
+lt = less
+
+ne = not equal
+
 none = none
 
 none_tip = If you press this button then none of the entries will be selected.
 
+options_acceptdelete = options_acceptdelete\u0009\u0009\u0009\u0009\u0009
+
+options_acceptdelete_description = options_acceptdelete_description\u0009\u0009
+
+options_acceptloosingdata = options_acceptloosingdata\u0009\u0009\u0009\u0009
+
+options_acceptloosingdata_description = options_acceptloosingdata_description\u0009
+
+options_acceptreload = options_acceptreload\u0009\u0009\u0009\u0009\u0009
+
+options_acceptreload_description = options_acceptreload_description\u0009\u0009
+
+options_acceptsave = options_acceptsave\u0009\u0009\u0009\u0009\u0009
+
+options_acceptsave_description = options_acceptsave_description\u0009\u0009
+
+options_cancel = options_cancel\u0009\u0009\u0009\u0009\u0009\u0009\u0009
+
+options_cancel_description = options_cancel_description\u0009\u0009\u0009\u0009
+
+options_query_delete = options_query_delete
+
 position_label_tooltip = position_label_tooltip
 
 print_service_tooltip = Print Service
 
+query_delete = query_delete
+
+query_delete_title = query_delete_title
+
+reset = reset
+
 save = save
 
 save_tip = If you press this button , the current selection is stored . Only the selected items are then visible to the user . If the option is "inverse" is selected, the selected entries are invisible .
 
+saved = saved
+
+search = search
+
+shift = shift
+
 strategy_tooltip = strategy_tooltip
 
 themes_tooltip = themes
 
+unique_attribute_validator_error = unique_attribute_validator_error
+
 user_label_tooltip = user_label_tooltip
 
 user_menu_tooltip = user_menu_tooltip
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_de.properties b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_de.properties
index ce81f35..d0cbf57 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_de.properties
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_de.properties
@@ -1,42 +1,142 @@
 #Generated by Eclipse Messages Editor (Eclipse Babel)
 #de
 
+acceptdelete_description = acceptdelete_description\u0009\u0009\u0009\u0009
+
+acceptdelete_message = Dieser Datensatz wurde gerade gel\u00F6scht. Wollen Sie diese \u00C4nderung \u00FCbernehmen? \u0009\u0009\u0009
+
+acceptdelete_title = Achtung\u0009\u0009\u0009\u0009
+
+acceptloosingdata_description = m\u00F6glicher datenverlust\u0009\u0009
+
+acceptloosingdata_message = Ge\u00E4nderte Daten gehen verloren\u0009\u0009\u0009
+
+acceptloosingdata_title = Achtung\u0009\u0009\u0009\u0009
+
+acceptreload_description = Datenverlust m\u00F6glich\u0009\u0009\u0009
+
+acceptreload_message = acceptreload_message\u0009\u0009\u0009\u0009\u0009
+
+acceptreload_title = acceptreload_title\u0009\u0009\u0009\u0009\u0009\u0009
+
+acceptsave_description = m\u00F6glicher datenverlust
+
+acceptsave_message = Dieser Datensatz wurde gerade ver\u00E4ndert. Wollen Sie die ge\u00E4nderten Daten \u00FCbernehmen? 
+
+acceptsave_title = Achtung
+
 all = alle
 
 all_tip = Alle Eintr\u00E4ge der Entit\u00E4t zuf\u00FCgen
 
+alt = Alt
+
+ctrl = Strg
+
 data = Daten der Entit\u00E4t
 
 data_tip = Alle Eintr\u00E4ge der Entit\u00E4t werde hier angezeigt
 
+datainterchange_started = Datenaustausch gestartet
+
+del = R\u00FCck
+
+deleted = gel\u00F6scht
+
 entity = Entit\u00E4t ausw\u00E4hlen
 
 entity_tip = W\u00E4hlen Sie hier welche Entit\u00E4tsdaten gesperrt oder freigegeben werden sollen
 
+eq = gleich
+
+ge = gr\u00F6\u00DFer gleich
+
+gt = gr\u00F6\u00DFer
+
 invers = umgekehrt
 
 invers_tip = Wenn Sie diese Option aktivieren , dann werden die ausgew\u00E4hlten Daten gesperrt. Nicht ausgew\u00E4hlte Daten werden entsperrt.
 
+javax_validation_constraints_not_null_message = Dieses Attribut darf nicht leer sein
+
+javax_validation_constraints_past_message = Das Datum muss in der Vergangenheit liegen
+
+keybinding_category = Kategorie
+
+keybinding_context_description = Kontextbeschreibung
+
+keybinding_context_name = 
+
+keybinding_description = Beschreibung
+
+keybinding_key_sequence = Tastenkombination
+
+keybinding_name = Name
+
+le = kleiner gleich
+
+like = \u00E4hnlich
+
 locale_tooltip = Lokalisierung
 
 logout_button_tooltip = Abmelden
 
+lt = weniger
+
+ne = ungleich
+
 none = keiner
 
 none_tip = Wenn Sie diese Taste dr\u00FCcken, wird keiner der Eintr\u00E4ge ausgew\u00E4hlt werden.
 
+options_acceptdelete = Akzeptiere\u0009\u0009
+
+options_acceptdelete_description = options_acceptdelete_description\u0009\u0009
+
+options_acceptloosingdata = Akzeptiere\u0009\u0009
+
+options_acceptloosingdata_description = options_acceptloosingdata_description\u0009
+
+options_acceptreload = options_acceptreload\u0009\u0009\u0009\u0009\u0009
+
+options_acceptreload_description = options_acceptreload_description\u0009\u0009
+
+options_acceptsave = Akzeptiere
+
+options_acceptsave_description = options_acceptsave_description
+
+options_cancel = Abbrechen\u0009\u0009\u0009\u0009
+
+options_cancel_description = options_cancel_description\u0009\u0009\u0009\u0009
+
+options_query_delete = l\u00F6schen
+
 position_label_tooltip = Position
 
 print_service_tooltip = Drucker
 
+query_delete = Wollen Sie den Datensatz l\u00F6schen?
+
+query_delete_title = L\u00F6schen
+
+reset = R\u00FCcksetzen
+
 save = speichern
 
 save_tip = Wenn Sie diese Taste dr\u00FCcken, wird die aktuelle Auswahl gespeichert. Nur die ausgew\u00E4hlten Eintr\u00E4ge sind dann f\u00FCr den Benutzer sichtbar. Wenn die Option "umgekehrt" gew\u00E4hlt ist, sind die gew\u00E4hlten Eintr\u00E4ge unsichtbar.
 
+saved = gespeichert
+
+search = Suchen
+
+shift = Gro\u00DF
+
 strategy_tooltip = Anordnungsstrategie
 
 themes_tooltip = Darstellungen
 
+unique_attribute_validator_error = Dieses Attribut muss eindeutig sein und ist bereits in der Datenbank vorhanden
+
 user_label_tooltip = Benutzername
 
 user_menu_tooltip = Aufklappmen\u00FC
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_de_AT.properties b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_de_AT.properties
index 2d4f90c..a042dd5 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_de_AT.properties
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_de_AT.properties
@@ -1,4 +1,60 @@
 #Generated by Eclipse Messages Editor (Eclipse Babel)
 #de_AT
 
+acceptsave_title = Achtung
+
+alt = 
+
+ctlr = 
+
+datainterchange_started = 
+
+del = 
+
+deleted = 
+
+eq = 
+
+ge = 
+
+gt = 
+
+javax_validation_constraints_not_null_message = 
+
+keybinding_category = 
+
+keybinding_context_description = 
+
+keybinding_context_name = Kontextname
+
+keybinding_description = 
+
+keybinding_key_sequence = 
+
+keybinding_name = 
+
+le = 
+
+like = 
+
+lt = 
+
+ne = 
+
+options_query_delete = 
+
 print_service_tooltip = 
+
+query_delete = 
+
+query_delete_title = 
+
+reset = 
+
+saved = 
+
+search = 
+
+shift = 
+
+unique_attribute_validator_error = 
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_en.properties b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_en.properties
index f72609b..ecf9119 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_en.properties
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_en.properties
@@ -1,42 +1,142 @@
 #Generated by Eclipse Messages Editor (Eclipse Babel)
 #en
 
+acceptdelete_description = acceptdelete_description\u0009\u0009\u0009\u0009
+
+acceptdelete_message = This record was just deleted. Do you accept this change?
+
+acceptdelete_title = Attention\u0009\u0009\u0009
+
+acceptloosingdata_description = loss of data possible\u0009
+
+acceptloosingdata_message = changed data will be lost\u0009
+
+acceptloosingdata_title = Attention\u0009\u0009\u0009
+
+acceptreload_description = acceptreload_description\u0009\u0009\u0009\u0009
+
+acceptreload_message = acceptreload_message\u0009\u0009\u0009\u0009\u0009
+
+acceptreload_title = acceptreload_title\u0009\u0009\u0009\u0009\u0009\u0009
+
+acceptsave_description = loss of data possible\u0009
+
+acceptsave_message = This record was just changed. Do you accept the changed data?
+
+acceptsave_title = Attention
+
 all = all
 
 all_tip = add all entries
 
+alt = Alt
+
+ctrl = Ctrl
+
 data = data
 
 data_tip = All entries of the entity are displayed here
 
+datainterchange_started = Datainterchange started
+
+del = Del
+
+deleted = deleted
+
 entity = select entity
 
 entity_tip = Choose here  which entity data is to be locked or unlocked
 
+eq = equal
+
+ge = greater equal
+
+gt = greater
+
 invers = inverse
 
 invers_tip = If you check this box then the selected data is locked. Unselected data will be unlocked.
 
+javax_validation_constraints_not_null_message = This attribute must not be empty
+
+javax_validation_constraints_past_message = The date must be in past
+
+keybinding_category = Category
+
+keybinding_context_description = Context description
+
+keybinding_context_name = 
+
+keybinding_description = Description
+
+keybinding_key_sequence = Key sequence
+
+keybinding_name = Name
+
+le = less equal
+
+like = like
+
 locale_tooltip = Localization
 
 logout_button_tooltip = Log-out
 
+lt = less
+
+ne = not equal
+
 none = none
 
 none_tip = If you press this button then none of the entries will be selected.
 
+options_acceptdelete = Accept
+
+options_acceptdelete_description = options_acceptdelete_description\u0009\u0009
+
+options_acceptloosingdata = Accept\u0009
+
+options_acceptloosingdata_description = options_acceptloosingdata_description\u0009
+
+options_acceptreload = options_acceptreload\u0009\u0009\u0009\u0009\u0009
+
+options_acceptreload_description = options_acceptreload_description\u0009\u0009
+
+options_acceptsave = Accept
+
+options_acceptsave_description = options_acceptsave_description
+
+options_cancel = Cancel\u0009\u0009\u0009\u0009\u0009\u0009
+
+options_cancel_description = options_cancel_description\u0009\u0009\u0009\u0009
+
+options_query_delete = delete
+
 position_label_tooltip = Position
 
 print_service_tooltip = Print Service
 
+query_delete = Do you want to delete this entry?
+
+query_delete_title = Delete
+
+reset = Reset
+
 save = save
 
 save_tip = If you press this button , the current selection is stored . Only the selected items are then visible to the user . If the option is "inverse" is selected, the selected entries are invisible .
 
+saved = saved
+
+search = Search
+
+shift = Shift
+
 strategy_tooltip = Layout strategy
 
 themes_tooltip = Themes
 
+unique_attribute_validator_error = This attribute must be unique and is already present in the database
+
 user_label_tooltip = User name
 
 user_menu_tooltip = Drop-down menu
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_en_US.properties b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_en_US.properties
index 006cf4f..ea263ef 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_en_US.properties
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_en_US.properties
@@ -1,4 +1,60 @@
 #Generated by Eclipse Messages Editor (Eclipse Babel)
 #en_US
 
+acceptsave_title = Attention
+
+alt = 
+
+ctlr = 
+
+datainterchange_started = 
+
+del = 
+
+deleted = 
+
+eq = 
+
+ge = 
+
+gt = 
+
+javax_validation_constraints_not_null_message = 
+
+keybinding_category = 
+
+keybinding_context_description = 
+
+keybinding_context_name = Context name
+
+keybinding_description = 
+
+keybinding_key_sequence = 
+
+keybinding_name = 
+
+le = 
+
+like = 
+
+lt = 
+
+ne = 
+
+options_query_delete = 
+
 print_service_tooltip = 
+
+query_delete = 
+
+query_delete_title = 
+
+reset = 
+
+saved = 
+
+search = 
+
+shift = 
+
+unique_attribute_validator_error = 
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_fr.properties b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_fr.properties
index a26a5b0..7823fa7 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_fr.properties
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/i18n/I18N_fr.properties
@@ -1,42 +1,136 @@
 #Generated by Eclipse Messages Editor (Eclipse Babel)
 #fr
 
+acceptdelete_description = acceptdelete_description\u0009\u0009\u0009\u0009
+
+acceptdelete_message = acceptdelete_message\u0009\u0009\u0009\u0009\u0009
+
+acceptdelete_title = Attention\u0009\u0009\u0009
+
+acceptloosingdata_description = acceptloosingdata_description\u0009\u0009\u0009
+
+acceptloosingdata_message = Les donn\u00E9es modifi\u00E9es seront perdues\u0009\u0009\u0009
+
+acceptloosingdata_title = Attention\u0009\u0009\u0009
+
+acceptreload_description = acceptreload_description\u0009\u0009\u0009\u0009
+
+acceptreload_message = acceptreload_message\u0009\u0009\u0009\u0009\u0009
+
+acceptreload_title = acceptreload_title\u0009\u0009\u0009\u0009\u0009\u0009
+
 all = tout
 
 all_tip = Ajouter tous les entr\u00E9es de l'entit\u00E9
 
+alt = Alt
+
+ctrl = Ctrl
+
 data = Les donn\u00E9es de l'entit\u00E9
 
 data_tip = Toutes les entr\u00E9es de l'entit\u00E9 seront affich\u00E9s ici
 
+datainterchange_started = L'\u00E9change de donn\u00E9es a commenc\u00E9
+
+del = Suppr
+
+deleted = supprim\u00E9
+
 entity = S\u00E9lectionnez l'entit\u00E9
 
 entity_tip = Choisissez ici quelles donn\u00E9es entit\u00E9 doit \u00EAtre verrouill\u00E9 ou d\u00E9verrouill\u00E9
 
+eq = \u00E9gale
+
+ge = plus ou \u00E9gal
+
+gt = plus grand
+
 invers = invers\u00E9e
 
 invers_tip = Si vous cochez cette case , puis les donn\u00E9es s\u00E9lectionn\u00E9es est verrouill\u00E9. Des donn\u00E9es non s\u00E9lectionn\u00E9s seront d\u00E9verrouill\u00E9s.
 
+javax_validation_constraints_not_null_message = Cet attribut ne peut pas \u00EAtre vide
+
+javax_validation_constraints_past_message = La date doit \u00EAtre dans le pass\u00E9
+
+keybinding_category = Cat\u00E9gorie
+
+keybinding_context_description = Description du contexte
+
+keybinding_context_name = Nom du contexte
+
+keybinding_description = Description
+
+keybinding_key_sequence = Raccourci
+
+keybinding_name = Nom
+
+le = moins ou \u00E9gal
+
+like = \u00E0 peu pr\u00E8s
+
 locale_tooltip = Localisation
 
 logout_button_tooltip = D\u00E9connecter
 
+lt = plus petit
+
+ne = in\u00E9gal
+
 none = aucun
 
 none_tip = Si vous appuyez sur ce bouton aucune des entr\u00E9es sera s\u00E9lectionn\u00E9 .
 
+options_acceptdelete = Accept\u0009\u0009
+
+options_acceptdelete_description = options_acceptdelete_description\u0009\u0009
+
+options_acceptloosingdata = Accept\u0009\u0009
+
+options_acceptloosingdata_description = options_acceptloosingdata_description\u0009
+
+options_acceptreload = options_acceptreload\u0009\u0009\u0009\u0009\u0009
+
+options_acceptreload_description = options_acceptreload_description\u0009\u0009
+
+options_acceptsave = Accept
+
+options_acceptsave_description = options_acceptsave_description
+
+options_cancel = Annuler\u0009\u0009\u0009\u0009\u0009
+
+options_cancel_description = options_cancel_description\u0009\u0009\u0009\u0009
+
+options_query_delete = supprimer
+
 position_label_tooltip = Position
 
 print_service_tooltip = 
 
+query_delete = Voulez-vous supprimer l'enregistrement?
+
+query_delete_title = Supprimer
+
+reset = R\u00E9initialiser
+
 save = sauvegarder
 
 save_tip = Si vous appuyez sur ce bouton , la s\u00E9lection en cours est stock\u00E9 . Seuls les \u00E9l\u00E9ments s\u00E9lectionn\u00E9s sont alors visibles \u00E0 l'utilisateur. Si l'option est "invers\u00E9e" est s\u00E9lectionn\u00E9, les entr\u00E9es s\u00E9lectionn\u00E9es sont invisibles .
 
+saved = sauv\u00E9
+
+search = rechercher
+
+shift = Maj
+
 strategy_tooltip = Strat\u00E9gy d'arrangement
 
 themes_tooltip = Pr\u00E9sentations
 
+unique_attribute_validator_error = Cet attribut doit \u00EAtre unique et existe d\u00E9j\u00E0 dans la base de donn\u00E9es
+
 user_label_tooltip = Nom d'utiliseur
 
 user_menu_tooltip = Menu d\u00E9roulant
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/I18NHandler.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/I18NHandler.java
index 408a1dc..376cee0 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/I18NHandler.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/I18NHandler.java
@@ -20,10 +20,10 @@
 import org.eclipse.osbp.preferences.LocaleUtils;
 import org.eclipse.osbp.preferences.ProductConfiguration;
 import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
+import org.eclipse.osbp.ui.api.themes.EnumCssClass;
 import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
 import org.eclipse.osbp.ui.api.themes.IThemeResourceService.ThemeResourceType;
 import org.eclipse.osbp.ui.api.user.IUser;
-import org.eclipse.osbp.utils.theme.EnumCssClass;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -70,7 +70,7 @@
 		Locale[] locales = Locale.getAvailableLocales();
 		// --- sort by display name used in the respective locale, if it is
 		// configured ---
-		LocaleUtils.sortLocalesOnDisplayName(locales, ProductConfiguration.showLanguageSelectInRespectiveLocale());
+		LocaleUtils.sortLocalesOnDisplayName(locales);
 		for (Locale locale : locales) {
 			// only allow locales with country due to currency sign formatters
 			if (locale.getCountry().length() > 0) {
@@ -92,7 +92,7 @@
 					try {
 						// --- set the display name used in the respective
 						// locale, if it is configured ---
-						localeCombo.setItemCaption(loc, LocaleUtils.getDisplayName(locale, ProductConfiguration.showLanguageSelectInRespectiveLocale()));
+						localeCombo.setItemCaption(loc, LocaleUtils.getDisplayName(locale));
 						localeCombo.addItem(loc);
 						if (themeResourceService != null) {
 							localeCombo.setItemIcon(loc, themeResourceService.getThemeResource(locale.getCountry().toLowerCase(), ThemeResourceType.FLAG));
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/PrintServiceHandler.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/PrintServiceHandler.java
index a06a5da..5746424 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/PrintServiceHandler.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/PrintServiceHandler.java
@@ -24,7 +24,6 @@
 import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
 import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
 import org.eclipse.osbp.ui.api.user.IUser;
-import org.eclipse.osbp.utils.theme.EnumCssClass;
 import org.eclipse.osbp.utils.themes.ui.VaaclipseUiTheme;
 import org.eclipse.osbp.utils.themes.ui.VaaclipseUiTheme.ThemeList;
 import org.eclipse.osbp.vaaclipse.api.ResourceInfoProvider;
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/UserHandler.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/UserHandler.java
index 697504e..8a992a2 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/UserHandler.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/UserHandler.java
@@ -22,14 +22,14 @@
 import org.eclipse.e4.core.services.events.IEventBroker;
 import org.eclipse.e4.ui.model.application.MApplication;
 import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
+import org.eclipse.osbp.blob.component.BlobComponent;
 import org.eclipse.osbp.eventbroker.EventBrokerMsg;
 import org.eclipse.osbp.ui.api.contextfunction.IUserMenuProvider;
-import org.eclipse.osbp.ui.api.customfields.IBlobUploadComponent;
+import org.eclipse.osbp.ui.api.customfields.IBlobService;
 import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
 import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
 import org.eclipse.osbp.ui.api.themes.IThemeResourceService.ThemeResourceType;
 import org.eclipse.osbp.ui.api.user.IUser;
-import org.eclipse.osbp.utils.blob.component.BlobUploadComponent;
 import org.eclipse.osbp.vaaclipse.publicapi.authentication.AuthenticationConstants;
 import org.osgi.service.event.Event;
 import org.osgi.service.event.EventHandler;
@@ -43,8 +43,6 @@
 import com.vaadin.ui.ComponentContainer;
 import com.vaadin.ui.HorizontalLayout;
 import com.vaadin.ui.Label;
-//import com.vaadin.ui.Notification;
-//import com.vaadin.ui.Notification.Type;
 import com.vaadin.ui.VerticalLayout;
 
 @SuppressWarnings("all")
@@ -70,6 +68,9 @@
 	private IDSLMetadataService dslMetadataService;
 
 	@Inject
+	private IBlobService blobService;
+	
+	@Inject
 	@Named("Menu")
 	private IUserMenuProvider userMenu;
 
@@ -87,8 +88,7 @@
 		form.addStyleName("ToolControlMenu");
 		form.setMargin(false);
 
-		BlobUploadComponent userImage = (BlobUploadComponent)user.getBlobUploadComponent();
-		userImage.setDisplayResolutionId(2);
+		BlobComponent userImage = new BlobComponent(blobService, user.getProfileImageId(), 2);
 		userImage.addStyleName("os-userportrait");
 		form.addComponent(userImage);
 
@@ -119,7 +119,7 @@
 		buttons.addComponent(logout);
 		popup = new PopupButton();
 		popup.addStyleName("os-usermenubutton");
-		popup.setContent(userMenu.getMenu());
+		popup.setContent(userMenu.getMenu(popup));
 
 		buttons.addComponent(popup);
 
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/keybinding/KeyBindingDialogContextFunction.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/keybinding/KeyBindingDialogContextFunction.java
new file mode 100644
index 0000000..395b045
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/keybinding/KeyBindingDialogContextFunction.java
@@ -0,0 +1,42 @@
+/*
+ *                                                                            
+ *  Copyright (c) 2011 - 2017 - Loetz GmbH & Co KG, 69115 Heidelberg, Germany 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Initial contribution:                                                      
+ *     Loetz GmbH & Co. KG                              
+ * 
+ */
+package org.eclipse.osbp.vaaclipse.addons.softwarefactory.keybinding;
+
+import org.eclipse.e4.core.contexts.ContextInjectionFactory;
+import org.eclipse.e4.core.contexts.IContextFunction;
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.osbp.ui.api.contextfunction.IVaadinDialogProvider;
+import org.osgi.service.component.annotations.Component;
+
+/**
+ * The Class KeyBindingDialogContextFunction.
+ */
+@Component(service = IContextFunction.class, property = "service.context.key=KeyBindingDialog")
+@SuppressWarnings("all")
+public class KeyBindingDialogContextFunction implements IContextFunction {
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.e4.core.contexts.IContextFunction#compute(org.eclipse.e4.core.contexts.IEclipseContext, java.lang.String)
+	 */
+	@Override
+	public Object compute(IEclipseContext context, String contextKey) {
+	    MApplication application = context.get(MApplication.class);
+	    IEclipseContext appCtx = application.getContext();
+	    IVaadinDialogProvider provider = ContextInjectionFactory.make(KeyBindingDialogProvider.class, appCtx);
+	    appCtx.set(IVaadinDialogProvider.class, provider);
+	    return provider;
+	}
+
+}
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/keybinding/KeyBindingDialogProvider.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/keybinding/KeyBindingDialogProvider.java
new file mode 100644
index 0000000..a3737a6
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/keybinding/KeyBindingDialogProvider.java
@@ -0,0 +1,227 @@
+/*
+ *                                                                            
+ *  Copyright (c) 2011 - 2017 - Loetz GmbH & Co KG, 69115 Heidelberg, Germany 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Initial contribution:                                                      
+ *     Loetz GmbH & Co. KG                              
+ * 
+ */
+package org.eclipse.osbp.vaaclipse.addons.softwarefactory.keybinding;
+
+import java.util.List;
+import java.util.Locale;
+
+import javax.inject.Inject;
+
+import org.eclipse.core.commands.CommandManager;
+import org.eclipse.core.commands.common.NotDefinedException;
+import org.eclipse.e4.ui.model.application.commands.MBindingContext;
+import org.eclipse.e4.ui.model.application.commands.MBindingTable;
+import org.eclipse.e4.ui.model.application.commands.MCommand;
+import org.eclipse.e4.ui.model.application.commands.MKeyBinding;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.osbp.dsl.metadata.service.DSLBuilderParticipant.DSLMetadataService;
+import org.eclipse.osbp.runtime.common.i18n.II18nService;
+import org.eclipse.osbp.ui.api.contextfunction.IVaadinDialogProvider;
+import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
+import org.eclipse.osbp.ui.api.user.IUser;
+import org.eclipse.osbp.vaaclipse.addons.keybinding.IKeyBindingService;
+
+import com.vaadin.data.Property;
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.util.BeanItemContainer;
+import com.vaadin.event.ItemClickEvent;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.UI;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ * The Class KeyBindingDialogProvider.
+ */
+public class KeyBindingDialogProvider implements IVaadinDialogProvider, IUser.UserLocaleListener {
+	/** The command manager. */
+	@Inject
+	private CommandManager commandManager;
+
+	/** The metadata service. */
+	@Inject
+	private IDSLMetadataService dslMetadataService;
+
+	/** The user. */
+	@Inject
+	private IUser user;
+
+	/** The keybinding service. */
+	@Inject
+	private IKeyBindingService keybindingService;
+
+	/** The table. */
+	private Table table;
+
+	/** The container. */
+	private BeanItemContainer<BindingBean> container;
+
+	/** The locale. */
+	private Locale locale;
+
+	@Override
+	public void localeChanged(Locale locale) {
+		this.locale = locale;
+		table.setColumnHeader("name", dslMetadataService.translate(locale.toLanguageTag(), "keybindingName"));
+		table.setColumnHeader("description", dslMetadataService.translate(locale.toLanguageTag(), "keybindingDescription"));
+		table.setColumnHeader("keySequence", dslMetadataService.translate(locale.toLanguageTag(), "keybindingKeySequence"));
+		
+		container.removeAllItems();
+		List<MKeyBinding> bindings = keybindingService.getAllKeyBindings();
+		for (MKeyBinding binding : bindings) {
+			container.addBean(new BindingBean(binding, dslMetadataService, locale));
+		}
+	}
+
+	@Override
+	public Component getDialog() {
+		VerticalLayout content = new VerticalLayout();
+		createView(content);
+		return content;
+	}
+
+	@Override
+	public void createView(VerticalLayout parent) {
+		locale = user.getLocale();
+		table = new Table();
+		table.setSelectable(true);
+		table.setSizeFull();
+		parent.addComponent(table);
+
+		container = new BeanItemContainer<>(BindingBean.class);
+		table.setContainerDataSource(container);
+
+		List<MKeyBinding> bindings = keybindingService.getAllKeyBindings();
+		for (MKeyBinding binding : bindings) {
+			container.addBean(new BindingBean(binding, dslMetadataService, locale));
+		}
+
+		table.setVisibleColumns(new Object[] { "name", "description", "keySequence"});
+		user.addUserLocaleListener(this);
+	}
+
+	/**
+	 * The Class BindingBean.
+	 */
+	public static class BindingBean {
+
+		/** The binding. */
+		private MKeyBinding binding;
+		
+		/** The binding table. */
+		private MBindingTable bindingTable;
+		
+		/** The binding context. */
+		private MBindingContext bindingContext;
+		
+		/** The command. */
+		private MCommand command;
+
+		private IDSLMetadataService dslMetadataService;
+
+		private Locale locale;
+
+		/**
+		 * Instantiates a new binding bean.
+		 *
+		 * @param binding
+		 *            the binding
+		 */
+		public BindingBean(MKeyBinding binding, IDSLMetadataService dslMetadataService, Locale locale) {
+			super();
+			this.binding = binding;
+			this.dslMetadataService = dslMetadataService;
+			this.locale = locale;
+			this.command = binding.getCommand();
+			this.bindingTable = (MBindingTable) ((EObject) binding)
+					.eContainer();
+			this.bindingContext = bindingTable.getBindingContext();
+		}
+
+		/**
+		 * Gets the description.
+		 *
+		 * @return the description
+		 * @throws NotDefinedException
+		 *             the not defined exception
+		 */
+		public final String getDescription() throws NotDefinedException {
+			return dslMetadataService.translate(locale.toLanguageTag(), command.getDescription());
+		}
+
+		/**
+		 * Gets the name.
+		 *
+		 * @return the name
+		 * @throws NotDefinedException
+		 *             the not defined exception
+		 */
+		public final String getName() throws NotDefinedException {
+			return command.getCommandName();
+		}
+
+		/**
+		 * Gets the id.
+		 *
+		 * @return the id
+		 */
+		public final String getId() {
+			return command.getElementId();
+		}
+
+		/**
+		 * Gets the category.
+		 *
+		 * @return the category
+		 * @throws NotDefinedException
+		 *             the not defined exception
+		 */
+		public final String getCategory() throws NotDefinedException {
+			try {
+				return command.getCategory().getName();
+			} catch (Exception e) {
+				return "";
+			}
+		}
+
+		/**
+		 * Gets the key sequence.
+		 *
+		 * @return the key sequence
+		 */
+		public final String getKeySequence() {
+			return binding.getKeySequence();
+		}
+
+		/**
+		 * Gets the context name.
+		 *
+		 * @return the context name
+		 */
+		public final String getContextName() {
+			return bindingContext.getName();
+		}
+
+		/**
+		 * Gets the context description.
+		 *
+		 * @return the context description
+		 */
+		public final String getContextDescription() {
+			return bindingContext.getDescription();
+		}
+
+	}
+
+}
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/maintoolbar/MainToolbarProvider.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/maintoolbar/MainToolbarProvider.java
index 7d4ae5e..57b6b56 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/maintoolbar/MainToolbarProvider.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/maintoolbar/MainToolbarProvider.java
@@ -12,39 +12,28 @@
  */
 package org.eclipse.osbp.vaaclipse.addons.softwarefactory.maintoolbar;
 
-import java.util.UUID;
-
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
-import org.apache.commons.lang3.StringUtils;
 import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.commands.MCommand;
 import org.eclipse.e4.ui.model.application.ui.SideValue;
 import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
 import org.eclipse.e4.ui.model.application.ui.basic.MTrimElement;
 import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
 import org.eclipse.e4.ui.model.application.ui.basic.impl.BasicFactoryImpl;
 import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
-import org.eclipse.e4.ui.model.application.ui.menu.MDirectToolItem;
+import org.eclipse.e4.ui.model.application.ui.menu.MHandledToolItem;
 import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
 import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
+import org.eclipse.osbp.ui.api.perspective.IPerspectiveProvider;
+import org.eclipse.osbp.ui.api.themes.EnumCssClass;
 import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
 import org.eclipse.osbp.ui.api.themes.IThemeResourceService.ThemeResourceType;
-import org.eclipse.osbp.utils.theme.EnumCssClass;
-import org.eclipse.osbp.vaaclipse.addons.softwarefactory.perspective.PerspectiveConstants;
 import org.eclipse.osbp.vaaclipse.presentation.engine.GenericPresentationEngine;
 import org.eclipse.osbp.xtext.action.ActionButton;
-import org.eclipse.osbp.xtext.action.ActionChart;
-import org.eclipse.osbp.xtext.action.ActionDialog;
-import org.eclipse.osbp.xtext.action.ActionGeneric;
-import org.eclipse.osbp.xtext.action.ActionPackage;
-import org.eclipse.osbp.xtext.action.ActionReport;
-import org.eclipse.osbp.xtext.action.ActionTask;
 import org.eclipse.osbp.xtext.action.ActionToolbar;
-import org.eclipse.osbp.xtext.action.ActionWorkflow;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -58,6 +47,8 @@
 @SuppressWarnings("restriction")
 public class MainToolbarProvider implements IMainToolbarProvider {
 
+	private static final String PERSPECTIVE_ID = "perspectiveId";
+
 	/** The log. */
 	private static Logger log = LoggerFactory.getLogger(MainToolbarProvider.class);
 
@@ -73,22 +64,12 @@
 	@Inject
 	private IThemeResourceService themeResourceService;
 
-	/** The dsl metadata service. */
-	@Inject
-	private IDSLMetadataService dslMetadataService;
-
-	/** The trimmed window. */
-	private MTrimmedWindow trimmedWindow;
-
 	/** The trim bar. */
 	private MTrimBar trimBar;
 
 	/** The menu factory. */
 	private MenuFactoryImpl menuFactory;
 
-	/** The basic factory. */
-	private BasicFactoryImpl basicFactory;
-
 	/** The presentation engine. */
 	private GenericPresentationEngine presentationEngine;
 
@@ -96,10 +77,11 @@
 	private String toolbarId;
 
 	/**
-	 * Instantiates a new main toolbar provider. It is injected later via E4ContextFunction.
+	 * Instantiates a new main toolbar provider. It is injected later via
+	 * E4ContextFunction.
 	 */
 	@Inject
-	public MainToolbarProvider() {
+	public MainToolbarProvider() { // NOSONAR
 	}
 
 	/**
@@ -109,10 +91,10 @@
 	public void init() {
 		log.debug("init MainToolbarProvider");
 		menuFactory = MenuFactoryImpl.init();
-		basicFactory = BasicFactoryImpl.init();
+		BasicFactoryImpl basicFactory = BasicFactoryImpl.init();
 		presentationEngine = eclipseContext.get(GenericPresentationEngine.class);
 		if (appModel != null) {
-			trimmedWindow = null;
+			MTrimmedWindow trimmedWindow = null;
 			if (appModel.getChildren().isEmpty()) {
 				trimmedWindow = BasicFactoryImpl.eINSTANCE.createTrimmedWindow();
 				trimmedWindow.setToBeRendered(true);
@@ -125,7 +107,7 @@
 			if (trimmedWindow.getTrimBars().isEmpty()) {
 				// create trimBar
 				trimBar = basicFactory.createTrimBar();
-				trimBar.setElementId(PerspectiveConstants.E4Constants.TRIMBAR);
+				trimBar.setElementId(IPerspectiveProvider.E4Constants.TRIMBAR);
 				trimBar.setToBeRendered(true);
 				trimBar.setVisible(true);
 				trimBar.setSide(SideValue.TOP);
@@ -139,12 +121,13 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.osbp.vaaclipse.addons.softwarefactory.maintoolbar.IMainToolbarProvider#addToolbar(java.lang.String, org.eclipse.osbp.xtext.action.ActionToolbar,
-	 * java.lang.String)
+	 * @see org.eclipse.osbp.vaaclipse.addons.softwarefactory.maintoolbar.
+	 * IMainToolbarProvider#addToolbar(java.lang.String,
+	 * org.eclipse.osbp.xtext.action.ActionToolbar, java.lang.String)
 	 */
 	@Override
 	public void addToolbar(String perspectiveId, ActionToolbar toolBarModel) {
-		log.debug("addToolbar for perspectiveId " + perspectiveId);
+		log.debug("addToolbar for perspectiveId {}", perspectiveId);
 		MToolBar toolBar = createToolbar(perspectiveId, toolBarModel);
 		createToolbarArea(toolBar);
 	}
@@ -165,7 +148,7 @@
 			Component test = toolBarArea.getComponent(idx);
 			AbstractLayout hl = (AbstractLayout) test;
 			if (hl.getData() instanceof MToolBar) {
-				toolBarWidget = (Component) toolBarArea.getComponent(idx);
+				toolBarWidget = toolBarArea.getComponent(idx);
 				break;
 			}
 		}
@@ -192,11 +175,11 @@
 	MToolBar createToolbar(String perspectiveId, ActionToolbar toolBarModel) {
 		MToolBar toolBar = null;
 		toolBar = menuFactory.createToolBar();
-		toolBar.setElementId(PerspectiveConstants.E4Constants.TOOLBARCONTROLS + "." + perspectiveId);
+		toolBar.setElementId(IPerspectiveProvider.E4Constants.TOOLBARCONTROLS + "." + perspectiveId);
 		toolBar.setToBeRendered(true);
 		addToolbarItems(toolBar, toolBarModel);
 		// set handle
-		toolBar.getTransientData().put("perspectiveId", perspectiveId);
+		toolBar.getTransientData().put(PERSPECTIVE_ID, perspectiveId);
 		trimBar.getChildren().add(toolBar);
 		return toolBar;
 	}
@@ -204,18 +187,18 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.osbp.vaaclipse.addons.softwarefactory.maintoolbar.IMainToolbarProvider#removeToolbar(java.lang.String)
+	 * @see org.eclipse.osbp.vaaclipse.addons.softwarefactory.maintoolbar.
+	 * IMainToolbarProvider#removeToolbar(java.lang.String)
 	 */
 	@Override
 	public void removeToolbar(String perspectiveId) {
-		log.debug("removeToolbar for perspectiveId " + perspectiveId);
+		log.debug("removeToolbar for perspectiveId {}", perspectiveId);
 		MTrimElement elementToRemove = null;
 		for (MTrimElement element : trimBar.getChildren()) {
-			if (element instanceof MToolBar) {
-				if (perspectiveId.equals(((MToolBar) element).getTransientData().get("perspectiveId"))) {
-					removeToolbarItems((MToolBar) element);
-					elementToRemove = element;
-				}
+			if (element instanceof MToolBar
+					&& perspectiveId.equals(((MToolBar) element).getTransientData().get(PERSPECTIVE_ID))) {
+				removeToolbarItems((MToolBar) element);
+				elementToRemove = element;
 			}
 		}
 		trimBar.getChildren().remove(elementToRemove);
@@ -224,15 +207,15 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.osbp.vaaclipse.addons.softwarefactory.maintoolbar.IMainToolbarProvider#setActive(java.lang.String, boolean)
+	 * @see org.eclipse.osbp.vaaclipse.addons.softwarefactory.maintoolbar.
+	 * IMainToolbarProvider#setActive(java.lang.String, boolean)
 	 */
 	@Override
 	public void setActive(String perspectiveId, boolean active) {
 		for (MTrimElement element : trimBar.getChildren()) {
-			if (element instanceof MToolBar) {
-				if (perspectiveId.equals(((MToolBar) element).getTransientData().get("perspectiveId"))) {
-					((MToolBar) element).setVisible(active);
-				}
+			if (element instanceof MToolBar
+					&& perspectiveId.equals(((MToolBar) element).getTransientData().get(PERSPECTIVE_ID))) {
+				((MToolBar) element).setVisible(active);
 			}
 		}
 	}
@@ -264,7 +247,7 @@
 	 *            the action uri
 	 */
 	private void addToolbarItem(ActionButton buttonModel, MToolBar toolBar) {
-		MDirectToolItem toolItem = menuFactory.createDirectToolItem();
+		MHandledToolItem toolItem = menuFactory.createHandledToolItem();
 		toolItem.setType(ItemType.PUSH);
 
 		toolItem.setTooltip(buttonModel.getName());
@@ -273,11 +256,21 @@
 		toolItem.setToBeRendered(true);
 		toolItem.setVisible(true);
 
-		toolItem.setContributionURI(getToolItemURI(buttonModel));
-		toolItem.setElementId(PerspectiveConstants.E4Constants.TOOLBARITEM_PREFIX + buttonModel.getName());
+		setCommand(buttonModel.getCommand().getName(), toolItem, appModel);
+		toolItem.setElementId(IPerspectiveProvider.E4Constants.TOOLBARITEM_PREFIX + buttonModel.getName());
 		toolBar.getChildren().add(toolItem);
 	}
 
+	private void setCommand(final String commandName, final MHandledToolItem toolItem, final MApplication application) {
+		for (MCommand command : application.getCommands()) {
+			if (command.getCommandName().equals(commandName)) {
+				toolItem.setCommand(command);
+				break;
+			}
+		}
+
+	}
+
 	/**
 	 * Removes toolBar items.
 	 *
@@ -288,56 +281,6 @@
 		toolBar.getChildren().clear();
 	}
 
-	/**
-	 * Gets the tool item uri.
-	 *
-	 * @param buttonModel
-	 *            the button model
-	 * @param actionUri
-	 *            the action uri
-	 * @return the tool item uri
-	 */
-	private String getToolItemURI(ActionButton buttonModel) { // NOSONAR
-		log.debug("add toolitemuri " + buttonModel.getName());
-		String pkgName = null;
-		String toolBarName = null;
-		EObject eObj = buttonModel.eContainer();
-		while (eObj != null) {
-			if (eObj instanceof ActionToolbar) {
-				toolBarName = ((ActionToolbar) eObj).getName();
-			}
-			if (eObj instanceof ActionPackage) {
-				pkgName = ((ActionPackage) eObj).getName();
-			}
-			eObj = eObj.eContainer();
-		}
-		// create unique id for broadcast message identification and put to context
-		String uuid = UUID.randomUUID().toString();
-		toolbarId = toolBarName + "Action" + uuid;
-		eclipseContext.set(toolBarName + "_TOOLBAR_ID", uuid);
-
-		String actionId = null;
-		if (buttonModel.getActionType() instanceof ActionTask) {
-			actionId = ((ActionTask) buttonModel.getActionType()).getAction().getLiteral();
-		}
-		if (buttonModel.getActionType() instanceof ActionDialog) {
-			actionId = ((ActionDialog) buttonModel.getActionType()).getAction().getLiteral();
-		}
-		if (buttonModel.getActionType() instanceof ActionReport) {
-			actionId = ((ActionReport) buttonModel.getActionType()).getAction().getLiteral();
-		}
-		if (buttonModel.getActionType() instanceof ActionChart) {
-			actionId = ((ActionChart) buttonModel.getActionType()).getAction().getLiteral();
-		}
-		if (buttonModel.getActionType() instanceof ActionWorkflow) {
-			actionId = ((ActionWorkflow) buttonModel.getActionType()).getAction().getLiteral();
-		}
-		if (buttonModel.getActionType() instanceof ActionGeneric) {
-			actionId = ((ActionGeneric) buttonModel.getActionType()).getAction();
-		}
-		return dslMetadataService.getClassURI(pkgName + "." + StringUtils.capitalize(toolBarName) + StringUtils.capitalize(actionId) + "Action", "action");
-	}
-
 	@Override
 	public String getToolbarId() {
 		return toolbarId;
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/KanbanView.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/KanbanView.java
new file mode 100644
index 0000000..86e7021
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/KanbanView.java
@@ -0,0 +1,147 @@
+package org.eclipse.osbp.vaaclipse.addons.softwarefactory.perspective;
+
+import java.util.Locale;
+
+import javax.annotation.PostConstruct;
+import javax.inject.Inject;
+
+import org.eclipse.e4.core.contexts.ContextInjectionFactory;
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.ui.di.Focus;
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.osbp.ecview.core.extension.model.extension.YKanbanEvent;
+import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
+import org.eclipse.osbp.runtime.web.ecview.presentation.vaadin.common.KanbanBoardEmbeddable;
+import org.eclipse.osbp.ui.api.e4.IE4Dialog;
+import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
+import org.eclipse.osbp.ui.api.perspective.IPerspectiveProvider;
+import org.eclipse.osbp.ui.api.user.IUser;
+import org.eclipse.osbp.xtext.dialogdsl.Dialog;
+import org.eclipse.osbp.xtext.dialogdsl.common.AbstractEmbeddedDialog;
+
+import com.vaadin.server.ClientConnector;
+import com.vaadin.server.ClientConnector.AttachEvent;
+import com.vaadin.server.ClientConnector.DetachEvent;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.Panel;
+import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.Window;
+
+public class KanbanView
+		implements IUser.UserLocaleListener, ClientConnector.DetachListener, ClientConnector.AttachListener, IE4Dialog {
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	@Inject
+	MPart part;
+
+	@Inject
+	private IUser user;
+
+	@SuppressWarnings("unused")
+	@Inject
+	private IEventDispatcher eventDispatcher;
+
+	@Inject
+	private IDSLMetadataService dslMetadataService;
+
+	private VerticalLayout parent;
+	private transient IEclipseContext context;
+	private KanbanBoardEmbeddable kanbanBoard;
+	private String dialogEcviewId;
+	private Dialog dialog;
+
+	@Inject
+	public KanbanView(VerticalLayout parent, IEclipseContext context, MApplication app) {
+		this.parent = parent;
+		this.context = context;
+	}
+
+	@PostConstruct
+	public void createView() {
+		context.set(IE4Dialog.class, this);
+		parent.setPrimaryStyleName("osbp");
+		parent.setId("parent");
+		parent.setSizeFull();
+		parent.addAttachListener(this);
+		parent.addDetachListener(this);
+
+		EObject eObject = (EObject) part.getTransientData().get(IPerspectiveProvider.KanbanConstants.DTO);
+		Class<?> dto = dslMetadataService.getClass(eObject, "dto");
+		dialog = (Dialog) part.getTransientData().get(IPerspectiveProvider.KanbanConstants.DIALOG);
+		Dialog card = (Dialog) part.getTransientData().get(IPerspectiveProvider.KanbanConstants.CARD);
+
+		dialogEcviewId = dslMetadataService.getECViewId(dialog);
+		String cardEcviewId = dslMetadataService.getECViewId(card);
+
+		kanbanBoard = new KanbanBoardEmbeddable(dto, dialogEcviewId, cardEcviewId);
+		parent.addComponent(kanbanBoard);
+		kanbanBoard.setSizeFull();
+
+		kanbanBoard.setDoubleClickConsumer(this::showDialog);
+		kanbanBoard.setStateChangedConsumer(e -> System.out.println("stateChange " + e));
+
+		kanbanBoard.init(user.getLocale());
+	}
+
+	private void showDialog(YKanbanEvent event) {
+		Class<?> dialogViewClass = dslMetadataService.getClass(dialog, "dialog");
+
+		Window dialogWindow = new Window();
+		parent.getUI().addWindow(dialogWindow);
+		VerticalLayout dialogParent = new VerticalLayout();
+		dialogParent.setSizeFull();
+		dialogWindow.setContent(dialogParent);
+
+		// TODO ask Riegel
+		dialogWindow.setWidth("650px");
+		dialogWindow.setHeight("300px");
+
+		IEclipseContext childContext = context.createChild();
+		childContext.set(VerticalLayout.class, dialogParent);
+
+		AbstractEmbeddedDialog<?> content = (AbstractEmbeddedDialog<?>) ContextInjectionFactory.make(dialogViewClass,
+				childContext);
+		content.addSaveListener(this::refreshCard);
+		content.setEnableManualInput(true);
+		content.createView(dialogParent);
+		content.createComponents();
+		content.setInput(event.dto);
+
+		dialogWindow.center();
+	}
+	
+	private void refreshCard(Object dto){
+		kanbanBoard.refreshCard(dto);
+	}
+
+	@Override
+	public void attach(AttachEvent event) {
+		user.addUserLocaleListener(this);
+	}
+
+	@Override
+	public void detach(DetachEvent event) {
+		user.removeUserLocaleListener(this);
+	}
+
+	@Focus
+	public void setFocus() {
+		Component parent = this.parent;
+		while (!(parent instanceof Panel) && parent != null) {
+			parent = parent.getParent();
+		}
+		if (parent != null) {
+			((Panel) parent).focus();
+		}
+	}
+
+	@Override
+	public void localeChanged(Locale locale) {
+		kanbanBoard.setLocale(locale);
+		kanbanBoard.getViewContext().setLocale(locale);
+	}
+}
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/PerspectiveProvider.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/PerspectiveProvider.java
new file mode 100644
index 0000000..9eab161
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/PerspectiveProvider.java
@@ -0,0 +1,1044 @@
+/*
+ *                                                                            
+ *  Copyright (c) 2011 - 2017 - Loetz GmbH & Co KG, 69115 Heidelberg, Germany 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Initial contribution:                                                      
+ *     Loetz GmbH & Co. KG                              
+ * 
+ */
+package org.eclipse.osbp.vaaclipse.addons.softwarefactory.perspective;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.Process;
+import org.eclipse.bpmn2.Task;
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.core.di.annotations.Optional;
+import org.eclipse.e4.core.services.events.IEventBroker;
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.ui.MElementContainer;
+import org.eclipse.e4.ui.model.application.ui.MUIElement;
+import org.eclipse.e4.ui.model.application.ui.advanced.MAdvancedFactory;
+import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
+import org.eclipse.e4.ui.model.application.ui.advanced.MPerspectiveStack;
+import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder;
+import org.eclipse.e4.ui.model.application.ui.advanced.impl.AdvancedFactoryImpl;
+import org.eclipse.e4.ui.model.application.ui.advanced.impl.AdvancedPackageImpl;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainer;
+import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainerElement;
+import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
+import org.eclipse.e4.ui.model.application.ui.basic.MStackElement;
+import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
+import org.eclipse.e4.ui.model.application.ui.basic.MWindowElement;
+import org.eclipse.e4.ui.model.application.ui.basic.impl.BasicFactoryImpl;
+import org.eclipse.e4.ui.workbench.modeling.EModelService;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.osbp.bpm.api.BPMOperation;
+import org.eclipse.osbp.bpm.api.BPMTaskClientPerspectiveListener;
+import org.eclipse.osbp.bpm.api.BPMTaskEventType;
+import org.eclipse.osbp.bpm.api.BPMTaskSummary;
+import org.eclipse.osbp.bpm.api.BPMTaskUserEvent;
+import org.eclipse.osbp.bpm.api.IBPMTaskClient;
+import org.eclipse.osbp.bpm.api.IBPMTaskEventNotification;
+import org.eclipse.osbp.bpm.api.IBlipBPMConstants;
+import org.eclipse.osbp.bpm.api.IBlipBPMFunctionProvider;
+import org.eclipse.osbp.bpm.api.IBlipBPMStartInfo;
+import org.eclipse.osbp.bpm.api.IBlipBPMWorkloadModifiableItem;
+import org.eclipse.osbp.dsl.common.datatypes.IDto;
+import org.eclipse.osbp.ecview.core.extension.model.extension.ExtensionModelPackage;
+import org.eclipse.osbp.eventbroker.EventBrokerMsg;
+import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent;
+import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherCommand;
+import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherDataTag;
+import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
+import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
+import org.eclipse.osbp.ui.api.organization.IOrganizationViewPartProvider;
+import org.eclipse.osbp.ui.api.perspective.IPerspectiveProvider;
+import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
+import org.eclipse.osbp.ui.api.themes.IThemeResourceService.ThemeResourceType;
+import org.eclipse.osbp.ui.api.user.IUser;
+import org.eclipse.osbp.utils.bpmn.views.BpmnView;
+import org.eclipse.osbp.vaaclipse.addons.softwarefactory.maintoolbar.IMainToolbarProvider;
+import org.eclipse.osbp.vaaclipse.addons.softwarefactory.welcome.WelcomeView;
+import org.eclipse.osbp.vaaclipse.publicapi.authentication.AuthenticationConstants;
+import org.eclipse.osbp.vaadin.emf.api.IModelingContext;
+import org.eclipse.osbp.xtext.action.ActionDSLPackage;
+import org.eclipse.osbp.xtext.action.ActionToolbar;
+import org.eclipse.osbp.xtext.action.TaskActionEnum;
+import org.eclipse.osbp.xtext.blip.BlipItem;
+import org.eclipse.osbp.xtext.blip.BlipUserTask;
+import org.eclipse.osbp.xtext.chart.Chart;
+import org.eclipse.osbp.xtext.chart.ChartDSLPackage;
+import org.eclipse.osbp.xtext.chart.ChartPackage;
+import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangePackage;
+import org.eclipse.osbp.xtext.dialogdsl.Dialog;
+import org.eclipse.osbp.xtext.dialogdsl.DialogDSLPackage;
+import org.eclipse.osbp.xtext.dialogdsl.DialogPackage;
+import org.eclipse.osbp.xtext.organizationdsl.Organization;
+import org.eclipse.osbp.xtext.organizationdsl.OrganizationDSLPackage;
+import org.eclipse.osbp.xtext.organizationdsl.OrganizationPackage;
+import org.eclipse.osbp.xtext.perspective.Perspective;
+import org.eclipse.osbp.xtext.perspective.PerspectiveBPMN;
+import org.eclipse.osbp.xtext.perspective.PerspectiveBean;
+import org.eclipse.osbp.xtext.perspective.PerspectiveChart;
+import org.eclipse.osbp.xtext.perspective.PerspectiveDataInterchange;
+import org.eclipse.osbp.xtext.perspective.PerspectiveDialog;
+import org.eclipse.osbp.xtext.perspective.PerspectiveDslPackage;
+import org.eclipse.osbp.xtext.perspective.PerspectiveElement;
+import org.eclipse.osbp.xtext.perspective.PerspectiveGrid;
+import org.eclipse.osbp.xtext.perspective.PerspectiveKanban;
+import org.eclipse.osbp.xtext.perspective.PerspectiveOrganization;
+import org.eclipse.osbp.xtext.perspective.PerspectivePart;
+import org.eclipse.osbp.xtext.perspective.PerspectivePartStack;
+import org.eclipse.osbp.xtext.perspective.PerspectiveReport;
+import org.eclipse.osbp.xtext.perspective.PerspectiveSashContainer;
+import org.eclipse.osbp.xtext.perspective.PerspectiveSearch;
+import org.eclipse.osbp.xtext.perspective.PerspectiveSelection;
+import org.eclipse.osbp.xtext.perspective.PerspectiveTable;
+import org.eclipse.osbp.xtext.perspective.PerspectiveTopology;
+import org.eclipse.osbp.xtext.perspective.PerspectiveView;
+import org.eclipse.osbp.xtext.perspective.PerspectiveWelcome;
+import org.eclipse.osbp.xtext.reportdsl.Report;
+import org.eclipse.osbp.xtext.reportdsl.ReportDSLPackage;
+import org.eclipse.osbp.xtext.reportdsl.ReportPackage;
+import org.eclipse.osbp.xtext.table.Table;
+import org.eclipse.osbp.xtext.table.TableDSLPackage;
+import org.eclipse.osbp.xtext.table.TablePackage;
+import org.eclipse.osbp.xtext.topologydsl.Topology;
+import org.eclipse.osbp.xtext.topologydsl.TopologyDSLPackage;
+import org.eclipse.osbp.xtext.topologydsl.TopologyPackage;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The Class PerspectiveProvider. Available as injectable service to create and maintain perspectives coming from the perspective DSL model.
+ */
+@SuppressWarnings("restriction")
+public class PerspectiveProvider implements IPerspectiveProvider, IBPMTaskEventNotification, IEventDispatcher.Receiver, BPMTaskClientPerspectiveListener {
+
+	/** The log. */
+	private static Logger log = LoggerFactory.getLogger(PerspectiveProvider.class);
+
+	/** The event broker. */
+	@Inject
+	private IEventBroker eventBroker;
+
+	/** The app model. */
+	@Inject
+	private MApplication appModel;
+
+	/** The eclipse context. */
+	@Inject
+	private IEclipseContext eclipseContext;
+
+	@Inject
+	private IModelingContext modelingContext;
+
+	/** The theme resource service. */
+	@Inject
+	private IThemeResourceService themeResourceService;
+
+	/** The current user. */
+	@Inject
+	private IUser user;
+
+	/** The task client. */
+	@Inject
+	@Optional
+	private IBPMTaskClient taskClient;
+
+	/** The task provider */
+	@Inject
+	private IBlipBPMFunctionProvider taskProvider;
+
+	/** The dsl metadata service. */
+	@Inject
+	private IDSLMetadataService dslMetadataService;
+
+	/** The toolbar provider. */
+	@Inject
+	@Named("MainToolbar")
+	private IMainToolbarProvider toolbarProvider;
+
+	/** The optional org URI provider. */
+	@Inject
+	@Optional
+	private IOrganizationViewPartProvider optionalOrgURIProvider;
+
+	/** The event dispatcher. */
+	@Inject
+	private IEventDispatcher eventDispatcher;
+
+	/** The do logout. */
+	private EventHandler doLogout;
+
+	/** The trimmed window. */
+	private MTrimmedWindow trimmedWindow = null;
+
+	/** The model service. */
+	private EModelService modelService;
+
+	/** The perspectives. */
+	private Map<String, MPerspective> perspectives = new HashMap<>();
+
+	/** The perspective tasks. */
+	private Map<Long, String> perspectiveTasks = new HashMap<>();
+
+	/**
+	 * Inits the PerspectiveSupport.
+	 */
+	@PostConstruct
+	protected void init() {
+		perspectives.clear();
+		perspectiveTasks.clear();
+		modelService = eclipseContext.get(EModelService.class);
+		eventDispatcher.addEventReceiver(this);
+		subscribe();
+	}
+
+	/**
+	 * Inits the perspective stack.
+	 *
+	 * @return the current perspective stack or null
+	 */
+	private MPerspectiveStack initPerspectiveStack() {
+		log.debug("analyze app model");
+		trimmedWindow = (MTrimmedWindow) appModel.getChildren().get(0);
+		for (MWindowElement element : trimmedWindow.getChildren()) {
+			if (element instanceof MPerspectiveStack) {
+				return addToolbarAdapter((MPerspectiveStack) element);
+			}
+		}
+		return null;
+	}
+
+	private MPerspectiveStack addToolbarAdapter(MPerspectiveStack stack) {
+		// handle toolbar
+		((EObject) stack).eAdapters().add(new AdapterImpl() {
+			@Override
+			public void notifyChanged(Notification notification) {
+				if (notification.getEventType() == Notification.SET
+						&& notification.getFeatureID(MElementContainer.class) == AdvancedPackageImpl.PERSPECTIVE_STACK__SELECTED_ELEMENT) {
+					log.debug("perspective stack changed selection");
+					if (notification.getNewValue() == null && notification.getOldValue() != null
+							&& PerspectiveProvider.isPerspectiveElementId(((MPerspective) notification.getOldValue()).getElementId())) {
+						closePerspective(PerspectiveProvider.fromPerspectiveElementId(((MPerspective) notification.getOldValue()).getElementId()));
+					}
+					// perspective changed
+					if (notification.getNewValue() == null && notification.getOldValue() != null) {
+						// deactivate old perspective - hide its toolBar
+						String perspectiveId = PerspectiveProvider.fromPerspectiveElementId(((MPerspective) notification.getOldValue()).getElementId());
+						toolbarProvider.setActive(perspectiveId, false);
+					}
+					if (notification.getNewValue() != null && notification.getOldValue() == null) {
+						// activate new perspective - show its toolbar
+						String perspectiveId = PerspectiveProvider.fromPerspectiveElementId(((MPerspective) notification.getNewValue()).getElementId());
+						toolbarProvider.setActive(perspectiveId, true);
+					}
+				}
+			}
+		});
+		return stack;
+	}
+
+	/**
+	 * Checks if is our perspective element id.
+	 *
+	 * @param elementId
+	 *            the element id
+	 * @return true, if is perspective element id
+	 */
+	protected static boolean isPerspectiveElementId(String perspectiveId) {
+		return perspectiveId.startsWith(IPerspectiveProvider.E4Constants.PERSPECTIVE_PREFIX);
+	}
+
+	/**
+	 * converts a name to a perspective element id.
+	 *
+	 * @param perspectiveId
+	 *            the perspective id
+	 * @return the string
+	 */
+	protected static String toPerspectiveElementId(String perspectiveId) {
+		return IPerspectiveProvider.E4Constants.PERSPECTIVE_PREFIX + perspectiveId;
+	}
+
+	/**
+	 * converts from perspective element id to a name.
+	 *
+	 * @param elementId
+	 *            the element id
+	 * @return the string
+	 */
+	protected static String fromPerspectiveElementId(String elementId) {
+		return elementId.substring(IPerspectiveProvider.E4Constants.PERSPECTIVE_PREFIX.length());
+	}
+
+	/**
+	 * Add the perspective identified by perspectiveId to PerspectiveStack.
+	 *
+	 * @param perspectiveModel
+	 *            - the model everything is based on
+	 * @param perspectiveId
+	 *            - unique identifier for a perspective in the model
+	 * @return the m perspective
+	 */
+	private MPerspective createPerspective(MPerspectiveStack stack, Perspective perspectiveModel, String perspectiveId) {
+		MPerspective perspective = AdvancedFactoryImpl.eINSTANCE.createPerspective();
+
+		perspective.getTags().add(IPerspectiveProvider.E4Constants.TAG_REMOVE_ON_CLOSE);
+		perspective.getTags().add(IPerspectiveProvider.E4Constants.TAG_NOT_IN_OPEN_PERSPECTIVE_DIALOG);
+
+		perspective.setElementId(PerspectiveProvider.toPerspectiveElementId(perspectiveId));
+		perspective.setLabel(perspectiveModel.getName());
+		perspective.setVisible(true);
+		perspective.setToBeRendered(true);
+		perspective.setIconURI(themeResourceService.getThemeURI(perspectiveModel.getIconURI(), ThemeResourceType.ICON));
+		perspective.setAccessibilityPhrase(perspectiveModel.getAccessibilityPhrase());
+		if (perspectiveModel.isDescription()) {
+			perspective.setTooltip(perspectiveModel.getDescriptionValue().replace("\"", ""));
+		}
+
+		// iterate over all elements
+		traverseModel(perspective, perspectiveModel);
+		if (!perspective.getChildren().isEmpty()) {
+			MPartSashContainerElement firstElement = perspective.getChildren().get(0);
+			if (firstElement instanceof MPartSashContainer) {
+				// create placeholder for designer
+				//
+				MPlaceholder designerPH = MAdvancedFactory.INSTANCE.createPlaceholder();
+				MUIElement area = modelService.find("org.eclipse.osbp.model.area.designer", stack);
+				designerPH.setRef(area);
+				designerPH.setContainerData("40");
+				designerPH.setVisible(modelingContext.isDesignMode());
+				designerPH.setToBeRendered(modelingContext.isDesignMode());
+				designerPH.getTags().add("designer:autoVisible");
+
+				((MPartSashContainer) firstElement).getChildren().add(designerPH);
+			}
+		}
+		return perspective;
+	}
+
+	/**
+	 * Register context.
+	 *
+	 * @param map
+	 *            the map
+	 * @param task
+	 *            the task
+	 */
+	private void registerContext(Map<String, Object> map, PerspectiveFound perspectiveFound) {
+		String workloadDtoFqn = null;
+		IDto workloadDto = null;
+		IBlipBPMStartInfo startInfo = null;
+		IBlipBPMWorkloadModifiableItem task = null;
+		Class<?> operativeDtoClass = null;
+		String operativeDtoFqn = null;
+		List<IDto> operativeDtos = null;
+
+		if (taskClient != null) {
+			workloadDtoFqn = taskClient.getWorkloadDtoFqn(perspectiveFound.taskSummary);
+			workloadDto = taskClient.getWorkloadDto(perspectiveFound.taskSummary);
+			if (perspectiveFound.blipTask != null) {
+				startInfo = taskProvider.getStartInfo(perspectiveFound.taskSummary);
+			}
+			if (startInfo != null) {
+				task = startInfo.getWorkloadMofifiableBpmItemForBlipId(perspectiveFound.blipTask.getName());
+			}
+			if (task != null) {
+				operativeDtos = task.getOperativeDtos(workloadDto);
+				operativeDtoClass = task.getOperativeDtoClass();
+				if (operativeDtoClass != null) {
+					operativeDtoFqn = operativeDtoClass.getCanonicalName();
+				} else {
+					operativeDtoClass = null;
+				}
+			}
+		}
+		map.put(IBlipBPMConstants.VARIABLE_PROCESS_START_INFO, startInfo);
+		map.put(IBlipBPMConstants.VARIABLE_PROCESS_WORKLOAD_DTO_FQN, workloadDtoFqn);
+		map.put(IBlipBPMConstants.VARIABLE_PROCESS_WORKLOAD_DTO, workloadDto);
+		map.put(IBlipBPMConstants.VARIABLE_TASK_JBPM_SUMMARY, perspectiveFound.taskSummary);
+		map.put(IBlipBPMConstants.VARIABLE_TASK_BLIP_ITEM, perspectiveFound.blipTask);
+		map.put(IBlipBPMConstants.VARIABLE_TASK_BPM2_ITEM, perspectiveFound.bpmTask);
+		map.put(IBlipBPMConstants.VARIABLE_TASK_START_INFO, task);
+		map.put(IBlipBPMConstants.VARIABLE_TASK_OPERATIVE_DTO_CLASS, operativeDtoClass);
+		map.put(IBlipBPMConstants.VARIABLE_TASK_OPERATIVE_DTO_FQN, operativeDtoFqn);
+		map.put(IBlipBPMConstants.VARIABLE_TASK_OPERATIVE_DTOS, operativeDtos);
+	}
+
+	/**
+	 * for every model element that can hold children, traverse recursively the model.
+	 * 
+	 * @param parent
+	 *            - the parent e4 node to which the next child is added
+	 * @param modelElement
+	 *            - the current element which is traversed
+	 */
+	private void traverseModel(MElementContainer<?> parent, EObject modelElement) {
+		if (modelElement instanceof Perspective) {
+			log.debug("traverse model perspective");
+			Perspective perspectiveModel = (Perspective) modelElement;
+			for (PerspectiveElement element : perspectiveModel.getElements()) {
+				addElement(parent, element);
+			}
+		} else if (modelElement instanceof PerspectiveSashContainer) {
+			log.debug("traverse model sashcontainer");
+			PerspectiveSashContainer sashModel = (PerspectiveSashContainer) modelElement;
+			for (PerspectiveElement element : sashModel.getElements()) {
+				addElement(parent, element);
+			}
+		} else if (modelElement instanceof PerspectivePartStack) {
+			log.debug("traverse model perspectivestack");
+			PerspectivePartStack stackModel = (PerspectivePartStack) modelElement;
+			for (PerspectiveElement element : stackModel.getElements()) {
+				addElement(parent, element);
+			}
+		}
+	}
+
+	/**
+	 * for PerspectiveSashContainer create an e4 element by it's factory.
+	 * 
+	 * @param parent
+	 *            - the parent e4 node to which the next child is added
+	 * @param element
+	 *            - the current element which is traversed
+	 */
+	@SuppressWarnings("unchecked")
+	private void addElementPerspectiveSashContainer(MElementContainer<?> parent, EObject element) {
+		PerspectiveSashContainer sashModel = (PerspectiveSashContainer) element;
+		MPartSashContainer sashContainer = BasicFactoryImpl.eINSTANCE.createPartSashContainer();
+		sashContainer.setAccessibilityPhrase(sashModel.getAccessibilityPhrase());
+		if (sashModel.getContainerData() != null) {
+			sashContainer.setContainerData(sashModel.getContainerData().replace("\"", ""));
+		} else {
+			sashContainer.setContainerData("50");
+		}
+
+		sashContainer.setElementId(sashModel.getElementId());
+		if ("HORIZONTAL".equals(sashModel.getOrientation().getName())) {
+			sashContainer.setHorizontal(true);
+		} else {
+			sashContainer.setHorizontal(false);
+		}
+		sashContainer.setVisible(true);
+		sashContainer.setParent((MElementContainer<MUIElement>) parent);
+		if (parent instanceof MPerspective) {
+			((MPerspective) parent).getChildren().add(sashContainer);
+		} else if (parent instanceof MPartSashContainer) {
+			((MPartSashContainer) parent).getChildren().add(sashContainer);
+		}
+		// go deeper
+		traverseModel(sashContainer, element);
+		// set selected references
+		for (MPartSashContainerElement child : sashContainer.getChildren()) {
+			if (sashModel.getSelectedElement() != null && child.getElementId().equals(sashModel.getSelectedElement().getElementId())) {
+				sashContainer.setSelectedElement(child);
+				break;
+			}
+		}
+	}
+
+	/**
+	 * for addElementPerspectivePartStack create an e4 element by it's factory.
+	 * 
+	 * @param parent
+	 *            - the parent e4 node to which the next child is added
+	 * @param element
+	 *            - the current element which is traversed
+	 */
+	@SuppressWarnings("unchecked")
+	private void addElementPerspectivePartStack(MElementContainer<?> parent, EObject element) {
+		PerspectivePartStack stackModel = (PerspectivePartStack) element;
+		MPartStack stack = BasicFactoryImpl.eINSTANCE.createPartStack();
+		stack.setAccessibilityPhrase(stackModel.getAccessibilityPhrase());
+		if (stackModel.getContainerData() != null) {
+			stack.setContainerData(stackModel.getContainerData().replace("\"", ""));
+		} else {
+			stack.setContainerData("50");
+		}
+		stack.setElementId(stackModel.getElementId());
+		stack.setVisible(true);
+		stack.setParent((MElementContainer<MUIElement>) parent);
+		if (parent instanceof MPerspective) {
+			((MPerspective) parent).getChildren().add(stack);
+		} else if (parent instanceof MPartSashContainer) {
+			((MPartSashContainer) parent).getChildren().add(stack);
+		}
+		// go deeper
+		traverseModel(stack, element);
+		// set selected references
+		for (MStackElement child : stack.getChildren()) {
+			if (stackModel.getSelectedElement() != null && child.getElementId().equals(stackModel.getSelectedElement().getElementId())) {
+				stack.setSelectedElement(child);
+				break;
+			}
+		}
+	}
+
+	/**
+	 * for addElementPerspectivePart create an e4 element by it's factory.
+	 * 
+	 * @param parent
+	 *            - the parent e4 node to which the next child is added
+	 * @param element
+	 *            - the current element which is traversed
+	 */
+	@SuppressWarnings("unchecked")
+	private void addElementPerspectivePart(MElementContainer<?> parent, EObject element) {
+		PerspectivePart partModel = (PerspectivePart) element;
+		MPart part = BasicFactoryImpl.eINSTANCE.createPart();
+		part.setAccessibilityPhrase(partModel.getAccessibilityPhrase());
+		if (partModel.getContainerData() != null) {
+			part.setContainerData(partModel.getContainerData().replace("\"", ""));
+		} else {
+			part.setContainerData("50");
+		}
+
+		part.setElementId(partModel.getElementId());
+		part.setIconURI(partModel.getIconURI());
+		part.setLabel(partModel.getElementId());
+		part.setVisible(true);
+		part.setCloseable(partModel.isIsClosable());
+
+		part.getPersistedState().put(IPerspectiveProvider.E4Constants.OSBP_NS_URI, getNsURI(partModel.getView()));
+		part.getPersistedState().put(IPerspectiveProvider.E4Constants.OSBP_FQN, getFQN(partModel.getView()));
+
+		String flavor = getFlavor(partModel.getView());
+		if (flavor != null) {
+			part.getPersistedState().put(IPerspectiveProvider.E4Constants.OSBP_FLAVOR, flavor);
+		}
+
+		part.setParent((MElementContainer<MUIElement>) parent);
+		if (parent instanceof MPerspective) {
+			((MPerspective) parent).getChildren().add(part);
+		} else if (parent instanceof MPartSashContainer) {
+			((MPartSashContainer) parent).getChildren().add(part);
+		} else if (parent instanceof MPartStack) {
+			((MPartStack) parent).getChildren().add(part);
+		}
+		if (partModel.getView() != null) {
+			part.setContributionURI(getContributionURI(part, partModel));
+		}
+	}
+
+	/**
+	 * for every model element create an e4 element by it's factory.
+	 * 
+	 * @param parent
+	 *            - the parent e4 node to which the next child is added
+	 * @param element
+	 *            - the current element which is traversed
+	 */
+	private void addElement(MElementContainer<?> parent, EObject element) {
+		if (element instanceof PerspectiveSashContainer) {
+			addElementPerspectiveSashContainer(parent, element);
+		} else if (element instanceof PerspectivePartStack) {
+			addElementPerspectivePartStack(parent, element);
+		} else if (element instanceof PerspectivePart) {
+			addElementPerspectivePart(parent, element);
+		}
+	}
+
+	/**
+	 * create the view connected to a part.
+	 * 
+	 * @param viewModel
+	 *            - the model of the view
+	 * @return null or the classURI
+	 */
+	private String getContributionURI(MPart part, PerspectivePart partModel) { // NOSONAR
+		PerspectiveView viewModel = partModel.getView();
+		if (viewModel instanceof PerspectiveTable) {
+			String className = ((PerspectiveTable) viewModel).getRefTypeJvm().getQualifiedName();
+			return dslMetadataService.getClassURI(className, IPerspectiveProvider.PerspectiveViewType.TABLE);
+		} else if (viewModel instanceof PerspectiveSelection) {
+			String className = ((PerspectiveSelection) viewModel).getRefTypeJvm().getQualifiedName();
+			return dslMetadataService.getClassURI(className, IPerspectiveProvider.PerspectiveViewType.TABLE);
+		} else if (viewModel instanceof PerspectiveGrid) {
+			String className = ((PerspectiveGrid) viewModel).getRefTypeJvm().getQualifiedName();
+			return dslMetadataService.getClassURI(className, IPerspectiveProvider.PerspectiveViewType.TABLE);
+		} else if (viewModel instanceof PerspectiveBean) {
+			String className = ((PerspectiveBean) viewModel).getRefTypeJvm().getQualifiedName();
+			return dslMetadataService.getClassURI(className, IPerspectiveProvider.PerspectiveViewType.TABLE);
+		} else if (viewModel instanceof PerspectiveChart) {
+			String className = ((PerspectiveChart) viewModel).getRefTypeJvm().getQualifiedName();
+			return dslMetadataService.getClassURI(className, IPerspectiveProvider.PerspectiveViewType.CHART);
+		} else if (viewModel instanceof PerspectiveReport) {
+			String className = ((PerspectiveReport) viewModel).getRefTypeJvm().getQualifiedName();
+			return dslMetadataService.getClassURI(className, IPerspectiveProvider.PerspectiveViewType.REPORT);
+		} else if (viewModel instanceof PerspectiveOrganization) {
+			if (optionalOrgURIProvider != null) {
+				return optionalOrgURIProvider.getViewPartURI();
+			} else {
+				return null;
+			}
+		} else if (viewModel instanceof PerspectiveTopology) {
+			String className = ((PerspectiveTopology) viewModel).getRefTypeJvm().getQualifiedName();
+			return dslMetadataService.getClassURI(className, IPerspectiveProvider.PerspectiveViewType.TOPOLOGY);
+		} else if (viewModel instanceof PerspectiveDialog) {
+			String className = ((PerspectiveDialog) viewModel).getRefTypeJvm().getQualifiedName();
+			return dslMetadataService.getClassURI(className, IPerspectiveProvider.PerspectiveViewType.DIALOG);
+		} else if (viewModel instanceof PerspectiveDataInterchange) {
+			String className = ((PerspectiveDataInterchange) viewModel).getRefTypeJvm().getQualifiedName();
+			return dslMetadataService.getClassURI(className, IPerspectiveProvider.PerspectiveViewType.DATAINTERCHANGE);
+		} else if (viewModel instanceof PerspectiveBPMN) {
+			String className = BpmnView.class.getCanonicalName();
+			return dslMetadataService.getClassURI(className, IPerspectiveProvider.PerspectiveViewType.BPMN);
+		} else if (viewModel instanceof PerspectiveWelcome) {
+			String className = WelcomeView.class.getCanonicalName();
+			Bundle bundle = FrameworkUtil.getBundle(WelcomeView.class);
+			return E4Constants.BUNDLE_PROTOCOL_SCHEME+"://" + bundle.getSymbolicName() + "/" + className;
+		} else if (viewModel instanceof PerspectiveSearch) {
+			part.getTransientData().put(IPerspectiveProvider.FilterConstants.FILTER_DTO_CLASS, ((PerspectiveSearch) viewModel).getDtoRef());
+			part.getTransientData().put(IPerspectiveProvider.FilterConstants.FILTER_DEPTH, ((PerspectiveSearch) viewModel).getDepth());
+			part.getTransientData().put(IPerspectiveProvider.FilterConstants.FILTER_COLUMNS, Math.max(1, ((PerspectiveSearch) viewModel).getFilterCols()));
+			String className = SearchView.class.getCanonicalName();
+			Bundle bundle = FrameworkUtil.getBundle(SearchView.class);
+			return E4Constants.BUNDLE_PROTOCOL_SCHEME+"://" + bundle.getSymbolicName() + "/" + className;
+		} else if (viewModel instanceof PerspectiveKanban) {
+			part.getTransientData().put(IPerspectiveProvider.KanbanConstants.DTO, ((PerspectiveKanban) viewModel).getDtoRef());
+			part.getTransientData().put(IPerspectiveProvider.KanbanConstants.DIALOG, ((PerspectiveKanban) viewModel).getDialogRef());
+			part.getTransientData().put(IPerspectiveProvider.KanbanConstants.CARD, ((PerspectiveKanban) viewModel).getCardRef());
+			String className = KanbanView.class.getCanonicalName();
+			Bundle bundle = FrameworkUtil.getBundle(KanbanView.class);
+			return E4Constants.BUNDLE_PROTOCOL_SCHEME+"://" + bundle.getSymbolicName() + "/" + className;
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the FQN for the content of the view.
+	 * 
+	 * @param viewModel
+	 *            - the model of the view
+	 * @return null or the FQN
+	 */
+	private String getFQN(PerspectiveView viewModel) { // NOSONAR
+		if (viewModel instanceof PerspectiveTable) {
+			Table object = ((PerspectiveTable) viewModel).getRef();
+			TablePackage pkg = (TablePackage) object.eContainer();
+			return pkg == null ? "" : toFQN(pkg.getName(), object.getName());
+		} else if (viewModel instanceof PerspectiveSelection) {
+			Table object = ((PerspectiveSelection) viewModel).getRef();
+			TablePackage pkg = (TablePackage) object.eContainer();
+			return pkg == null ? "" : toFQN(pkg.getName(), object.getName());
+		} else if (viewModel instanceof PerspectiveGrid) {
+			Table object = ((PerspectiveGrid) viewModel).getRef();
+			TablePackage pkg = (TablePackage) object.eContainer();
+			return pkg == null ? "" : toFQN(pkg.getName(), object.getName());
+		} else if (viewModel instanceof PerspectiveBean) {
+			Table object = ((PerspectiveBean) viewModel).getRef();
+			TablePackage pkg = (TablePackage) object.eContainer();
+			return pkg == null ? "" : toFQN(pkg.getName(), object.getName());
+		} else if (viewModel instanceof PerspectiveChart) {
+			Chart object = ((PerspectiveChart) viewModel).getRef();
+			ChartPackage pkg = (ChartPackage) object.eContainer();
+			return pkg == null ? "" : toFQN(pkg.getName(), object.getName());
+		} else if (viewModel instanceof PerspectiveReport) {
+			Report object = ((PerspectiveReport) viewModel).getRef();
+			ReportPackage pkg = (ReportPackage) object.eContainer();
+			return pkg == null ? "" : toFQN(pkg.getName(), object.getName());
+		} else if (viewModel instanceof PerspectiveOrganization) {
+			Organization object = ((PerspectiveOrganization) viewModel).getRef();
+			OrganizationPackage pkg = (OrganizationPackage) object.eContainer();
+			return pkg == null ? "" : toFQN(pkg.getName(), object.getName());
+		} else if (viewModel instanceof PerspectiveTopology) {
+			Topology object = ((PerspectiveTopology) viewModel).getRef();
+			TopologyPackage pkg = (TopologyPackage) object.eContainer();
+			return pkg == null ? "" : toFQN(pkg.getName(), object.getName());
+		} else if (viewModel instanceof PerspectiveDialog) {
+			Dialog object = ((PerspectiveDialog) viewModel).getRef();
+			DialogPackage pkg = (DialogPackage) object.eContainer();
+			return pkg == null ? "" : toFQN(pkg.getName(), object.getName());
+		} else if (viewModel instanceof PerspectiveDataInterchange) {
+			DataInterchangePackage pkg = ((PerspectiveDataInterchange) viewModel).getRef();
+			return pkg == null ? "" : pkg.getName();
+		}
+		return null;
+	}
+
+	/**
+	 * Return the NS-URI for the content of the view. Used as a content type marker.
+	 *
+	 * @param viewModel
+	 *            the view model
+	 * @return the ns uri
+	 */
+	private String getNsURI(PerspectiveView viewModel) { // NOSONAR
+		if (viewModel instanceof PerspectiveTable) {
+			return TableDSLPackage.eNS_URI;
+		} else if (viewModel instanceof PerspectiveSelection) {
+			return TableDSLPackage.eNS_URI;
+		} else if (viewModel instanceof PerspectiveGrid) {
+			return TableDSLPackage.eNS_URI;
+		} else if (viewModel instanceof PerspectiveBean) {
+			return TableDSLPackage.eNS_URI;
+		} else if (viewModel instanceof PerspectiveChart) {
+			return ChartDSLPackage.eNS_URI;
+		} else if (viewModel instanceof PerspectiveReport) {
+			return ReportDSLPackage.eNS_URI;
+		} else if (viewModel instanceof PerspectiveOrganization) {
+			return OrganizationDSLPackage.eNS_URI;
+		} else if (viewModel instanceof PerspectiveTopology) {
+			return TopologyDSLPackage.eNS_URI;
+		} else if (viewModel instanceof PerspectiveDialog) {
+			return DialogDSLPackage.eNS_URI;
+		} else if (viewModel instanceof PerspectiveBPMN) {
+			return Bpmn2Package.eNS_URI;
+		} else if (viewModel instanceof PerspectiveKanban) {
+			return ExtensionModelPackage.eNS_URI;
+		} else if (viewModel instanceof PerspectiveDataInterchange) {
+			return DataDSLPackage.eNS_URI;
+		}
+		return null;
+	}
+
+	private String getFlavor(PerspectiveView viewModel) { // NOSONAR
+		if (viewModel instanceof PerspectiveTable) {
+			return "table";
+		} else if (viewModel instanceof PerspectiveGrid) {
+			return "grid";
+		} else if (viewModel instanceof PerspectiveBean) {
+			return "bean";
+		}
+		return null;
+	}
+
+	/**
+	 * To fqn.
+	 *
+	 * @param pkg
+	 *            the pkg
+	 * @param name
+	 *            the name
+	 * @return the string
+	 */
+	private String toFQN(String pkg, String name) {
+		return pkg + "." + name;
+	}
+
+	/**
+	 * Subscribe.
+	 */
+	protected void subscribe() {
+		if(taskClient != null) {
+			taskClient.registerPerspectiveListener(this);
+		}
+		createEventHandlers();
+		eventBroker.subscribe(AuthenticationConstants.Events.Authentication.PRE_LOGOUT, doLogout);
+	}
+
+	/**
+	 * Unsubscribe.
+	 */
+	@PreDestroy
+	protected void unsubscribe() {
+		taskClient.unsubscribeTaskEventNotification(this);
+		if(taskClient != null) {
+			taskClient.unregisterPerspectiveListener(this);
+		}
+	}
+
+	/**
+	 * Creates the event handlers.
+	 */
+	private void createEventHandlers() {
+		doLogout = (Event event) -> {
+			log.debug("logout pending");
+			suspendAllTasks();
+		};
+	}
+
+	/**
+	 * Suspend all pending tasks while user pressed logout or closed browser.
+	 * 
+	 */
+	private void suspendAllTasks() {
+		for (Long taskId : perspectiveTasks.keySet()) {
+			log.debug("suspend task {}", taskId);
+			taskClient.operations(taskId, user, null, BPMOperation.Suspend);
+		}
+	}
+
+	/**
+	 * Tries to find the perspective model using the perspective builder service.
+	 *
+	 * @param perspectiveId
+	 *            - the id of the perspective used in the model
+	 * @return the perspective
+	 */
+	protected PerspectiveFound findPerspective(String perspectiveId) {
+		log.debug("find perspective model by id");
+		return new PerspectiveFound(null, (Perspective) dslMetadataService.getMetadata(perspectiveId, PerspectiveDslPackage.Literals.PERSPECTIVE), null, null);
+	}
+
+	private final class PerspectiveFound {
+		public final BPMTaskSummary taskSummary;
+		public final Perspective perspective;
+		public final BlipItem blipTask;
+		public final Task bpmTask;
+
+		protected PerspectiveFound(BPMTaskSummary taskSummary, Perspective perspective, BlipItem blipTask, Task bpmTask) {
+			this.taskSummary = taskSummary;
+			this.perspective = perspective;
+			this.blipTask = blipTask;
+			this.bpmTask = bpmTask;
+		}
+	}
+
+	/**
+	 * Tries to find the perspective model using the perspective builder service.
+	 *
+	 * @param task
+	 *            the task
+	 * @return the perspective
+	 */
+	protected PerspectiveFound findPerspective(BPMTaskSummary taskSummary) {
+		log.debug("find perspective model by task");
+		for (EObject eObj : dslMetadataService.getAll(PerspectiveDslPackage.Literals.PERSPECTIVE)) {
+			if ((((Perspective) eObj).getProcess() != null) && (((Perspective) eObj).getUserTask() != null)) {
+				Process process = ((Perspective) eObj).getProcess().getProcess();
+				BlipUserTask blipTask = ((Perspective) eObj).getUserTask();
+				if ((process != null) && (process.getId().equals(taskSummary.getProcessId()))) {
+					Task bpmTask = blipTask.getTask();
+					if ((bpmTask != null) && bpmTask.getName().equals(taskSummary.getName())) {
+						return new PerspectiveFound(taskSummary, (Perspective)eObj, blipTask, bpmTask);
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Tries to find the action toolbar model using the action builder service.
+	 *
+	 * @param toolbarId
+	 *            the toolbar id
+	 * @return the action toolbar
+	 */
+	protected ActionToolbar findToolbar(String toolbarId) {
+		log.debug("find toolbar model");
+		return (ActionToolbar) dslMetadataService.getMetadata(toolbarId, ActionDSLPackage.Literals.ACTION_TOOLBAR);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.osbp.bpm.api.IBPMTaskEventNotification#notifyTaskEvent(org .jbpm.task.event.entity.TaskEventType, org.jbpm.task.event.entity.TaskUserEvent)
+	 */
+	@Override
+	public void notifyTaskEvent(BPMTaskEventType type, BPMTaskUserEvent event) {
+		closePerspective(event.getTaskId());
+	}
+
+	@Override
+	public void notifyProcessCompletedEvent() {
+		// NOP
+	}
+
+	@Override
+	public void receiveEvent(EventDispatcherEvent event) {
+		if(event.getCommand() == EventDispatcherCommand.ACTION &&
+			event.getData().containsKey(EventDispatcherDataTag.BUTTON_ID) && 
+			event.getData().get(EventDispatcherDataTag.BUTTON_ID) instanceof TaskActionEnum &&
+			event.getData().containsKey(EventDispatcherDataTag.TASK_ID) &&
+			event.getData().get(EventDispatcherDataTag.TASK_ID) instanceof Long) {
+			Object buttonId = event.getData().get(EventDispatcherDataTag.BUTTON_ID) ;
+			TaskActionEnum enumId = (TaskActionEnum) buttonId;
+			Long taskId = (Long)event.getData().get(EventDispatcherDataTag.TASK_ID);
+			if(enumId == TaskActionEnum.TASK_ACTION_DELEGATE) {
+				log.debug("dispatch action received in PerspectiveSupport for " + TaskActionEnum.TASK_ACTION_DELEGATE.getLiteral());
+			} else {
+				taskClient.operations(taskId, user, null, BPMOperation.valueOf(enumId.getLiteral()));
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.ui.api.perspective.IPerspectiveProvider#openPerspective(java.lang.String, java.lang.String, java.lang.Class)
+	 */
+	@Override
+	public void openPerspective(String elementId, String labelName, Class<?> clazz) {
+		MPerspectiveStack stack = initPerspectiveStack();
+		if(stack != null) {
+			// bring to top if already contained in model
+			for (MPerspective perspective : stack.getChildren()) {
+				if ((PerspectiveProvider.toPerspectiveElementId(elementId)).equals(perspective.getElementId())) {
+					modelService.bringToTop(perspective);
+					return;
+				}
+			}
+			MPerspective perspective = AdvancedFactoryImpl.eINSTANCE.createPerspective();
+			
+			perspective.getTags().add(IPerspectiveProvider.E4Constants.TAG_REMOVE_ON_CLOSE);
+			perspective.getTags().add(IPerspectiveProvider.E4Constants.TAG_NOT_IN_OPEN_PERSPECTIVE_DIALOG);
+			
+			perspective.setElementId(PerspectiveProvider.toPerspectiveElementId(elementId));
+			perspective.setLabel(labelName);
+			perspective.setVisible(true);
+			perspective.setToBeRendered(true);
+			perspective.setIconURI(themeResourceService.getThemeURI("osbee", ThemeResourceType.ICON));
+			MPart part = BasicFactoryImpl.eINSTANCE.createPart();
+			part.setVisible(true);
+			part.setCloseable(false);
+			perspective.getChildren().add(part);
+			String className = clazz.getCanonicalName();
+			Bundle bundle = FrameworkUtil.getBundle(clazz);
+			String contributionURI = E4Constants.BUNDLE_PROTOCOL_SCHEME+"://" + bundle.getSymbolicName() + "/" + className;
+			part.setContributionURI(contributionURI);
+			stack.getChildren().add(perspective);
+			stack.setSelectedElement(perspective);
+			modelService.bringToTop(perspective);
+		}
+	}
+
+	@Override
+	public void openPerspective(BPMTaskSummary taskSummary) {
+		// register tasksummary in context for action's TaskHelper
+		eclipseContext.set(BPMTaskSummary.class, taskSummary);
+		PerspectiveFound perspectiveFound = null;
+		log.debug("open perspective with taskId {}", taskSummary.getId());
+		perspectiveFound = findPerspective(taskSummary);
+		if (perspectiveFound != null) {
+			eventBroker.post(EventBrokerMsg.BPMNCHART_EVENT, new EventBrokerMsg(perspectiveFound.taskSummary.getProcessId(), perspectiveFound.taskSummary.getName()));
+			// notify orgachart with current user's position
+			eventBroker.post(EventBrokerMsg.ORGCHART_SELECT, user.getPosition());
+			openPerspective(perspectiveFound, taskSummary.getId());
+		} else {
+			log.error("perspective for taskid {} not found", taskSummary.getId());
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.ui.api.perspective.IPerspectiveProvider#openPerspectiveEvent(java.lang.String)
+	 */
+	@Override
+	public void openPerspective(String perspectiveId) { 
+		PerspectiveFound perspectiveFound = findPerspective(perspectiveId);
+		if(perspectiveFound != null) {
+			openPerspective(perspectiveFound, -1L);
+		} else {
+			log.error("perspective id {} not found", perspectiveId);
+		}
+	}
+
+	/**
+	 * Creates a new perspective suitable for the given task it was called from.
+	 *
+	 * @param perspectiveModel
+	 *            the perspective model
+	 * @param humanTask
+	 * @param taskSummary
+	 */
+	private void openPerspective(PerspectiveFound perspectiveFound, Long taskId) {
+		MPerspectiveStack stack = initPerspectiveStack();
+		if (stack != null && perspectiveFound.perspective != null) {
+			// bring to top if already contained in model
+			for (MPerspective perspective : stack.getChildren()) {
+				if ((PerspectiveProvider.toPerspectiveElementId(perspectiveFound.perspective.getName())).equals(perspective.getElementId())) {
+					modelService.bringToTop(perspective);
+					return;
+				}
+			}
+
+			log.debug("open perspective {}", perspectiveFound.perspective.getName());
+			log.debug("add perspective");
+			MPerspective perspective = createPerspective(stack, perspectiveFound.perspective, perspectiveFound.perspective.getName());
+			if (taskId != -1L) {
+				registerContext(perspective.getTransientData(), perspectiveFound);
+				// create the toolbar
+				if (perspectiveFound.perspective.getToolbarTypeJvm() != null) {
+					String toolBarId = perspectiveFound.perspective.getToolbarTypeJvm().getQualifiedName().replace("Toolbar", "");
+					toolbarProvider.addToolbar(perspectiveFound.perspective.getName(), findToolbar(toolBarId));
+				}
+			}
+			stack.getChildren().add(perspective);
+			stack.setSelectedElement(perspective);
+			modelService.bringToTop(perspective);
+
+			perspectives.put(perspectiveFound.perspective.getName(), perspective);
+			perspectiveTasks.put(taskId, perspectiveFound.perspective.getName());
+			// get notified from bpm
+			if(taskClient != null) {
+				taskClient.subscribeProcessCompletedEventNotification(this);
+				taskClient.subscribeTaskEventNotification(BPMTaskEventType.Release, this);
+				taskClient.subscribeTaskEventNotification(BPMTaskEventType.Complete, this);
+				taskClient.subscribeTaskEventNotification(BPMTaskEventType.Delegated, this);
+				taskClient.subscribeTaskEventNotification(BPMTaskEventType.Fail, this);
+				taskClient.subscribeTaskEventNotification(BPMTaskEventType.Skipped, this);
+				taskClient.subscribeTaskEventNotification(BPMTaskEventType.Release, this);
+				taskClient.subscribeTaskEventNotification(BPMTaskEventType.Stop, this);
+				taskClient.subscribeTaskEventNotification(BPMTaskEventType.Suspended, this);
+			}
+		}
+	}
+
+	/**
+	 * Close perspective.
+	 *
+	 * @param perspectiveId
+	 *            of the perspective to close
+	 * @param suspendTask
+	 *            is true if task should be set to susupended
+	 */
+	private void closePerspective(String perspectiveId) {
+		if (perspectiveTasks.containsValue(perspectiveId)) {
+			for (Map.Entry<Long, String> perspective : perspectiveTasks.entrySet()) {
+				if (perspective.getValue().equals(perspectiveId)) {
+					closePerspective(perspective.getKey());
+					break;
+				}
+			}
+		}
+	}
+
+	/**
+	 * Close perspective an remove from PerspectiveStack.
+	 *
+	 * @param taskId
+	 *            of the perspective to close
+	 * @param suspendTask
+	 *            is true if task should be set to susupended
+	 */
+	private void closePerspective(long taskId) {
+		if (perspectiveTasks.containsKey(taskId)) {
+			modelService.resetPerspectiveModel(perspectives.get(perspectiveTasks.get(taskId)), trimmedWindow);
+			modelService.removePerspectiveModel(perspectives.get(perspectiveTasks.get(taskId)), trimmedWindow);
+			toolbarProvider.removeToolbar(perspectiveTasks.get(taskId));
+			perspectives.remove(taskId);
+			perspectiveTasks.remove(taskId);
+		}
+	}
+
+	@Override
+	public void closePerspective(BPMTaskSummary taskSummary) {
+		log.debug("close perspective {}", taskSummary.getId());
+		// awaits a Long object as taskId
+		closePerspective(taskSummary.getId());
+	}
+}
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/SearchView.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/SearchView.java
new file mode 100644
index 0000000..0669773
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/SearchView.java
@@ -0,0 +1,112 @@
+package org.eclipse.osbp.vaaclipse.addons.softwarefactory.perspective;
+
+import java.util.Locale;
+
+import javax.annotation.PostConstruct;
+import javax.inject.Inject;
+
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.ui.di.Focus;
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent;
+import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherCommand;
+import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherDataTag;
+import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
+import org.eclipse.osbp.runtime.web.ecview.presentation.vaadin.common.FilteringComponentEmbeddable;
+import org.eclipse.osbp.ui.api.e4.IE4Dialog;
+import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
+import org.eclipse.osbp.ui.api.perspective.IPerspectiveProvider;
+import org.eclipse.osbp.ui.api.user.IUser;
+
+import com.vaadin.server.ClientConnector;
+import com.vaadin.server.ClientConnector.AttachEvent;
+import com.vaadin.server.ClientConnector.DetachEvent;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.Panel;
+import com.vaadin.ui.VerticalLayout;
+
+public class SearchView<T>
+		implements IUser.UserLocaleListener, ClientConnector.DetachListener, ClientConnector.AttachListener, IE4Dialog {
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	@Inject
+	MPart part;
+
+	@Inject
+	private IUser user;
+
+	@Inject
+	private IEventDispatcher eventDispatcher;
+
+	@Inject
+	private IDSLMetadataService dslMetadataService;
+
+	private VerticalLayout parent;
+	private FilteringComponentEmbeddable<T> filteringComponent;
+	private transient IEclipseContext context;
+
+	@Inject
+	public SearchView(VerticalLayout parent, IEclipseContext context, MApplication app) {
+		this.parent = parent;
+		this.context = context;
+	}
+
+	@SuppressWarnings("unchecked")
+	@PostConstruct
+	public void createView() {
+		context.set(IE4Dialog.class, this);
+		parent.setPrimaryStyleName("osbp");
+		parent.setId("parent");
+		parent.setSizeFull();
+		parent.addAttachListener(this);
+		parent.addDetachListener(this);
+
+		EObject eObject = (EObject) part.getTransientData().get(IPerspectiveProvider.FilterConstants.FILTER_DTO_CLASS);
+		Class<T> dto = (Class<T>) dslMetadataService.getClass(eObject, "dto");
+		int depth = (int) part.getTransientData().get(IPerspectiveProvider.FilterConstants.FILTER_DEPTH);
+		int filterCols = (int) part.getTransientData().get(IPerspectiveProvider.FilterConstants.FILTER_COLUMNS);
+		filteringComponent = new FilteringComponentEmbeddable<>(dto, depth, filterCols);
+		parent.addComponent(filteringComponent);
+		filteringComponent.setSizeFull();
+
+		filteringComponent.init(user.getLocale());
+
+		filteringComponent.setAcceptCallback(p -> {
+			EventDispatcherEvent evnt = new EventDispatcherEvent(EventDispatcherCommand.SELECT, dto.getName(),
+					getClass().getSimpleName());
+			evnt.addItem(EventDispatcherDataTag.DTO, p);
+			eventDispatcher.sendEvent(evnt);
+		});
+	}
+
+	@Override
+	public void attach(AttachEvent event) {
+		user.addUserLocaleListener(this);
+	}
+
+	@Override
+	public void detach(DetachEvent event) {
+		user.removeUserLocaleListener(this);
+	}
+
+	@Focus
+	public void setFocus() {
+		Component parent = this.parent;
+		while (!(parent instanceof Panel) && parent != null) {
+			parent = parent.getParent();
+		}
+		if (parent != null) {
+			((Panel) parent).focus();
+		}
+	}
+
+	@Override
+	public void localeChanged(Locale locale) {
+		filteringComponent.setLocale(locale);
+		filteringComponent.getViewContext().setLocale(locale);
+	}
+}
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPCommandsBinder.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPCommandsBinder.java
new file mode 100644
index 0000000..208ac00
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPCommandsBinder.java
@@ -0,0 +1,54 @@
+package org.eclipse.osbp.vaaclipse.addons.softwarefactory.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.osbp.ui.api.contextfunction.ICommandsProvider;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Component
+public class OSBPCommandsBinder {
+	private static List<ICommandsProvider> commandsProviders = new ArrayList<>();
+	/** The Constant LOGGER. */
+	private static final Logger LOGGER = LoggerFactory.getLogger("binder");
+
+	/**
+	 * Add command provider.
+	 *
+	 * @param commandsProvider
+	 *            the command provider
+	 */
+	@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
+	public synchronized void bindCommandsProvider(final ICommandsProvider commandsProvider) {
+		addCommandsProvider(commandsProvider);
+		LOGGER.debug("CommandsProvider added");
+	}
+
+	/**
+	 * Remove command provider.
+	 *
+	 * @param commandsProvider
+	 *            the command provider
+	 */
+	public synchronized void unbindCommandsProvider(final ICommandsProvider commandsProvider) {
+		removeCommandsProvider(commandsProvider);
+		LOGGER.debug("CommandsProvider removed");
+	}
+
+	public static List<ICommandsProvider> getCommandsProviders() {
+		return commandsProviders;
+	}
+
+	public static void addCommandsProvider(ICommandsProvider commandsProvider) {
+		OSBPCommandsBinder.commandsProviders.add(commandsProvider);
+	}
+
+	public static void removeCommandsProvider(ICommandsProvider commandsProvider) {
+		OSBPCommandsBinder.commandsProviders.remove(commandsProvider);
+	}
+}
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPI18nService.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPI18nService.java
new file mode 100644
index 0000000..5f82f48
--- /dev/null
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPI18nService.java
@@ -0,0 +1,82 @@
+/**
+ *                                                                            
+ * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *                                                                            
+ * All rights reserved. This program and the accompanying materials           
+ * are made available under the terms of the Eclipse Public License v1.0       
+ * which accompanies this distribution, and is available at                  
+ * http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ * Contributors:   
+ * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
+ */
+package org.eclipse.osbp.vaaclipse.addons.softwarefactory.service;
+
+import java.util.Locale;
+
+import javax.inject.Inject;
+
+import org.apache.commons.lang.math.NumberUtils;
+import org.eclipse.osbp.runtime.common.dispose.AbstractDisposable;
+import org.eclipse.osbp.runtime.common.i18n.II18nService;
+import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
+
+/**
+ * A simple I18n service implementation.
+ */
+public class OSBPI18nService extends AbstractDisposable implements II18nService {
+	private static final String VALIDATION = "javax.validation";
+	@Inject
+	private IDSLMetadataService dslMetadataService;
+
+	public OSBPI18nService() {
+		super();
+	}
+
+	public void setDSLMetadataService(IDSLMetadataService dslMetadataService) {
+		this.dslMetadataService = dslMetadataService;
+	}
+	
+	@Override
+	public String getValue(String i18nKey, Locale locale) {
+		// don't do it with numbers
+		if(NumberUtils.isNumber(i18nKey.trim())) {
+			return i18nKey;
+		}
+		if(locale == null || dslMetadataService == null) {
+			return i18nKey;
+		}
+		if(i18nKey.startsWith(VALIDATION)) {
+			String translationTemp = dslMetadataService.translate(locale.toLanguageTag(), i18nKey);
+			if (translationTemp == null) {
+				return "";
+			}
+			return translationTemp;
+		}
+		String[] splitI18nKey = i18nKey.split("\\.");
+		StringBuilder translation = new StringBuilder();
+		int bracketsToClose = 0;
+		// LIFO - Therefore starting from the last to the first
+		for (int i = splitI18nKey.length - 1; i > -1; i--) {
+			String translationTemp = dslMetadataService.translate(locale.toLanguageTag(), splitI18nKey[i]);
+			if (translationTemp == null) {
+				return "";
+			}
+			// Nested properties will be translated individually and put together
+			if (i < splitI18nKey.length - 1) {
+				translation.append("(");
+				bracketsToClose++;
+			}
+			translation.append(translationTemp);
+		}
+		for (int i = 0; i < bracketsToClose; i++) {
+			translation.append(")");
+		}
+		return translation.toString();
+	}
+
+	@Override
+	protected void internalDispose() {
+		// nothing to do
+	}
+}
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPServiceAddon.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPServiceAddon.java
index 5093959..7950348 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPServiceAddon.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPServiceAddon.java
@@ -1,19 +1,22 @@
-/**
+/*
  *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *  Copyright (c) 2011 - 2017 - Loetz GmbH & Co KG, 69115 Heidelberg, Germany 
  *                                                                            
  *  All rights reserved. This program and the accompanying materials           
  *  are made available under the terms of the Eclipse Public License v1.0       
  *  which accompanies this distribution, and is available at                  
  *  http://www.eclipse.org/legal/epl-v10.html                                 
  *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ *  Initial contribution:                                                      
+ *     Loetz GmbH & Co. KG                              
  * 
  */
 package org.eclipse.osbp.vaaclipse.addons.softwarefactory.service;
 
+import java.util.HashMap;
 import java.util.Locale;
+import java.util.Map;
+import java.util.UUID;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
@@ -22,191 +25,232 @@
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.core.contexts.RunAndTrack;
-import org.eclipse.e4.core.services.events.IEventBroker;
 import org.eclipse.e4.core.services.translation.TranslationService;
 import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.commands.MBindingContext;
+import org.eclipse.e4.ui.model.application.commands.MBindingTable;
+import org.eclipse.e4.ui.model.application.commands.impl.CommandsFactoryImpl;
 import org.eclipse.e4.ui.model.application.ui.SideValue;
+import org.eclipse.e4.ui.model.application.ui.advanced.MPerspectiveStack;
+import org.eclipse.e4.ui.model.application.ui.advanced.impl.AdvancedFactoryImpl;
 import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
 import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
 import org.eclipse.e4.ui.model.application.ui.basic.impl.BasicFactoryImpl;
 import org.eclipse.e4.ui.model.application.ui.menu.MToolControl;
 import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
-import org.eclipse.osbp.bpm.api.IBPMTaskClient;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.osbp.core.api.persistence.IPersistenceException;
+import org.eclipse.osbp.core.api.persistence.IPersistenceService;
+import org.eclipse.osbp.core.api.persistence.PersistenceExceptionEvent;
+import org.eclipse.osbp.datainterchange.api.IDataInterchange;
 import org.eclipse.osbp.dsl.metadata.service.DSLBuilderParticipant.DSLMetadataService;
 import org.eclipse.osbp.ecview.core.common.editpart.IViewEditpart;
+import org.eclipse.osbp.eventbroker.EventDispatcher;
+import org.eclipse.osbp.persistence.PersistenceService;
 import org.eclipse.osbp.preferences.ProductConfiguration;
 import org.eclipse.osbp.report.ReportProvider;
+import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
+import org.eclipse.osbp.runtime.common.i18n.II18nService;
+import org.eclipse.osbp.ui.api.contextfunction.ICommandsProvider;
+import org.eclipse.osbp.ui.api.message.IMessageRequester;
+import org.eclipse.osbp.ui.api.message.MessageEvent;
+import org.eclipse.osbp.ui.api.message.MessageEvent.EventType;
+import org.eclipse.osbp.ui.api.message.MessageRequesterEvent;
 import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
+import org.eclipse.osbp.ui.api.perspective.IPerspectiveProvider;
 import org.eclipse.osbp.ui.api.report.IReportProvider;
 import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
 import org.eclipse.osbp.ui.common.helper.ICommonUIHelper;
 import org.eclipse.osbp.ui.common.helper.impl.CommonUIHelper;
-import org.eclipse.osbp.vaaclipse.addons.softwarefactory.bpmImpl.BPMTaskClient;
+import org.eclipse.osbp.utils.vaadin.MessageDialog;
 import org.eclipse.osbp.vaaclipse.addons.softwarefactory.handler.I18NHandler;
 import org.eclipse.osbp.vaaclipse.addons.softwarefactory.handler.PrintServiceHandler;
 import org.eclipse.osbp.vaaclipse.addons.softwarefactory.handler.StrategyHandler;
 import org.eclipse.osbp.vaaclipse.addons.softwarefactory.handler.ThemeHandler;
 import org.eclipse.osbp.vaaclipse.addons.softwarefactory.handler.UserHandler;
-import org.eclipse.osbp.vaaclipse.addons.softwarefactory.perspective.PerspectiveConstants;
-import org.eclipse.osbp.vaaclipse.addons.softwarefactory.perspective.PerspectiveSupport;
+import org.eclipse.osbp.vaaclipse.addons.softwarefactory.perspective.PerspectiveProvider;
+import org.eclipse.osbp.vaaclipse.addons.softwarefactory.welcome.WelcomeView;
 import org.eclipse.osbp.vaaclipse.common.ecview.api.IECViewContainer;
+import org.eclipse.osbp.vaaclipse.publicapi.theme.ThemeEngine;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.FrameworkUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.vaadin.ui.UI;
 
-public class OSBPServiceAddon {
+@SuppressWarnings("restriction")
+public class OSBPServiceAddon implements IPersistenceException.Receiver, IMessageRequester.ClickRecipient {
 	private static final Logger log = LoggerFactory.getLogger(OSBPServiceAddon.class);
-	private PerspectiveSupport perspectiveSupport;
-	private OSBPTranslationService translationService;
-	private IBPMTaskClient taskClient;
-	private CommonUIHelper commonUIHelper;
-	private IThemeResourceService themeResourceService;
-	private IDSLMetadataService dslMetadataService;
-	private IReportProvider reportProvider;
 
 	@Inject
 	private MApplication appModel;
 
 	@Inject
-	private IEventBroker eventBroker;
+	private IApplicationContext appContext;
 
-	@SuppressWarnings("restriction")
+	@Inject
+	private ThemeEngine themeEngine;
+
+	protected Map<String, MessageDialog> messageDialogs = new HashMap<>();
+	private IDSLMetadataService dslMetadataService;
+	protected Locale addonLocale;
+
 	@PostConstruct
 	void init(IEclipseContext context) {
-		// global task client connection
-		taskClient = context.get(BPMTaskClient.class);
-		if (taskClient == null) {
-			try {
-				taskClient = ContextInjectionFactory.make(BPMTaskClient.class, context);
-				context.set(IBPMTaskClient.class, taskClient);
-			} catch (Exception e) {
-				log.error(e.getLocalizedMessage());
-			}
+		initApplicationLayoutModel();
+
+		BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext();
+		IPersistenceService persistenceService = addToContexts(context, bundleContext, IPersistenceService.class,
+				PersistenceService.class, false);
+		if (persistenceService != null) {
+			persistenceService.registerPersistenceExceptionNotification(this);
 		}
 
-		// global ui helper
-		commonUIHelper = context.get(CommonUIHelper.class);
-		if (commonUIHelper == null) {
-			try {
-				commonUIHelper = ContextInjectionFactory.make(CommonUIHelper.class, context);
-				context.set(ICommonUIHelper.class, commonUIHelper);
-			} catch (Exception e) {
-				log.error(e.getLocalizedMessage());
-			}
-		}
+		IEventDispatcher clientDispatcher = ContextInjectionFactory.make(EventDispatcher.class, context);
+		context.set(IEventDispatcher.class, clientDispatcher);
 
-		// global themeResource service
-		themeResourceService = context.get(IThemeResourceService.class);
-		if (themeResourceService == null) {
-			try {
-				themeResourceService = ContextInjectionFactory.make(ThemeResourceService.class, context);
-				context.set(IThemeResourceService.class, themeResourceService);
-			} catch (Exception e) {
-				log.error(e.getLocalizedMessage());
-			}
+		addToContexts(context, bundleContext, ICommonUIHelper.class, CommonUIHelper.class, false);
+		IThemeResourceService themeResourceService = addToContexts(context, bundleContext, IThemeResourceService.class, ThemeResourceService.class, false);
+		if(themeResourceService != null) {
+			themeResourceService.init(appContext, themeEngine);
 		}
-
-		dslMetadataService = context.get(IDSLMetadataService.class);
-		if (dslMetadataService == null) {
-			try {
-				dslMetadataService = (IDSLMetadataService) ContextInjectionFactory.make(DSLMetadataService.class, context);
-				context.set(IDSLMetadataService.class, dslMetadataService);
-			} catch (Exception e) {
-				log.error(e.getLocalizedMessage());
-			}
+		addToContexts(context, bundleContext, IReportProvider.class, ReportProvider.class, false);
+		IPerspectiveProvider perspectiveProvider = addToContexts(context, null, IPerspectiveProvider.class,
+				PerspectiveProvider.class, false);
+		dslMetadataService = addToContexts(context, bundleContext, IDSLMetadataService.class, DSLMetadataService.class,
+				false);
+		addToContexts(context, bundleContext, TranslationService.class, OSBPTranslationService.class, true);
+		addToContexts(context, bundleContext, II18nService.class, OSBPI18nService.class, true);
+		if (context.get(IDataInterchange.class) == null) {
+			log.debug("datainterchange service not present");
+		} else {
+			log.debug("datainterchange service is in context");
 		}
 
-		reportProvider = context.get(IReportProvider.class);
-		if (reportProvider == null) {
-			try {
-				reportProvider = (IReportProvider) ContextInjectionFactory.make(ReportProvider.class, context);
-				context.set(IReportProvider.class, reportProvider);
-			} catch (Exception e) {
-				log.error(e.getLocalizedMessage());
-			}
-		}
-		
-		// global translation service
-		if (context.get(TranslationService.class) != null) {
-			context.remove(TranslationService.class);
-		}
-		try {
-			translationService = ContextInjectionFactory.make(OSBPTranslationService.class, context);
-		} catch (Exception e) {
-			log.error(e.getLocalizedMessage());
-		}
-		context.set(TranslationService.class, translationService);
-
 		context.runAndTrack(new RunAndTrack() {
 			@Override
 			public boolean changed(IEclipseContext context) {
-				String locale = (String) context.get(TranslationService.LOCALE);
+				Locale locale = (Locale) context.get(TranslationService.LOCALE);
 
 				UI ui = context.get(UI.class);
-				ui.setLocale(Locale.forLanguageTag(locale));
+				ui.setLocale(locale);
+
+				OSBPServiceAddon.this.addonLocale = locale;
 
 				// update all ECViews
 				IECViewContainer container = context.get(IECViewContainer.class);
 				for (IViewEditpart ep : container.getECViews()) {
-					ep.getContext().setLocale(Locale.forLanguageTag(locale));
+					ep.getContext().setLocale(locale);
 				}
 
 				return true;
 			}
 		});
 
-		// add our standard toolcontrols
-		if (appModel != null) {
-			log.debug("appModel loaded");
-			MTrimmedWindow trimmedWindow = null;
-			if (appModel.getChildren().size() == 0) {
-				trimmedWindow = BasicFactoryImpl.eINSTANCE.createTrimmedWindow();
-				trimmedWindow.setToBeRendered(true);
-				trimmedWindow.setVisible(true);
-				appModel.getChildren().add(trimmedWindow);
-			} else {
-				trimmedWindow = (MTrimmedWindow) appModel.getChildren().get(0);
-			}
-			MTrimBar trimBar = null;
-			if (trimmedWindow.getTrimBars().size() == 0) {
-				trimBar = BasicFactoryImpl.eINSTANCE.createTrimBar();
-				trimBar.setElementId(PerspectiveConstants.E4Constants.TRIMBAR);
-				trimBar.setToBeRendered(true);
-				trimBar.setVisible(true);
-				trimBar.setSide(SideValue.TOP);
-				trimmedWindow.getTrimBars().add(trimBar);
-			} else {
-				trimBar = trimmedWindow.getTrimBars().get(0);
-			}
-			trimBar.getChildren().add(createToolControl(UserHandler.class));
-			if (ProductConfiguration.hasDemoToolsLanguage()) {
-				trimBar.getChildren().add(createToolControl(I18NHandler.class));
-			}
-			if (ProductConfiguration.hasDemoToolsStrategy()) {
-				trimBar.getChildren().add(createToolControl(StrategyHandler.class));
-			}
-			if (ProductConfiguration.hasDemoToolsTheme()) {
-				trimBar.getChildren().add(createToolControl(ThemeHandler.class));
-			}
-			if (ProductConfiguration.hasToolsPrintService()) {
-				trimBar.getChildren().add(createToolControl(PrintServiceHandler.class));
-			}
-			log.debug("toolcontrols added");
+		if (perspectiveProvider != null) {
+			perspectiveProvider.openPerspective("welcomeScreen", "Welcome", WelcomeView.class);
+		}
+	}
 
-			// global perspective service
-			perspectiveSupport = context.get(PerspectiveSupport.class);
-			if (perspectiveSupport == null) {
-				try {
-					perspectiveSupport = ContextInjectionFactory.make(PerspectiveSupport.class, context);
-					context.set(PerspectiveSupport.class, perspectiveSupport);
-				} catch (Exception e) {
-					log.error("{}", e);
-				}
-			}
+	/**
+	 * Inits the application layout model.
+	 *
+	 * @param context
+	 *            the context
+	 */
+	private void initApplicationLayoutModel() {
+		log.debug("appModel loaded");
+
+		MBindingContext bindingContext = CommandsFactoryImpl.eINSTANCE.createBindingContext();
+		bindingContext.setElementId("org.eclipse.osbp.vaaclipse.addons.contexts.dialogAndWindow");
+		appModel.getBindingContexts().add(bindingContext);
+
+		MBindingTable bindingTable = CommandsFactoryImpl.eINSTANCE.createBindingTable();
+		bindingTable.setElementId(UUID.randomUUID().toString());
+		bindingTable.setBindingContext(bindingContext);
+		appModel.getBindingTables().add(bindingTable);
+
+		// create trimmed window
+		MTrimmedWindow trimmedWindow = null;
+		if (appModel.getChildren().isEmpty()) {
+			trimmedWindow = BasicFactoryImpl.eINSTANCE.createTrimmedWindow();
+			trimmedWindow.setToBeRendered(true);
+			trimmedWindow.setVisible(true);
+			appModel.getChildren().add(trimmedWindow);
+		} else {
+			trimmedWindow = (MTrimmedWindow) appModel.getChildren().get(0);
+		}
+		trimmedWindow.setLabel(appContext.getBrandingName());
+
+		for (ICommandsProvider commandsProvider : OSBPCommandsBinder.getCommandsProviders()) {
+			commandsProvider.init(appModel);
 		}
 
+		// create perspective stack
+		if (trimmedWindow.getChildren().isEmpty()) {
+			// create perspective stack
+			MPerspectiveStack perspectiveStack = AdvancedFactoryImpl.eINSTANCE.createPerspectiveStack();
+			perspectiveStack.setElementId(IPerspectiveProvider.E4Constants.PERSPECTIVESTACK);
+			perspectiveStack.setToBeRendered(true);
+			perspectiveStack.setVisible(true);
+			trimmedWindow.getChildren().add(perspectiveStack);
+		}
+
+		// create trimbar
+		MTrimBar trimBar = null;
+		if (trimmedWindow.getTrimBars().isEmpty()) {
+			trimBar = BasicFactoryImpl.eINSTANCE.createTrimBar();
+			trimBar.setElementId(IPerspectiveProvider.E4Constants.TRIMBAR);
+			trimBar.setToBeRendered(true);
+			trimBar.setVisible(true);
+			trimBar.setSide(SideValue.TOP);
+			trimmedWindow.getTrimBars().add(trimBar);
+		} else {
+			trimBar = trimmedWindow.getTrimBars().get(0);
+		}
+
+		// add our standard toolcontrols
+		trimBar.getChildren().add(createToolControl(UserHandler.class));
+		if (ProductConfiguration.hasDemoToolsLanguage()) {
+			trimBar.getChildren().add(createToolControl(I18NHandler.class));
+		}
+		if (ProductConfiguration.hasDemoToolsStrategy()) {
+			trimBar.getChildren().add(createToolControl(StrategyHandler.class));
+		}
+		if (ProductConfiguration.hasDemoToolsTheme()) {
+			trimBar.getChildren().add(createToolControl(ThemeHandler.class));
+		}
+		if (ProductConfiguration.hasToolsPrintService()) {
+			trimBar.getChildren().add(createToolControl(PrintServiceHandler.class));
+		}
+		log.debug("toolcontrols added");
+	}
+
+	@SuppressWarnings("unchecked")
+	private <T, U> T addToContexts(IEclipseContext context, BundleContext bundleContext, Class<T> interfaceClass,
+			Class<U> implementationClass, boolean replace) {
+		if (context.get(interfaceClass) != null) {
+			if (replace) {
+				context.remove(interfaceClass);
+			} else {
+				if (bundleContext != null && bundleContext.getServiceReference(interfaceClass) == null) {
+					bundleContext.registerService(interfaceClass, context.get(interfaceClass), null);
+				}
+				return context.get(interfaceClass);
+			}
+		}
+		try {
+			T clazz = (T) ContextInjectionFactory.make(implementationClass, context);
+			context.set(interfaceClass, clazz);
+			if (bundleContext != null && bundleContext.getServiceReference(interfaceClass) == null) {
+				bundleContext.registerService(interfaceClass, clazz, null);
+			}
+			return clazz;
+		} catch (Exception e) {
+			log.error("{}", e);
+		}
+		return null;
 	}
 
 	@PreDestroy
@@ -214,10 +258,9 @@
 		log.debug("preDestroy");
 	}
 
-	@SuppressWarnings("restriction")
 	private MToolControl createToolControl(Class<?> clzz) {
 		MToolControl toolControl = MenuFactoryImpl.eINSTANCE.createToolControl();
-		toolControl.setElementId(PerspectiveConstants.E4Constants.TOOLBARCONTROLITEM_PREFIX + clzz.getSimpleName());
+		toolControl.setElementId(IPerspectiveProvider.E4Constants.TOOLBARCONTROLITEM_PREFIX + clzz.getSimpleName());
 		toolControl.setContributionURI(getClassURI(clzz.getCanonicalName()));
 		toolControl.getTags().add(clzz.getSimpleName());
 		// avoid persisting
@@ -228,7 +271,32 @@
 	}
 
 	private String getClassURI(String className) {
-		String symbolicURI = "bundleclass://" + FrameworkUtil.getBundle(this.getClass()).getHeaders().get("Bundle-SymbolicName").split(";")[0];
+		String symbolicURI = "bundleclass://"
+				+ FrameworkUtil.getBundle(this.getClass()).getHeaders().get("Bundle-SymbolicName").split(";")[0];
 		return symbolicURI + "/" + className;
 	}
+
+	public String getTranslation(String token) {
+		return dslMetadataService.translate(addonLocale.toLanguageTag(), token);
+	}
+
+	@Override
+	public void exceptionEvent(PersistenceExceptionEvent event) {
+		MessageDialog messageDialog = new MessageDialog(UUID.randomUUID().toString(), event.getMessage());
+		if (event.isOkButton()) {
+			messageDialog.addButton(getTranslation("ok"),
+					new MessageEvent(EventType.MESSAGECLOSE, messageDialog.getId()));
+			messageDialog.addButtonListener(this);
+		}
+		messageDialogs.put(messageDialog.getId(), messageDialog);
+		UI.getCurrent().addWindow(messageDialog);
+	}
+
+	@Override
+	public void messageButtonPressed(MessageRequesterEvent e) {
+		MessageDialog messageDialog = messageDialogs.get(e.getId());
+		messageDialog.close();
+		UI.getCurrent().removeWindow(messageDialog);
+		messageDialogs.remove(e.getId());
+	}
 }
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPTranslationService.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPTranslationService.java
index c210a3b..42c6f9b 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPTranslationService.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPTranslationService.java
@@ -13,7 +13,11 @@
  */
  package org.eclipse.osbp.vaaclipse.addons.softwarefactory.service;
 
+import java.lang.reflect.Array;
+import java.util.Arrays;
+import java.util.List;
 import java.util.ResourceBundle;
+import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
@@ -23,6 +27,7 @@
 public class OSBPTranslationService extends TranslationService {
 	@Inject
 	private IDSLMetadataService dslMetadataService;
+	private static final String KEYBINDING = ".keybinding.";
 	
 	@Override
 	protected String getResourceString(String key, ResourceBundle resourceBundle) {
@@ -36,7 +41,15 @@
 	}
 
 	@Override
-	public String translate(String key, String contributorURI) {
-		return(dslMetadataService.translate(super.locale, key));
+	public String translate(String i18nKey, String contributorURI) {
+		if(i18nKey.contains(KEYBINDING)) {
+			int idx = i18nKey.indexOf(KEYBINDING);
+			String translationTemp = dslMetadataService.translate(locale.toLanguageTag(), i18nKey.substring(0, idx));
+			String binding = i18nKey.substring(idx+KEYBINDING.length());
+			List<String> parts = Arrays.asList(binding.split(" "));
+			translationTemp += " "+parts.stream().map(p->dslMetadataService.translate(locale.toLanguageTag(), p)).collect(Collectors.joining("+", "(", ")"));
+			return translationTemp;
+		}
+		return(dslMetadataService.translate(super.locale.toLanguageTag(), i18nKey));
 	}
 }
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/ThemeResourceService.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/ThemeResourceService.java
index 3de252c..fee017f 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/ThemeResourceService.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/ThemeResourceService.java
@@ -25,12 +25,15 @@
 import org.eclipse.equinox.app.IApplicationContext;
 import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
 import org.eclipse.osbp.vaaclipse.publicapi.theme.ThemeEngine;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.vaadin.server.Resource;
 import com.vaadin.server.ThemeResource;
 
+@Component(immediate = true)
 public class ThemeResourceService implements IThemeResourceService {
 
 	protected static final class TypeItem {
@@ -51,13 +54,11 @@
 			put(ThemeResourceType.IMAGE, new TypeItem(ThemeResourceType.IMAGE.toString().toLowerCase() + "/", ".jpg"));
 			put(ThemeResourceType.ICON, new TypeItem(ThemeResourceType.ICON.toString().toLowerCase() + "/", ".png"));
 			put(ThemeResourceType.FLAG, new TypeItem(ThemeResourceType.FLAG.toString().toLowerCase() + "/", ".gif"));
+			put(ThemeResourceType.HTML, new TypeItem(ThemeResourceType.HTML.toString().toLowerCase() + "/", ".html"));
 		}
 	};
 
-	@Inject
 	private ThemeEngine themeEngine;
-
-	@Inject
 	private IApplicationContext appContext;
 
 	private List<String> cssUris = null;
@@ -65,8 +66,10 @@
 
 	private static final Logger LOGGER = LoggerFactory.getLogger(ThemeResourceService.class);
 	
-	@PostConstruct
-	public void init() {
+	@Override
+	public void init(IApplicationContext appContext, Object themeEngine) {
+		this.appContext = appContext;
+		this.themeEngine = (ThemeEngine)themeEngine;
 		reset();
 	}
 
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/userfilter/UserFilterContextFunction.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/userfilter/UserFilterContextFunction.java
index aee888a..5ad23c5 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/userfilter/UserFilterContextFunction.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/userfilter/UserFilterContextFunction.java
@@ -20,7 +20,6 @@
 import org.eclipse.osbp.ui.api.contextfunction.IVaadinDialogProvider;
 import org.osgi.service.component.annotations.Component;
 
-// TODO: Auto-generated Javadoc
 /**
  * The Class UserFilterMenuContextFunction.
  */
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/userfilter/UserFilterDialogProvider.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/userfilter/UserFilterDialogProvider.java
index 973b3aa..1be18e9 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/userfilter/UserFilterDialogProvider.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/userfilter/UserFilterDialogProvider.java
@@ -38,22 +38,23 @@
 import org.eclipse.osbp.authentication.account.dtos.mapper.UserAccountFilterDtoMapper;
 import org.eclipse.osbp.authentication.account.entities.UserAccount;
 import org.eclipse.osbp.authentication.account.entities.UserAccountFilter;
+import org.eclipse.osbp.core.api.persistence.IPersistenceService;
 import org.eclipse.osbp.dsl.common.datatypes.IDto;
 import org.eclipse.osbp.dsl.dto.lib.impl.DtoServiceAccess;
-import org.eclipse.osbp.dsl.dto.lib.services.IDTOServiceWithMutablePersistence;
-import org.eclipse.osbp.dsl.dto.lib.services.Query;
-import org.eclipse.osbp.dsl.dto.lib.services.filters.ILFilter;
-import org.eclipse.osbp.dsl.dto.lib.services.filters.LCompare;
-import org.eclipse.osbp.dsl.dto.lib.services.filters.LCompare.Equal;
-import org.eclipse.osbp.dsl.dto.lib.services.filters.LJoinFilter;
 import org.eclipse.osbp.dsl.semantic.common.types.LPackage;
 import org.eclipse.osbp.dsl.semantic.entity.LEntity;
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
 import org.eclipse.osbp.dsl.semantic.entity.OSBPEntityPackage;
-import org.eclipse.osbp.persistence.IPersistenceService;
+import org.eclipse.osbp.jpa.services.Query;
+import org.eclipse.osbp.jpa.services.filters.LCompare;
+import org.eclipse.osbp.jpa.services.filters.LCompare.Equal;
+import org.eclipse.osbp.jpa.services.filters.LJoinFilter;
 import org.eclipse.osbp.runtime.common.annotations.DtoUtils;
+import org.eclipse.osbp.runtime.common.filter.IDTOServiceWithMutablePersistence;
+import org.eclipse.osbp.runtime.common.filter.ILFilter;
 import org.eclipse.osbp.runtime.common.types.IBundleSpace;
 import org.eclipse.osbp.runtime.web.vaadin.common.data.BeanServiceLazyLoadingContainer;
+import org.eclipse.osbp.runtime.web.vaadin.common.data.IAlreadyLoadedItemIdProvider;
 import org.eclipse.osbp.runtime.web.vaadin.common.data.StatefulDelegatingDtoSearchService;
 import org.eclipse.osbp.ui.api.contextfunction.IVaadinDialogProvider;
 import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
@@ -77,13 +78,17 @@
 import com.vaadin.ui.Notification;
 import com.vaadin.ui.VerticalLayout;
 
-// TODO: Auto-generated Javadoc
 /**
- * The Class UserFilterDialogProvider.
+ * The Class UserFilterDialogProvider enables to inject a filter on runtime data
+ * into the dto service.
  */
-@SuppressWarnings({ "serial", "restriction" })
-public class UserFilterDialogProvider implements IVaadinDialogProvider,
-		ValueChangeListener, IUser.UserLocaleListener {
+@SuppressWarnings("restriction")
+public class UserFilterDialogProvider implements IVaadinDialogProvider, ValueChangeListener, IUser.UserLocaleListener {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
 
 	/** The persistence service. */
 	@Inject
@@ -119,22 +124,21 @@
 	private CheckBox filterCheckInvers;
 
 	/** The filter delimiter. */
-	private final String FILTER_DELIMITER = ":";
+	private static final String FILTER_DELIMITER = ":";
 
 	/** The persistence id. */
 	private String persistenceId = "authentication";
 
 	/** The emf. */
-	private EntityManagerFactory emf;
+	private transient EntityManagerFactory emf;
 
 	/** The Constant LOGGER. */
-	private static final Logger LOGGER = LoggerFactory
-			.getLogger(UserFilterDialogProvider.class);
+	private static final Logger LOGGER = LoggerFactory.getLogger(UserFilterDialogProvider.class);
 
 	/** The metadata service. */
 	@Inject
 	private IDSLMetadataService dslMetadataService;
-	
+
 	/** The user. */
 	@Inject
 	private IUser user;
@@ -144,14 +148,18 @@
 	 * class that is interested in processing a userComboBoxValueChange event
 	 * implements this interface, and the object created with that class is
 	 * registered with a component using the component's
-	 * <code>addUserComboBoxValueChangeListener<code> method. When
-	 * the userComboBoxValueChange event occurs, that object's appropriate
-	 * method is invoked.
+	 * <code>addUserComboBoxValueChangeListener<code> method. When the
+	 * userComboBoxValueChange event occurs, that object's appropriate method is
+	 * invoked.
 	 *
 	 * @see UserComboBoxValueChangeEvent
 	 */
-	private class UserComboBoxValueChangeListener implements
-			ValueChangeListener {
+	private class UserComboBoxValueChangeListener implements ValueChangeListener {
+
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 1L;
 
 		/*
 		 * (non-Javadoc)
@@ -175,14 +183,18 @@
 	 * The class that is interested in processing a entityComboBoxValueChange
 	 * event implements this interface, and the object created with that class
 	 * is registered with a component using the component's
-	 * <code>addEntityComboBoxValueChangeListener<code> method. When
-	 * the entityComboBoxValueChange event occurs, that object's appropriate
-	 * method is invoked.
+	 * <code>addEntityComboBoxValueChangeListener<code> method. When the
+	 * entityComboBoxValueChange event occurs, that object's appropriate method
+	 * is invoked.
 	 *
 	 * @see EntityComboBoxValueChangeEvent
 	 */
-	private class EntityComboBoxValueChangeListener implements
-			ValueChangeListener {
+	private class EntityComboBoxValueChangeListener implements ValueChangeListener {
+
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 1L;
 
 		/*
 		 * (non-Javadoc)
@@ -196,16 +208,151 @@
 			filterField.setContainerDataSource(null);
 			LEntity entityFieldValue = (LEntity) entityField.getValue();
 			if (entityFieldValue != null) {
-				for (LEntityAttribute entityAttr : entityFieldValue
-						.getAllAttributes()) {
+				for (LEntityAttribute entityAttr : entityFieldValue.getAllAttributes()) {
 					if (entityAttr.isDomainKey()) {
-						filterField.setItemCaptionPropertyId(entityAttr
-								.getName());
+						filterField.setItemCaptionPropertyId(entityAttr.getName());
 						fillfilterComboBox(entityFieldValue);
 					}
 				}
 			}
 		}
+
+		/**
+		 * Fillfilter combo box.
+		 *
+		 * @param entity
+		 *            the entity
+		 */
+		private void fillfilterComboBox(LEntity entity) {
+			String fqnDto = EntityUtils.getDtoFQNForLEntity(entity);
+			try {
+				@SuppressWarnings("unchecked")
+				Class<IDto> dtoClass = (Class<IDto>) bundleSpace.forName(fqnDto);
+				// IMPORTANT!!!! DO NOT REMOVE!!!!
+				// Required to avoid NullPointerException trying to read data
+				// from BeanServiceLazyLoadingContainer<Object> datasource.
+				// Without this registration the
+				// IDTOServiceWithMutablePersistence<Object> service (being
+				// instance of AbstractDTOService) has 'null' as
+				// EntityManagerFactory.
+				persistenceService.registerPersistenceUnit(entity.getPersistenceUnit(), dtoClass);
+				IDTOServiceWithMutablePersistence<IDto> service = (IDTOServiceWithMutablePersistence<IDto>) DtoServiceAccess
+						.getService(dtoClass);
+				StatefulDelegatingDtoSearchService<IDto> loadingService = new StatefulDelegatingDtoSearchService<>(
+						service, dtoClass);
+				BeanServiceLazyLoadingContainer<? extends IDto> datasource = new BeanServiceLazyLoadingContainer<>(
+						loadingService, dtoClass, null);
+				int size1 = filterField.getItemIds().size();
+				filterField.setContainerDataSource(datasource);
+				int size2 = filterField.getItemIds().size();
+				if (size1 == 0 && size2 > 0) {
+					filterSelectAll.setEnabled(true);
+					filterSelectNone.setEnabled(true);
+				}
+				// optional preselect
+				preSelectFilter();
+			} catch (ClassNotFoundException e) {
+				LOGGER.error("{}", e);
+			}
+		}
+
+		/**
+		 * Pre select filter.
+		 */
+		private void preSelectFilter() {
+			// New empty list for the old selected and persisted filters that
+			// will
+			// be preselected.
+			final Set<IDto> selectedFilters = new HashSet<>();
+			// Searching for candidates for preselection
+			for (UserAccountFilterDto accountFilterDto : getFilters()) {
+				String filter = accountFilterDto.getFilter();
+				String filterId = getFilterId(filter);
+				String filterEntity = getFilterEntity(filter);
+				@SuppressWarnings("unchecked")
+				Collection<IDto> items = (Collection<IDto>) filterField.getContainerDataSource().getItemIds();
+				String entityDtoName = EntityUtils.getQualifiedDtoNameForQualifiedEntityName(filterEntity);
+				for (IDto dto : items) {
+					// Excluding not existing entities within the filters in
+					// UserAccountFilter
+					if (dto.getClass().getName().equals(entityDtoName)) { // NOSONAR
+						// selection of the inverse check-box
+						boolean inversValue = accountFilterDto.getInvers();
+						if (filterCheckInvers.getValue() != inversValue) {
+							filterCheckInvers.setValue(inversValue);
+						}
+						// Identify the entity candidates comparing their ID
+						// with
+						// the persisted ID within the filter in
+						// UserAccountFilter
+						Object idValue = DtoUtils.getIdValue(dto);
+						if (idValue instanceof Integer) {
+							if (new Integer(filterId).equals((Integer) idValue)) {
+								selectedFilters.add(dto);
+							}
+						} else {
+							if (filterId.equals(idValue)) {
+								selectedFilters.add(dto);
+							}
+						}
+					}
+				}
+			}
+			// selection of the filter
+			filterField.setValue(selectedFilters);
+		}
+
+		/**
+		 * Gets the filter id.
+		 *
+		 * @param filter
+		 *            the filter
+		 * @return the filter id
+		 */
+		private String getFilterId(String filter) {
+			String[] splittedFilter = filter.split(FILTER_DELIMITER);
+			if (splittedFilter.length > 1) {
+				return splittedFilter[1];
+			}
+			return "";
+		}
+
+		/**
+		 * Gets the filter entity.
+		 *
+		 * @param filter
+		 *            the filter
+		 * @return the filter entity
+		 */
+		private String getFilterEntity(String filter) {
+			String[] splittedFilter = filter.split(FILTER_DELIMITER);
+			if (splittedFilter.length > 0) {
+				return splittedFilter[0];
+			}
+			return "";
+		}
+
+		/**
+		 * Gets the filters.
+		 *
+		 * @return the filters
+		 */
+		private Collection<UserAccountFilterDto> getFilters() {
+			// UserAccount
+			UserAccountDto userDto = (UserAccountDto) userField.getValue();
+			// create UserAccountDTOService
+			IDTOServiceWithMutablePersistence<UserAccountFilterDto> service = (IDTOServiceWithMutablePersistence<UserAccountFilterDto>) DtoServiceAccess
+					.getService(UserAccountFilterDto.class);
+			// find all useraccountfilter elements with the reference to the
+			// providing user account id.
+			ILFilter filter = null;
+			if (userDto != null) {
+				Equal idCompareFilter = new LCompare.Equal("id", userDto.getId());
+				filter = new LJoinFilter("userAccount", idCompareFilter);
+			}
+			return service.find(new Query(filter));
+		}
+
 	}
 
 	/**
@@ -213,14 +360,19 @@
 	 * that is interested in processing a filterValueChange event implements
 	 * this interface, and the object created with that class is registered with
 	 * a component using the component's
-	 * <code>addFilterValueChangeListener<code> method. When
-	 * the filterValueChange event occurs, that object's appropriate
-	 * method is invoked.
+	 * <code>addFilterValueChangeListener<code> method. When the
+	 * filterValueChange event occurs, that object's appropriate method is
+	 * invoked.
 	 *
 	 * @see FilterValueChangeEvent
 	 */
 	private class FilterValueChangeListener implements ValueChangeListener {
 
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 1L;
+
 		/*
 		 * (non-Javadoc)
 		 * 
@@ -244,14 +396,19 @@
 	 * class that is interested in processing a filterSelectAllClick event
 	 * implements this interface, and the object created with that class is
 	 * registered with a component using the component's
-	 * <code>addFilterSelectAllClickListener<code> method. When
-	 * the filterSelectAllClick event occurs, that object's appropriate
-	 * method is invoked.
+	 * <code>addFilterSelectAllClickListener<code> method. When the
+	 * filterSelectAllClick event occurs, that object's appropriate method is
+	 * invoked.
 	 *
 	 * @see FilterSelectAllClickEvent
 	 */
 	private class FilterSelectAllClickListener implements ClickListener {
 
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 1L;
+
 		/*
 		 * (non-Javadoc)
 		 * 
@@ -272,14 +429,19 @@
 	 * class that is interested in processing a filterSelectNoneClick event
 	 * implements this interface, and the object created with that class is
 	 * registered with a component using the component's
-	 * <code>addFilterSelectNoneClickListener<code> method. When
-	 * the filterSelectNoneClick event occurs, that object's appropriate
-	 * method is invoked.
+	 * <code>addFilterSelectNoneClickListener<code> method. When the
+	 * filterSelectNoneClick event occurs, that object's appropriate method is
+	 * invoked.
 	 *
 	 * @see FilterSelectNoneClickEvent
 	 */
 	private class FilterSelectNoneClickListener implements ClickListener {
 
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 1L;
+
 		/*
 		 * (non-Javadoc)
 		 * 
@@ -299,14 +461,18 @@
 	 * The listener interface for receiving saveClick events. The class that is
 	 * interested in processing a saveClick event implements this interface, and
 	 * the object created with that class is registered with a component using
-	 * the component's <code>addSaveClickListener<code> method. When
-	 * the saveClick event occurs, that object's appropriate
-	 * method is invoked.
+	 * the component's <code>addSaveClickListener<code> method. When the
+	 * saveClick event occurs, that object's appropriate method is invoked.
 	 *
 	 * @see SaveClickEvent
 	 */
 	private class SaveClickListener implements ClickListener {
 
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 1L;
+
 		/*
 		 * (non-Javadoc)
 		 * 
@@ -318,6 +484,78 @@
 		public void buttonClick(ClickEvent event) {
 			updateUserAccountFilterTable();
 		}
+
+		/**
+		 * Update user account filter table.
+		 */
+		private void updateUserAccountFilterTable() {
+			EntityManager em = emf.createEntityManager();
+			em.getTransaction().begin();
+			criteriaDeleteAndUpdate(em);
+			em.getTransaction().commit();
+			em.close();
+		}
+
+		/**
+		 * Criteria delete and update.
+		 *
+		 * @param em
+		 *            the entity manager factory
+		 */
+		private void criteriaDeleteAndUpdate(EntityManager em) {
+			UserAccountDto userDto = (UserAccountDto) userField.getValue();
+			CriteriaBuilder cb = em.getCriteriaBuilder();
+
+			// delete all existing entries as prerequisite for the following
+			// update
+			// of the user account
+			CriteriaDelete<UserAccountFilter> delete = cb.createCriteriaDelete(UserAccountFilter.class);
+			// set the root class
+			Root<UserAccountFilter> userAccountFilterRootDelete = delete.from(UserAccountFilter.class);
+			Join<UserAccountFilter, UserAccount> uaJoin = userAccountFilterRootDelete.join("userAccount",
+					JoinType.LEFT);
+			// set where clause
+			Predicate cbEqualId = cb.equal(uaJoin.get("id"), userDto.getId());
+			String likeString = EntityUtils.getFQNForLEntity((LEntity) entityField.getValue()) + FILTER_DELIMITER + "%";
+			Predicate cbLikeEntity = cb.like(userAccountFilterRootDelete.get("filter"), likeString);
+			delete.where(cb.and(cbEqualId, cbLikeEntity));
+			// perform delete
+			em.createQuery(delete).executeUpdate();
+
+			// create an empty userAccount and set only the id.
+			UserAccountDtoMapper<UserAccountDto, UserAccount> userAccountMapper = new UserAccountDtoMapper<>();
+			UserAccount userAccount = userAccountMapper.createEntity();
+			userAccount.setId(userDto.getId());
+
+			UserAccountFilterDtoMapper<UserAccountFilterDto, UserAccountFilter> userAccountFilterMapper = new UserAccountFilterDtoMapper<>();
+
+			// creation of all the required data to insert
+			LEntity entityValue = ((LEntity) entityField.getValue());
+			EObject container = entityValue.eContainer();
+			if (container != null && container instanceof LPackage) {
+				LPackage pckg = (LPackage) container;
+				String pckgName = pckg.getName();
+				String fqn = pckgName + "." + entityValue.getName();
+				@SuppressWarnings("unchecked")
+				Collection<IDto> keys = (Collection<IDto>) filterField.getValue();
+
+				// add new entries for this user
+				for (IDto dto : keys) {
+					Object idValue = DtoUtils.getValue(dto, entityValue.getPrimaryKeyAttribute().getName());
+					String filterValue = fqn + FILTER_DELIMITER + idValue;
+					// create userAccountFilter entity
+					UserAccountFilter userAccountFilter = userAccountFilterMapper.createEntity();
+					userAccountFilter.setId(java.util.UUID.randomUUID().toString());
+					userAccountFilter.setFilter(filterValue);
+					userAccountFilter.setInvers(filterCheckInvers.getValue());
+					userAccountFilter.setUserAccount(userAccount);
+					// persist the userAccountFilter entity
+					em.persist(userAccountFilter);
+				}
+				Notification.show("SAVED", "The " + keys.size() + " filter were successfully saved.",
+						Notification.Type.HUMANIZED_MESSAGE);
+			}
+		}
 	}
 
 	/*
@@ -329,16 +567,18 @@
 	 */
 	@Override
 	public void valueChange(ValueChangeEvent event) {
-		if (userField.getValue() != null && entityField.getValue() != null
-				&& (filterField.getValue() != null)) {
+		if (userField.getValue() != null && entityField.getValue() != null && (filterField.getValue() != null)) {
 			save.setEnabled(true);
 		} else {
 			save.setEnabled(false);
 		}
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.osbp.ui.api.contextfunction.IUserFilterDialogProvider#getDialog()
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.osbp.ui.api.contextfunction.IUserFilterDialogProvider#
+	 * getDialog()
 	 */
 	@Override
 	public Component getDialog() {
@@ -353,8 +593,7 @@
 	@PostConstruct
 	public void init() {
 		// Registration of class loader as required for the persistence service.
-		persistenceService.registerPersistenceUnit(persistenceId,
-				UserAccountFilter.class);
+		persistenceService.registerPersistenceUnit(persistenceId, UserAccountFilter.class);
 		emf = persistenceService.getEntityManagerFactory(persistenceId);
 	}
 
@@ -364,6 +603,7 @@
 	 * @param parent
 	 *            the parent
 	 */
+	@SuppressWarnings("serial")
 	@Override
 	public void createView(VerticalLayout parent) {
 		parent.setSpacing(true);
@@ -372,13 +612,13 @@
 		parent.setPrimaryStyleName("osbp");
 
 		HorizontalLayout comboArea = new HorizontalLayout();
-		comboArea.addStyleName("loginUserArea");
+		comboArea.addStyleName("userFilterComboArea");
 		comboArea.setSizeFull();
 		comboArea.setMargin(true);
 		parent.addComponent(comboArea);
 
 		HorizontalLayout dataArea = new HorizontalLayout();
-		dataArea.addStyleName("loginLoginArea");
+		dataArea.addStyleName("userFilterDataArea");
 		dataArea.setSizeFull();
 		dataArea.setMargin(true);
 		parent.addComponent(dataArea);
@@ -395,8 +635,7 @@
 		comboArea.addComponent(entityField);
 
 		HorizontalLayout buttonArea = new HorizontalLayout();
-		buttonArea.setId("loginButtonArea");
-		buttonArea.addStyleName("loginButtonArea");
+		buttonArea.addStyleName("userFilterButtonArea");
 		buttonArea.setSizeFull();
 		buttonArea.setMargin(true);
 		parent.addComponent(buttonArea);
@@ -423,7 +662,15 @@
 		save.setEnabled(false);
 		buttonArea.addComponent(save);
 
-		filterField = new ListSelect();
+		filterField = new ListSelect() {
+			@Override
+			public Collection<?> getVisibleItemIds() {
+				if (getContainerDataSource() instanceof IAlreadyLoadedItemIdProvider) {
+					return ((IAlreadyLoadedItemIdProvider<?>) getContainerDataSource()).getAlreadyLoadedItemIds();
+				}
+				return super.getVisibleItemIds();
+			}
+		};
 		filterField.setValue("entry to filter");
 		filterField.setImmediate(true);
 		filterField.setMultiSelect(true);
@@ -436,8 +683,7 @@
 		userField.addValueChangeListener(this);
 		userField.addValueChangeListener(new UserComboBoxValueChangeListener());
 		entityField.addValueChangeListener(this);
-		entityField
-				.addValueChangeListener(new EntityComboBoxValueChangeListener());
+		entityField.addValueChangeListener(new EntityComboBoxValueChangeListener());
 		filterField.addValueChangeListener(this);
 		filterField.addValueChangeListener(new FilterValueChangeListener());
 		filterSelectAll.addClickListener(new FilterSelectAllClickListener());
@@ -479,343 +725,22 @@
 	 * Fill entity combo box content.
 	 */
 	private void fillEntityComboBoxContent() {
-		List<LEntity> result = new ArrayList<LEntity>();
-		for(EObject eObj:dslMetadataService.getAll(OSBPEntityPackage.Literals.LENTITY)) {
-			result.add((LEntity)eObj);
+		List<LEntity> result = new ArrayList<>();
+		for (EObject eObj : dslMetadataService.getAll(OSBPEntityPackage.Literals.LENTITY)) {
+			LEntity entity = (LEntity) eObj;
+			if (!entity.isMappedSuperclass() && !entity.getPersistenceUnit().equals("authentication")
+					&& !entity.getPersistenceUnit().equals("blob")) {
+				result.add(entity);
+			}
 		}
 		entityField.setCollection(result);
 	}
 
-	/**
-	 * Fillfilter combo box.
-	 *
-	 * @param entity
-	 *            the entity
-	 */
-	private void fillfilterComboBox(LEntity entity) {
-		String fqnDto = EntityUtils.getDtoFQNForLEntity(entity);
-		try {
-			@SuppressWarnings("unchecked")
-			Class<Object> dtoClass = (Class<Object>) bundleSpace
-					.forName(fqnDto);
-			// IMPORTANT!!!! DO NOT REMOVE!!!!
-			// Required to avoid NullPointerException trying to read data from BeanServiceLazyLoadingContainer<Object> datasource.
-			// Without this registration the IDTOServiceWithMutablePersistence<Object> service (being instance of AbstractDTOService) has 'null' as EntityManagerFactory.
-		    persistenceService.registerPersistenceUnit(entity.getPersistenceUnit(), dtoClass);
-			IDTOServiceWithMutablePersistence<Object> service = (IDTOServiceWithMutablePersistence<Object>) DtoServiceAccess
-					.getService(dtoClass);
-			StatefulDelegatingDtoSearchService<Object> loadingService = new StatefulDelegatingDtoSearchService<>(
-					service, dtoClass);
-			BeanServiceLazyLoadingContainer<Object> datasource = new BeanServiceLazyLoadingContainer<>(
-					loadingService, dtoClass, null);
-			int size1 = filterField.getItemIds().size();
-			filterField.setContainerDataSource(datasource);
-			int size2 = filterField.getItemIds().size();
-			if (size1 == 0 && size2 > 0) {
-				filterSelectAll.setEnabled(true);
-				filterSelectNone.setEnabled(true);
-			}
-			// optional preselect
-			preSelectFilter();
-		} catch (ClassNotFoundException e) {
-			LOGGER.error("{}", e);
-		}
-	}
-
-	/**
-	 * Pre select filter.
-	 */
-	private void preSelectFilter() {
-		// New empty list for the old selected and persisted filters that will
-		// be preselected.
-		final Set<IDto> selectedFilters = new HashSet<IDto>();
-		// Searching for candidates for preselection
-		for (UserAccountFilterDto accountFilterDto : getFilters()) {
-			String filter = accountFilterDto.getFilter();
-			String filterId = getFilterId(filter);
-			String filterEntity = getFilterEntity(filter);
-			@SuppressWarnings("unchecked")
-			Collection<IDto> items = (Collection<IDto>) filterField
-					.getContainerDataSource().getItemIds();
-			LEntity entityValue = (LEntity) entityField.getValue();
-			String entityDtoName = EntityUtils
-					.getQualifiedDtoNameForQualifiedEntityName(filterEntity);
-			for (IDto dto : items) {
-				String dtoName = dto.getClass().getName();
-				// Excluding not existing entities within the filters in
-				// UserAccountFilter
-				if (!dtoName.equals(entityDtoName)) {
-					break;
-				} else {
-					// Preselection of the invers checkbox
-					boolean inversValue = accountFilterDto.getInvers();
-					if (filterCheckInvers.getValue() != inversValue) {
-						filterCheckInvers.setValue(inversValue);
-					}
-					// Identify the entity candidates comparing their ID with
-					// the persisted ID within the filter in UserAccountFilter
-					Object idValue = DtoUtils.getValue(dto,
-							getIdName(entityValue));
-					// In case that the id is a Integer it has to be transformed
-					// into String to be compare with the id of the filter.
-					if (idValue instanceof Integer) {
-						idValue = String.valueOf(idValue);
-					}
-					if (filterId.equals(idValue)) {
-						selectedFilters.add(dto);
-					}
-				}
-			}
-			System.out.println();
-		}
-		// preseletion of the filter
-		filterField.setValue(selectedFilters);
-	}
-
-	/**
-	 * Gets the filter id.
-	 *
-	 * @param filter
-	 *            the filter
-	 * @return the filter id
-	 */
-	private String getFilterId(String filter) {
-		String[] splittedFilter = filter.split(FILTER_DELIMITER);
-		if (splittedFilter.length > 1) {
-			return splittedFilter[1];
-		}
-		return "";
-	}
-
-	/**
-	 * Gets the filter entity.
-	 *
-	 * @param filter
-	 *            the filter
-	 * @return the filter entity
-	 */
-	private String getFilterEntity(String filter) {
-		String[] splittedFilter = filter.split(FILTER_DELIMITER);
-		if (splittedFilter.length > 0) {
-			return splittedFilter[0];
-		}
-		return "";
-	}
-
-	/**
-	 * Gets the filters.
-	 *
-	 * @return the filters
-	 */
-	private Collection<UserAccountFilterDto> getFilters() {
-		// UserAccount
-		UserAccountDto user = (UserAccountDto) userField.getValue();
-		// create UserAccountDTOService
-		IDTOServiceWithMutablePersistence<UserAccountFilterDto> service = (IDTOServiceWithMutablePersistence<UserAccountFilterDto>) DtoServiceAccess
-				.getService(UserAccountFilterDto.class);
-		// find all useraccountfilter elements with the reference to the
-		// providing user account id.
-		ILFilter filter = null;
-		if (user != null) {
-			Equal idCompareFilter = new LCompare.Equal("id", user.getId());
-			filter = new LJoinFilter("userAccount", idCompareFilter);
-		}
-		Collection<UserAccountFilterDto> userAccountFilters = service
-				.find(new Query(filter));
-
-		return userAccountFilters;
-	}
-
-	/**
-	 * Update user account filter table.
-	 */
-	private void updateUserAccountFilterTable() {
-		// UserAccountDto user = (UserAccountDto) userField.getValue();
-		// JvmType type = getJvmTypeFromUserDto(user);
-		EntityManager em = emf.createEntityManager();
-		// create a new transaction
-		em.getTransaction().begin();
-
-		// Native - Solution
-		// nativeDeleteAndUpdate(em);
-
-		// CriteriaBuilder - Solution
-		criteriaDeleteAndUpdate(em);
-
-		// JPQL - Solution
-		// jpqlDeleteAnUpdate(em);
-
-		em.getTransaction().commit();
-		em.close();
-	}
-
-	/**
-	 * Jpql delete an update.
-	 *
-	 * @param em
-	 *            the em
-	 */
-	@SuppressWarnings("unused")
-	private void jpqlDeleteAnUpdate(EntityManager em) {
-		// ########## NOT EXISTING. This are only not working tests.
-		// javax.persistence.Query query =
-		// em.createQuery("FROM CCNG.USER_ACCOUNT_FILTER AS u WHERE u.USER_ACCOUNT_ID = '"
-		// + ((UserAccountDto)userField.getValue()).getId() + "'");
-		// javax.persistence.Query query =
-		// em.createQuery("SELECT filter.filter FROM CCNG.USER_ACCOUNT_FILTER filter");
-		// javax.persistence.Query query =
-		// em.createNativeQuery("SELECT ID FROM CCNG.USER_ACCOUNT_FILTER WHERE USER_ACCOUNT_ID = '"
-		// + ((UserAccountDto)userField.getValue()).getId() + "'");
-		// for (Object resultElement : query.getResultList()) {
-		// System.out.println("resultElement: " + resultElement);
-		// } ;
-	}
-
-	/**
-	 * Criteria delete and update.
-	 *
-	 * @param em
-	 *            the em
-	 */
-	private void criteriaDeleteAndUpdate(EntityManager em) {
-		UserAccountDto user = (UserAccountDto) userField.getValue();
-		CriteriaBuilder cb = em.getCriteriaBuilder();
-
-		// delete all existing entries as prerequisite for the following update
-		// of the user account
-		// create delete criteria
-		CriteriaDelete<UserAccountFilter> delete = cb
-				.createCriteriaDelete(UserAccountFilter.class);
-		// set the root class
-		Root<UserAccountFilter> userAccountFilterRootDelete = delete
-				.from(UserAccountFilter.class);
-		Join<UserAccountFilter, UserAccount> uaJoin = userAccountFilterRootDelete
-				.join("userAccount", JoinType.LEFT);
-		// set where clause
-		Predicate cbEqualId = cb.equal(uaJoin.get("id"), user.getId());
-		String likeString = EntityUtils.getFQNForLEntity((LEntity) entityField
-				.getValue()) + FILTER_DELIMITER + "%";
-		Predicate cbLikeEntity = cb.like(
-				userAccountFilterRootDelete.get("filter"), likeString);
-		delete.where(cb.and(cbEqualId, cbLikeEntity));
-
-		// perform delete
-		@SuppressWarnings("unused")
-		int deleteResult = em.createQuery(delete).executeUpdate();
-
-		// create an empty userAccount and set only the id.
-		UserAccountDtoMapper<UserAccountDto, UserAccount> userAccountMapper = new UserAccountDtoMapper<>();
-		UserAccount userAccount = userAccountMapper.createEntity();
-		userAccount.setId(user.getId());
-
-		UserAccountFilterDtoMapper<UserAccountFilterDto, UserAccountFilter> userAccountFilterMapper = new UserAccountFilterDtoMapper<>();
-
-		// creation of all the required data to insert
-		LEntity entityValue = ((LEntity) entityField.getValue());
-		EObject container = entityValue.eContainer();
-		if (container != null && container instanceof LPackage) {
-			LPackage pckg = (LPackage) container;
-			String pckgName = pckg.getName();
-			String fqn = pckgName + "." + entityValue.getName();
-			@SuppressWarnings("unchecked")
-			Collection<IDto> keys = (Collection<IDto>) filterField.getValue();
-
-			// add new entries for this user
-			for (IDto dto : keys) {
-				Object idValue = DtoUtils.getValue(dto, getIdName(entityValue));
-				String filterValue = fqn + FILTER_DELIMITER + idValue;
-				// create userAccountFilter entity
-				UserAccountFilter userAccountFilter = userAccountFilterMapper
-						.createEntity();
-				userAccountFilter.setId(java.util.UUID.randomUUID().toString());
-				userAccountFilter.setFilter(filterValue);
-				userAccountFilter.setInvers(filterCheckInvers.getValue());
-				userAccountFilter.setUserAccount(userAccount);
-				// persist the userAccountFilter entity
-				em.persist(userAccountFilter);
-			}
-			Notification.show("SAVED", "The " + keys.size()
-					+ " filter were successfully saved.",
-					Notification.Type.HUMANIZED_MESSAGE);
-		}
-
-	}
-
-	/**
-	 * Native delete and update.
-	 *
-	 * @param em
-	 *            the em
-	 */
-	@SuppressWarnings("unused")
-	private void nativeDeleteAndUpdate(EntityManager em) {
-		UserAccountDto user = (UserAccountDto) userField.getValue();
-		// NativeQuery - Solution
-		// delete all existing entries for the updating user account
-		javax.persistence.Query query = em
-				.createNativeQuery("DELETE FROM CCNG.USER_ACCOUNT_FILTER WHERE USER_ACCOUNT_ID = '"
-						+ user.getId() + "'");
-		int deleteResult = query.executeUpdate();
-
-		// creation of all the required data to insert
-		LEntity entityValue = ((LEntity) entityField.getValue());
-		EObject container = entityValue.eContainer();
-		if (container != null && container instanceof LPackage) {
-			LPackage pckg = (LPackage) container;
-			String pckgName = pckg.getName();
-			String fqn = pckgName + "." + entityValue.getName();
-			@SuppressWarnings("unchecked")
-			Collection<IDto> keys = (Collection<IDto>) filterField.getValue();
-
-			// add new entries for this user
-			for (IDto dto : keys) {
-				Object idValue = DtoUtils.getValue(dto, getIdName(entityValue));
-				String filterValue = fqn + ":" + idValue;
-				query = em
-						.createNativeQuery("INSERT INTO CCNG.USER_ACCOUNT_FILTER (ID, FILTER, USER_ACCOUNT_ID, INVERS) VALUES (sys_guid(), '"
-								+ filterValue
-								+ "', '"
-								+ user.getId()
-								+ "',  "
-								+ getInversValue(filterCheckInvers.getValue())
-								+ ")");
-				int updateResult = query.executeUpdate();
-				System.out.println();
-			}
-		}
-
-	}
-
-	/**
-	 * Gets the invers value.
-	 *
-	 * @param value
-	 *            the value
-	 * @return the invers value
-	 */
-	private int getInversValue(Boolean value) {
-		return value ? 1 : 0;
-	}
-
-	/**
-	 * Gets the id name.
-	 *
-	 * @param entity
-	 *            the entity
-	 * @return the id name
-	 */
-	//
-	private String getIdName(LEntity entity) {
-		for (LEntityAttribute attr : entity.getAllAttributes()) {
-			if (attr.isId() || attr.isUuid()) {
-				return attr.getName();
-			}
-		}
-		return "";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.osbp.vaaclipse.publicapi.authentication.IUser.UserLocaleListener#localeChanged(java.util.Locale)
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.osbp.vaaclipse.publicapi.authentication.IUser.
+	 * UserLocaleListener#localeChanged(java.util.Locale)
 	 */
 	@Override
 	public void localeChanged(Locale locale) {
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/welcome/WelcomeView.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/welcome/WelcomeView.java
index c567a9d..d7e845a 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/welcome/WelcomeView.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/welcome/WelcomeView.java
@@ -11,52 +11,75 @@
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
  * 
  */
- package org.eclipse.osbp.vaaclipse.addons.softwarefactory.welcome;
+package org.eclipse.osbp.vaaclipse.addons.softwarefactory.welcome;
 
-import com.vaadin.shared.ui.label.ContentMode;
-import com.vaadin.ui.Label;
-import com.vaadin.ui.VerticalLayout;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.URL;
 import javax.inject.Inject;
+
 import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.osbp.preferences.ProductConfiguration;
 
-@SuppressWarnings("restriction")
-public class WelcomeView {
+import com.vaadin.event.LayoutEvents.LayoutClickEvent;
+import com.vaadin.event.LayoutEvents.LayoutClickListener;
+import com.vaadin.shared.MouseEventDetails.MouseButton;
+import com.vaadin.shared.ui.label.ContentMode;
+import com.vaadin.ui.AbstractComponent;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.RichTextArea;
+import com.vaadin.ui.VerticalLayout;
 
-	private Label label;
-	
+public class WelcomeView implements LayoutClickListener {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	private int clickHit = 0;
+	private boolean editMode = false;
+	private AbstractComponent label = null;
+	private VerticalLayout parent;
+
 	@Inject
-	public WelcomeView(VerticalLayout parent, IEclipseContext context,
-			MApplication app) {
+	public WelcomeView(VerticalLayout parent, IEclipseContext context, MApplication app) {
+		this.parent = parent;
 		parent.addStyleName("os-welcome");
-		label = new Label("", ContentMode.HTML);
+		parent.addLayoutClickListener(this);
+		renderView(parent);
+	}
+
+	private void renderView(VerticalLayout parent) {
+		if (label != null) {
+			parent.removeComponent(label);
+		}
+		if (editMode) {
+			label = new RichTextArea();
+		} else {
+			label = new Label("", ContentMode.HTML);
+		}
 		label.setSizeFull();
 		parent.addComponent(label);
 		parent.setMargin(true);
-		
-		label.setValue(readHTML());
+		if (editMode) {
+			((RichTextArea) label).setValue(ProductConfiguration.getWelcomeScreen());
+		} else {
+			((Label) label).setValue(ProductConfiguration.getWelcomeScreen());
+		}
 	}
 
-	private String readHTML() {
-		URL url = getClass().getResource("Welcome.html");
-
-		try {
-			BufferedReader reader = new BufferedReader(new InputStreamReader(
-					url.openStream()));
-
-			StringBuilder builder = new StringBuilder();
-			while (reader.ready()) {
-				builder.append(reader.readLine());
-				builder.append("\n");
+	@Override
+	public void layoutClick(LayoutClickEvent event) {
+		if (1 < event.getRelativeX() && event.getRelativeX() < 50 && 1 < event.getRelativeY()
+				&& event.getRelativeY() < 50 && event.getButton() == MouseButton.RIGHT && event.isAltKey()
+				&& event.isCtrlKey()) {
+			clickHit++;
+		}
+		if (clickHit >= 5) {
+			clickHit = 0;
+			if (editMode) {
+				ProductConfiguration.setWelcomeScreen(((RichTextArea) label).getValue());
 			}
-			reader.close();
-			return builder.toString();
-		} catch (IOException e) {
-			throw new RuntimeException(e);
+			editMode ^= true;
+			renderView(parent);
 		}
 	}
 }
diff --git a/pom.xml b/pom.xml
index 1399839..8ea96ea 100644
--- a/pom.xml
+++ b/pom.xml
@@ -101,4 +101,13 @@
             </plugins>
         </pluginManagement>
     </build>
+    <dependencies>
+		<dependency>
+			<groupId>org.eclipse.osbp.dependencies</groupId>
+			<artifactId>
+				org.eclipse.osbp.dependencies.bundle.activemq.all.osgi
+			</artifactId>
+			<version>5.14.5-SNAPSHOT</version>
+		</dependency>
+    </dependencies>
 </project>