catch up with development
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b9f0a46
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,37 @@
+**/bin/
+**/target/
+**._trace
+**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 cdf6c7a..9ecbd7c 100644
--- a/jenkins.build.config.xml
+++ b/jenkins.build.config.xml
@@ -17,6 +17,7 @@
         <jenkins.build.dependencies>
                 <jenkins.build.dependency>org.eclipse.osbp.bpmn2.ecore</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.dsl</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.ecview.addons</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.preferences</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.runtime</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.ui.api</jenkins.build.dependency>
diff --git a/org.eclipse.osbp.dsl.metadata.service.feature/.gitignore b/org.eclipse.osbp.dsl.metadata.service.feature/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/org.eclipse.osbp.dsl.metadata.service.feature/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/org.eclipse.osbp.dsl.metadata.service.feature/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.dsl.metadata.service.feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.dsl.metadata.service.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.dsl.metadata.service.feature/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.dsl.metadata.service.feature/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.dsl.metadata.service.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.dsl.metadata.service.feature/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.dsl.metadata.service.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..0933f8c
--- /dev/null
+++ b/org.eclipse.osbp.dsl.metadata.service.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,10 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+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.dsl.metadata.service.feature/feature.xml b/org.eclipse.osbp.dsl.metadata.service.feature/feature.xml
index e8951d3..aef77ab 100644
--- a/org.eclipse.osbp.dsl.metadata.service.feature/feature.xml
+++ b/org.eclipse.osbp.dsl.metadata.service.feature/feature.xml
@@ -14,7 +14,8 @@
         id="org.eclipse.osbp.dsl.metadata.service.feature"
         label="%featureName"
         version="0.9.0.qualifier"
-        provider-name="%providerName">
+        provider-name="%providerName"
+		plugin="org.eclipse.osbp.dsl.metadata.service">
         
     <description>
         %description
diff --git a/org.eclipse.osbp.dsl.metadata.service/.classpath b/org.eclipse.osbp.dsl.metadata.service/.classpath
new file mode 100644
index 0000000..43b9862
--- /dev/null
+++ b/org.eclipse.osbp.dsl.metadata.service/.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.dsl.metadata.service/.gitignore b/org.eclipse.osbp.dsl.metadata.service/.gitignore
new file mode 100644
index 0000000..ae3c172
--- /dev/null
+++ b/org.eclipse.osbp.dsl.metadata.service/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/org.eclipse.osbp.dsl.metadata.service/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.dsl.metadata.service/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.dsl.metadata.service/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.dsl.metadata.service/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osbp.dsl.metadata.service/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/org.eclipse.osbp.dsl.metadata.service/.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.dsl.metadata.service/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.dsl.metadata.service/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.dsl.metadata.service/.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.dsl.metadata.service/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.dsl.metadata.service/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..0933f8c
--- /dev/null
+++ b/org.eclipse.osbp.dsl.metadata.service/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,10 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+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.dsl.metadata.service/META-INF/MANIFEST.MF b/org.eclipse.osbp.dsl.metadata.service/META-INF/MANIFEST.MF
index e1a0a39..82e09f1 100644
--- a/org.eclipse.osbp.dsl.metadata.service/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.dsl.metadata.service/META-INF/MANIFEST.MF
@@ -9,8 +9,8 @@
  osgi.enterprise;bundle-version="4.2.0",
  org.eclipse.emf.common,
  org.eclipse.emf.ecore;bundle-version="2.10.2",
- org.eclipse.xtext;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext.common.types;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.common.types;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.osbp.xtext.builder.metadata.services;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.builder.types.loader.api;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.builder.types.loader.runtime;bundle-version="[0.9.0,0.10.0)",
@@ -31,7 +31,8 @@
  org.eclipse.osbp.dsl.entity.xtext;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.dsl.dto.xtext;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.dsl.datatype.xtext;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.xtext.statemachine;bundle-version="0.9.0"
+ org.eclipse.osbp.xtext.statemachine;bundle-version="0.9.0",
+ org.eclipse.osbp.ecview.dsl;bundle-version="0.9.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Import-Package: javax.validation.constraints,
@@ -39,10 +40,10 @@
  org.eclipse.e4.core.services.translation,
  org.eclipse.osbp.preferences;version="0.9.0",
  org.eclipse.osbp.ui.api.metadata;version="0.9.0",
+ org.eclipse.osbp.ui.api.perspective;version="0.9.0",
  org.eclipse.osbp.xtext.blip;version="0.9.0",
  org.eclipse.osbp.xtext.i18n;version="0.9.0",
  org.eclipse.osbp.xtext.perspective;version="0.9.0",
- org.jbpm.task.query;version="5.5.1",
  org.osgi.service.component;version="1.2.0",
  org.osgi.service.component.annotations,
  org.slf4j;resolution:=optional
diff --git a/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/DSLBuilderParticipant.java b/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/DSLBuilderParticipant.java
index 4176fa5..1485121 100644
--- a/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/DSLBuilderParticipant.java
+++ b/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/DSLBuilderParticipant.java
@@ -1,20 +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                                 
+ *  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.dsl.metadata.service;
 
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -23,6 +25,7 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.MissingResourceException;
 import java.util.Properties;
 import java.util.ResourceBundle;
@@ -30,23 +33,34 @@
 
 import javax.inject.Inject;
 
+import org.apache.commons.lang3.StringUtils;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.osbp.dsl.semantic.common.types.LTypedPackage;
 import org.eclipse.osbp.dsl.semantic.dto.LDto;
+import org.eclipse.osbp.dsl.semantic.entity.LEntity;
 import org.eclipse.osbp.dsl.xtext.types.bundles.BundleSpaceTypeProvider;
+import org.eclipse.osbp.ecview.semantic.uimodel.UiModel;
+import org.eclipse.osbp.ecview.semantic.uimodel.UiView;
 import org.eclipse.osbp.preferences.ProductConfiguration;
 import org.eclipse.osbp.runtime.common.extender.IExtenderConstants;
 import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
+import org.eclipse.osbp.ui.api.perspective.IPerspectiveProvider;
+import org.eclipse.osbp.xtext.authorizationdsl.AuthorizationPackage;
+import org.eclipse.osbp.xtext.authorizationdsl.Role;
 import org.eclipse.osbp.xtext.builder.metadata.services.AbstractBuilderParticipant;
 import org.eclipse.osbp.xtext.builder.metadata.services.IBuilderParticipant;
 import org.eclipse.osbp.xtext.builder.metadata.services.IMetadataBuilderService;
+import org.eclipse.osbp.xtext.builder.metadata.services.IUnitOfWork;
 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.DataInterchangePackage;
+import org.eclipse.osbp.xtext.datamartdsl.DatamartDSLPackage;
 import org.eclipse.osbp.xtext.datamartdsl.DatamartDefinition;
+import org.eclipse.osbp.xtext.datamartdsl.DatamartEntity;
 import org.eclipse.osbp.xtext.datamartdsl.DatamartPackage;
 import org.eclipse.osbp.xtext.dialogdsl.Dialog;
 import org.eclipse.osbp.xtext.dialogdsl.DialogDSLPackage;
@@ -88,7 +102,7 @@
 public class DSLBuilderParticipant extends AbstractBuilderParticipant {
 
 	/** The Constant log. */
-	private final static Logger log = LoggerFactory.getLogger(DSLBuilderParticipant.class);
+	private static final Logger log = LoggerFactory.getLogger(DSLBuilderParticipant.class);
 
 	/** The metadata builder service. */
 	@Inject
@@ -101,7 +115,13 @@
 	private ServiceRegistration<IDSLMetadataService> dslServiceRegister;
 
 	/** The dsl bundles. */
-	private Map<String, List<Bundle>> dslBundles = new HashMap<String, List<Bundle>>();
+	private Map<String, List<Bundle>> dslBundles = new HashMap<>();
+
+	/** The used keys. */
+	private Map<Bundle, List<String>> usedKeys = new HashMap<>();
+
+	/** The scanned bundles for translations. */
+	private List<Bundle> scannedBundles = new ArrayList<>();
 
 	/** The translations. */
 	private HashMap<String, Properties> translations = new HashMap<>();
@@ -132,71 +152,24 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see
-	 * org.eclipse.osbp.xtext.builder.metadata.services.AbstractBuilderParticipant
-	 * #getModels(org.osgi.framework.Bundle)
+	 * @see org.eclipse.osbp.xtext.builder.metadata.services.
+	 * AbstractBuilderParticipant #getModels(org.osgi.framework.Bundle)
 	 */
 	@Override
 	public List<URL> getModels(Bundle suspect) {
-		List<URL> results = new ArrayList<URL>();
+		List<URL> results = new ArrayList<>();
 		BundleWiring wiring = suspect.adapt(BundleWiring.class);
 		suspect.getState();
 		if (wiring == null) {
 			return results;
 		}
-		log.debug("visiting bundle " + suspect.getSymbolicName());
-		// bundles containing model information
-		if (containsHeader(suspect, IExtenderConstants.FACTORY_MODEL_EXTENDER)) {
-			for (String extension : getExtensions(suspect, IExtenderConstants.FACTORY_MODEL_EXTENDER)) {
-				extension = extension.trim();
-				if (!extension.isEmpty()) {
-					List<URL> entries = wiring.findEntries("/", "*." + extension, BundleWiring.LISTRESOURCES_RECURSE);
-					boolean hadEntries = false;
-					for (URL entry : entries) {
-						if (!entry.getPath().contains("META-INF")) {
-							log.debug("found entry " + entry.getPath() + " from bundle " + suspect.getSymbolicName());
-							results.add(entry);
-							hadEntries = true;
-						}
-					}
-					if (hadEntries) {
-						if (dslBundles.containsKey(extension)) {
-							if (!dslBundles.get(extension).contains(suspect)) {
-								dslBundles.get(extension).add(suspect);
-							}
-						} else {
-							List<Bundle> list = new ArrayList<Bundle>();
-							list.add(suspect);
-							dslBundles.put(extension, list);
-						}
-						loadTranslations(suspect);
-					}
-				}
-			}
-		}
-		// bundles necessary in runtime to be called dynamically via uri
-		if (containsHeader(suspect, IExtenderConstants.FACTORY_BUNDLE_EXTENDER)) {
-			for (String extension : getExtensions(suspect, IExtenderConstants.FACTORY_BUNDLE_EXTENDER)) {
-				extension = extension.trim();
-				if (!extension.isEmpty()) {
-					if (dslBundles.containsKey(extension)) {
-						if (!dslBundles.get(extension).contains(suspect)) {
-							dslBundles.get(extension).add(suspect);
-						}
-					} else {
-						List<Bundle> list = new ArrayList<Bundle>();
-						list.add(suspect);
-						dslBundles.put(extension, list);
-					}
-				}
-			}
-		}
-		// bundles containing translations
-		if (containsHeader(suspect, IExtenderConstants.FACTORY_TRANSLATIONS)) {
-			loadTranslations(suspect);
-		}
+		log.debug("visiting bundle {}", suspect.getSymbolicName());
+		scanModelBundles(suspect, results, wiring);
+		scanRuntimeBundles(suspect);
+		// bundles containing translations and don't scan translations twice
+		scanTranslationBundles(suspect);
 
-		Set<String> fragments = new HashSet<String>();
+		Set<String> fragments = new HashSet<>();
 		for (Iterator<URL> iterator = results.iterator(); iterator.hasNext();) {
 			URL url = iterator.next();
 			URI uri = URI.createURI(url.toString());
@@ -210,6 +183,90 @@
 	}
 
 	/**
+	 * Scan translation bundles containing translation resources.
+	 *
+	 * @param suspect
+	 *            the suspect
+	 */
+	private void scanTranslationBundles(Bundle suspect) {
+		if (containsHeader(suspect, IExtenderConstants.FACTORY_TRANSLATIONS) && !scannedBundles.contains(suspect)) {
+			loadTranslations(suspect);
+			scannedBundles.add(suspect);
+		}
+	}
+
+	/**
+	 * Scan runtime bundles necessary at runtime to be called dynamically via
+	 * uri.
+	 *
+	 * @param suspect
+	 *            the suspect
+	 */
+	private void scanRuntimeBundles(Bundle suspect) { // NOSONAR
+		if (containsHeader(suspect, IExtenderConstants.FACTORY_BUNDLE_EXTENDER)) {
+			for (String extension : getExtensions(suspect, IExtenderConstants.FACTORY_BUNDLE_EXTENDER)) {
+				extension = extension.trim();
+				if (!extension.isEmpty()) {
+					if (dslBundles.containsKey(extension)) {
+						if (!dslBundles.get(extension).contains(suspect)) {
+							dslBundles.get(extension).add(suspect);
+						}
+					} else {
+						List<Bundle> list = new ArrayList<>();
+						list.add(suspect);
+						dslBundles.put(extension, list);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Scan model bundles containing model information
+	 *
+	 * @param suspect
+	 *            the suspect
+	 * @param results
+	 *            the results
+	 * @param wiring
+	 *            the wiring
+	 */
+	private void scanModelBundles(Bundle suspect, List<URL> results, BundleWiring wiring) { // NOSONAR
+		if (containsHeader(suspect, IExtenderConstants.FACTORY_MODEL_EXTENDER)) {
+			for (String extension : getExtensions(suspect, IExtenderConstants.FACTORY_MODEL_EXTENDER)) {
+				extension = extension.trim();
+				if (!extension.isEmpty()) {
+					List<URL> entries = wiring.findEntries("/", "*." + extension, BundleWiring.LISTRESOURCES_RECURSE);
+					boolean hadEntries = false;
+					for (URL entry : entries) {
+						if (!entry.getPath().contains("META-INF")) {
+							log.debug("found entry {}  from bundle {}", entry.getPath(), suspect.getSymbolicName());
+							results.add(entry);
+							hadEntries = true;
+						}
+					}
+					if (hadEntries) {
+						if (dslBundles.containsKey(extension)) {
+							if (!dslBundles.get(extension).contains(suspect)) {
+								dslBundles.get(extension).add(suspect);
+							}
+						} else {
+							List<Bundle> list = new ArrayList<>();
+							list.add(suspect);
+							dslBundles.put(extension, list);
+						}
+						// don't scan translations twice
+						if (!scannedBundles.contains(suspect)) {
+							loadTranslations(suspect);
+							scannedBundles.add(suspect);
+						}
+					}
+				}
+			}
+		}
+	}
+
+	/**
 	 * Load translations from a bundle. Tries to find an i18n directory with
 	 * different language properties.
 	 *
@@ -219,7 +276,27 @@
 	void loadTranslations(Bundle suspect) {
 		BundleWiring bundleWiring = suspect.adapt(BundleWiring.class);
 		ClassLoader classLoader = bundleWiring.getClassLoader();
+		// check for duplicates
+		List<String> duplicateKeys = new ArrayList<>();
+		try {
+			final List<String> keys = Collections
+					.list(ResourceBundle.getBundle("i18n.I18N", Locale.ROOT, classLoader).getKeys());
+			for (Entry<Bundle, List<String>> used : usedKeys.entrySet()) {
+				for (String entry : used.getValue()) {
+					if (keys.contains(entry)) {
+						duplicateKeys.add(entry);
+						log.debug("{}  translates the key >{}< but was already translated by {}",
+								suspect.getSymbolicName(), entry, used.getKey().getSymbolicName());
+					}
+				}
+			}
+			usedKeys.put(suspect, keys);
+		} catch (MissingResourceException e) { // NOSONAR
+		}
 		for (String language : ProductConfiguration.getLanguages().keySet()) {
+			if (language.equals("default")) {
+				continue;
+			}
 			Properties properties = null;
 			if (translations.containsKey(language)) {
 				properties = translations.get(language);
@@ -227,20 +304,46 @@
 				properties = new Properties();
 			}
 			try {
-				ResourceBundle resource = ResourceBundle.getBundle("i18n.I18N", Locale.forLanguageTag(language), classLoader);
-				Enumeration<String> keyIterator = resource.getKeys();
-				while (keyIterator.hasMoreElements()) {
-					String element = keyIterator.nextElement();
-					String value = resource.getString(element);
+				ResourceBundle resource = ResourceBundle.getBundle("i18n.I18N", Locale.forLanguageTag(language),
+						classLoader);
+				computeTranslations(duplicateKeys, language, properties, resource);
+			} catch (MissingResourceException e) {
+				log.debug("bundle {} has no resource for locale {}", suspect.getSymbolicName(), language);
+			}
+		}
+	}
+
+	private void computeTranslations(List<String> duplicateKeys, String language, Properties properties, // NOSONAR
+			ResourceBundle resource) {
+		Enumeration<String> keyIterator = resource.getKeys();
+		while (keyIterator.hasMoreElements()) {
+			String element = keyIterator.nextElement();
+			if (!element.isEmpty()) {
+				String value = resource.getString(element);
+				if (duplicateKeys.contains(element)) {
+					if (value == null) {
+						value = "";
+					}
+					String prevValue = properties.getProperty(element);
+					if (prevValue == null) {
+						prevValue = "";
+					}
+					int distanceFromKey = StringUtils.getLevenshteinDistance(value, element);
+					int distanceFromPrevious = StringUtils.getLevenshteinDistance(prevValue, element);
+					if (distanceFromKey > 1 && distanceFromKey > distanceFromPrevious) {
+						properties.put(element, value);
+						log.debug(
+								"translation for {} of key >{}< with >{}< was preferred due to its better levenshtein distance from the key.",
+								language, element, value);
+					}
+				} else if (value != null && !value.equals(element)) {
 					properties.put(element, value);
 				}
-				if (!properties.isEmpty()) {
-					translations.put(language, properties);
-				}
-			} catch (MissingResourceException e) {
-				log.error("bundle "+suspect.getSymbolicName()+" has no resource for locale "+language);
 			}
 		}
+		if (!properties.isEmpty()) {
+			translations.put(language, properties);
+		}
 	}
 
 	/**
@@ -274,14 +377,14 @@
 	 * @return the extensions
 	 */
 	private List<String> getExtensions(Bundle bundle, String header) {
-		return new ArrayList<String>(Arrays.asList(bundle.getHeaders().get(header).split(",")));
+		return new ArrayList<>(Arrays.asList(bundle.getHeaders().get(header).split(",")));
 	}
 
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see
-	 * org.eclipse.osbp.xtext.builder.metadata.services.AbstractBuilderParticipant
+	 * @see org.eclipse.osbp.xtext.builder.metadata.services.
+	 * AbstractBuilderParticipant
 	 * #notifyLifecyle(org.eclipse.osbp.xtext.builder.metadata.services.
 	 * IBuilderParticipant.LifecycleEvent)
 	 */
@@ -291,7 +394,8 @@
 			initialize();
 		} else if (event.getState() == IBuilderParticipant.LifecycleEvent.BUNDLES_SCANNED) {
 			DSLMetadataService datatypesService = new DSLMetadataService();
-			dslServiceRegister = context.getBundleContext().registerService(IDSLMetadataService.class, datatypesService, null);
+			dslServiceRegister = context.getBundleContext().registerService(IDSLMetadataService.class, datatypesService,
+					null);
 
 		} else if (event.getState() == IBuilderParticipant.LifecycleEvent.DEACTIVATED) {
 			if (dslServiceRegister != null) {
@@ -327,52 +431,83 @@
 		 */
 		@Override
 		public EObject getMetadata(String id, EClass eclass) {
-			EObject eObject = metadataBuilderService.getMetadata(id, eclass);
-			return eObject;
+			return metadataBuilderService.getMetadata(id, eclass);
 		}
 
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * org.eclipse.osbp.ui.api.metadata.IDSLMetadataService#getResourceURL(
+		 * java.lang.String, java.lang.String)
+		 */
 		@Override
-		public URL getResourceURL(EObject eObject, String resourceExtension, String extension) {
-			String fqn = NamingConventions.toFQN(eObject);
-			String resourcePath = fqn.replaceAll("\\.","/")+"."+resourceExtension;
+		public URL getResourceURL(String resourceName, String extension) {
+			if (dslBundles.containsKey(extension)) {
+				for (Bundle bundle : dslBundles.get(extension)) {
+					BundleWiring wiring = bundle.adapt(BundleWiring.class);
+					List<URL> entries = wiring.findEntries("/", resourceName, BundleWiring.LISTRESOURCES_RECURSE);
+					if (!entries.isEmpty()) {
+						return entries.get(0);
+					}
+				}
+			}
+			log.error("resource {} could not be found in bundles with extension {}", resourceName, extension);
+			return null;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * org.eclipse.osbp.ui.api.metadata.IDSLMetadataService#getClass(org.
+		 * eclipse.emf.ecore.EObject, java.lang.String)
+		 */
+		@Override
+		public Class<?> getClass(EObject eObject, String extension) {
+			String className = getClassName(eObject, "");
 			if (dslBundles.containsKey(extension)) {
 				for (Bundle bundle : dslBundles.get(extension)) {
 					BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
 					ClassLoader classLoader = bundleWiring.getClassLoader();
-					URL url = classLoader.getResource(resourcePath);
-					if(url != null) {
-						return url;
+					Class<?> clz = null;
+					try {
+						clz = classLoader.loadClass(className);
+					} catch (ClassNotFoundException e) {
+						// nothing to do
+					}
+					if (clz != null) {
+						return clz;
 					}
 				}
 			}
-			log.error("resource url "+resourcePath+" could not be found in bundles with extension "+extension);
+			log.error("class {} could not be found for extension {}", className, extension);
 			return null;
 		}
 
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * org.eclipse.osbp.ui.api.metadata.IDSLMetadataService#getClassInstance
+		 * (org.eclipse.emf.ecore.EObject, java.lang.String)
+		 */
 		@Override
 		public Object getClassInstance(EObject eObject, String extension) {
-			String className = getClassName(eObject, "");
-			if (dslBundles.containsKey(extension)) {
-				try {
-					for (Bundle bundle : dslBundles.get(extension)) {
-						BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
-						ClassLoader classLoader = bundleWiring.getClassLoader();
-						Class<?> clz = classLoader.loadClass(className);
-						try {
-							return clz.newInstance();
-						} catch (InstantiationException	| IllegalAccessException e) {
-							log.error("class "+className+" could not be instantiated");
-							if(e.getCause() != null) {
-								log.error("because "+e.getCause());
-							}
-						}
-					}
-				} catch (ClassNotFoundException e) {
+			Class<?> clz = getClass(eObject, extension);
+			try {
+				if (clz != null) {
+					return clz.newInstance();
+				}
+			} catch (InstantiationException | IllegalAccessException e) {
+				log.error("class {} could not be instantiated", clz.getCanonicalName());
+				if (e.getCause() != null) {
+					log.error("because " + e.getCause());
 				}
 			}
-			log.error("class "+className+" could not be found for extension "+extension);
 			return null;
 		}
+
 		/**
 		 * Gets the class URI. As more than one bundle could carry a model
 		 * instance, we must try to load the requested class to be sure to have
@@ -391,9 +526,11 @@
 					try {
 						BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
 						ClassLoader classLoader = bundleWiring.getClassLoader();
-						classLoader.loadClass(className);
-						return "bundleclass://" + bundle.getSymbolicName() + "/" + className;
-					} catch (ClassNotFoundException e) {
+						Class<?> clz = classLoader.loadClass(className);
+						if (clz != null) {
+							return "bundleclass://" + bundle.getSymbolicName() + "/" + className;
+						}
+					} catch (ClassNotFoundException e) { // NOSONAR
 					}
 				}
 			}
@@ -415,9 +552,8 @@
 		/*
 		 * (non-Javadoc)
 		 * 
-		 * @see
-		 * org.eclipse.osbp.ui.api.metadata.IDSLMetadataService#getAllDescriptions
-		 * (org.eclipse.emf.ecore.EClass)
+		 * @see org.eclipse.osbp.ui.api.metadata.IDSLMetadataService#
+		 * getAllDescriptions (org.eclipse.emf.ecore.EClass)
 		 */
 		@Override
 		public Iterable<IEObjectDescription> getAllDescriptions(EClass eClass) {
@@ -462,9 +598,8 @@
 		/*
 		 * (non-Javadoc)
 		 * 
-		 * @see
-		 * org.eclipse.osbp.ui.api.metadata.IDSLMetadataService#getAll(org.eclipse
-		 * .emf.ecore.EClass)
+		 * @see org.eclipse.osbp.ui.api.metadata.IDSLMetadataService#getAll(org.
+		 * eclipse .emf.ecore.EClass)
 		 */
 		@Override
 		public Iterable<EObject> getAll(EClass eClass) {
@@ -480,7 +615,7 @@
 		 */
 		@Override
 		public String translate(String localeString, String key) {
-			if (localeString == null) {
+			if (localeString == null || key == null) {
 				return key;
 			}
 			String k = I18NKeyGenerator.key(key);
@@ -491,10 +626,17 @@
 			String ranges = localeString + ";q=1.0";
 			List<Locale.LanguageRange> languageRanges = Locale.LanguageRange.parse(ranges);
 			String localeTag = Locale.lookupTag(languageRanges, translations.keySet());
-			Properties properties = translations.get(localeTag);
-			if (properties.containsKey(k)) {
-				String value = properties.getProperty(k);
-				return value;
+			if (localeTag != null) {
+				Properties properties = translations.get(localeTag);
+				if (properties != null) {
+					if (properties.containsKey(k)) {
+						return properties.getProperty(k);
+					}
+				} else {
+					log.error("localeTag {} not supported", localeTag);
+				}
+			} else {
+				log.error("locale {} not supported", localeString);
 			}
 			return key;
 		}
@@ -565,8 +707,7 @@
 		@Override
 		public List<Pair> getDslGrammarElementNames(IDSLMetadataService.DSLLiterals literal) {
 			List<Pair> result = new ArrayList<>();
-			switch (literal) {
-			case PERSPECTIVES:
+			if (literal == DSLLiterals.PERSPECTIVES) {
 				for (EObject obj : getAll(PerspectiveDslPackage.Literals.PERSPECTIVE)) {
 					Perspective perspective = ((Perspective) obj);
 					result.add(Tuples.pair(perspective.getName(), NamingConventions.getPerspectiveFQN(perspective)));
@@ -574,12 +715,59 @@
 			}
 			return result;
 		}
+
+		@Override
+		public <T> void execute(T state, Object unitOfWork) {
+			metadataBuilderService.execute(state, (IUnitOfWork<T>) unitOfWork);
+		}
+
+		@Override
+		public Class<?> getDatamartRootClass(String canonicalName) {
+			DatamartDefinition definition = (DatamartDefinition) getMetadata(canonicalName,
+					DatamartDSLPackage.Literals.DATAMART_DEFINITION);
+			if (definition == null) {
+				return null;
+			}
+			if (!(definition.getSource() instanceof DatamartEntity)) {
+				return null;
+			}
+			LEntity entity = ((DatamartEntity) definition.getSource()).getEntityRef();
+			return getClass(entity, "entity");
+		}
+
+		@Override
+		public String getDatamartRootClassIdentifierName(String canonicalName) {
+			DatamartDefinition definition = (DatamartDefinition) getMetadata(canonicalName,
+					DatamartDSLPackage.Literals.DATAMART_DEFINITION);
+			if (definition == null) {
+				return null;
+			}
+			if (!(definition.getSource() instanceof DatamartEntity)) {
+				return null;
+			}
+			LEntity entity = ((DatamartEntity) definition.getSource()).getEntityRef();
+			if (entity.getPrimaryKeyAttribute() == null) {
+				return null;
+			}
+			return entity.getPrimaryKeyAttribute().getName();
+		}
+
+		@Override
+		public String getECViewId(EObject dialog) {
+			if(!(dialog instanceof Dialog)) {
+				log.error("{} is not a dialog.", dialog);
+				return "";
+			}
+			return NamingConventions.getECViewId((Dialog) dialog);
+		}
 	}
 
 	/**
 	 * The Class NamingConventions.
 	 */
 	private static class NamingConventions {
+		private NamingConventions() {
+		}
 
 		/**
 		 * To extension.
@@ -592,18 +780,19 @@
 			EPackage pkg = eObject.eClass().getEPackage();
 
 			if (pkg == ChartDSLPackage.eINSTANCE) {
-				return "chart";
+				return IPerspectiveProvider.PerspectiveViewType.CHART;
 			} else if (pkg == DialogDSLPackage.eINSTANCE) {
-				return "dialog";
+				return IPerspectiveProvider.PerspectiveViewType.DIALOG;
 			} else if (pkg == ReportDSLPackage.eINSTANCE) {
-				return "report";
+				return IPerspectiveProvider.PerspectiveViewType.REPORT;
 			} else if (pkg == TableDSLPackage.eINSTANCE) {
-				return "table";
+				return IPerspectiveProvider.PerspectiveViewType.TABLE;
 			} else if (pkg == TopologyDSLPackage.eINSTANCE) {
-				return "topology";
+				return IPerspectiveProvider.PerspectiveViewType.TOPOLOGY;
 			}
 
-			throw new IllegalArgumentException("No registered naming logic for " + eObject);
+			throw new IllegalArgumentException(
+					IDSLMetadataService.ThrowableMessages.NAMING_LOGIC_NOT_REGISTERD + eObject);
 		}
 
 		/**
@@ -620,6 +809,8 @@
 
 			if (eObject instanceof Chart) {
 				return getChartFQN(eObject);
+			} else if (eObject instanceof Role) {
+				return getAuthorizationFQN(eObject);
 			} else if (eObject instanceof Dialog) {
 				return getDialogFQN(eObject);
 			} else if (eObject instanceof LDto) {
@@ -633,7 +824,8 @@
 			} else if (eObject instanceof DatamartDefinition) {
 				return getDatamartFQN(eObject);
 			}
-			throw new IllegalArgumentException("No registered naming logic for " + eObject);
+			throw new IllegalArgumentException(
+					IDSLMetadataService.ThrowableMessages.NAMING_LOGIC_NOT_REGISTERD + eObject);
 		}
 
 		/**
@@ -652,6 +844,10 @@
 				return getChartClassName(eObject);
 			} else if (eObject instanceof Dialog) {
 				return getDialogClassName(eObject);
+			} else if (eObject instanceof LDto) {
+				return getDtoClassName(eObject);
+			} else if (eObject instanceof LEntity) {
+				return getEntityClassName(eObject);
 			} else if (eObject instanceof Report) {
 				return getReportClassName(eObject);
 			} else if (eObject instanceof Table) {
@@ -662,8 +858,11 @@
 				return getTopologyClassName(eObject);
 			} else if (eObject instanceof DatamartDefinition) {
 				return getDatamartClassName(eObject);
+			} else if (eObject instanceof DataInterchangePackage) {
+				return getDataInterchangeClassName(eObject);
 			}
-			throw new IllegalArgumentException("No registered naming logic for " + eObject);
+			throw new IllegalArgumentException(
+					IDSLMetadataService.ThrowableMessages.NAMING_LOGIC_NOT_REGISTERD + eObject);
 		}
 
 		/**
@@ -683,6 +882,38 @@
 		}
 
 		/**
+		 * Gets the entity FQN.
+		 *
+		 * @param eObject
+		 *            the e object
+		 * @return the entity FQN
+		 */
+		private static String getEntityFQN(EObject eObject) {
+			LEntity entity = (LEntity) eObject;
+			if (entity == null) {
+				return "";
+			}
+			LTypedPackage pkg = (LTypedPackage) entity.eContainer();
+			return pkg.getName() + "." + entity.getName();
+		}
+
+		/**
+		 * Gets the authorization FQN.
+		 *
+		 * @param eObject
+		 *            the e object
+		 * @return the table FQN
+		 */
+		private static String getAuthorizationFQN(EObject eObject) {
+			Role role = (Role) eObject;
+			if (role == null) {
+				return "";
+			}
+			AuthorizationPackage pkg = (AuthorizationPackage) role.eContainer();
+			return pkg.getName() + "." + role.getName();
+		}
+
+		/**
 		 * Gets the table FQN.
 		 *
 		 * @param eObject
@@ -690,12 +921,12 @@
 		 * @return the table FQN
 		 */
 		private static String getTableFQN(EObject eObject) {
-			Table dto = (Table) eObject;
-			if (dto == null) {
+			Table table = (Table) eObject;
+			if (table == null) {
 				return "";
 			}
-			TablePackage pkg = (TablePackage) dto.eContainer();
-			return pkg.getName() + "." + dto.getName();
+			TablePackage pkg = (TablePackage) table.eContainer();
+			return pkg.getName() + "." + table.getName();
 		}
 
 		/**
@@ -706,12 +937,12 @@
 		 * @return the chart FQN
 		 */
 		private static String getChartFQN(EObject eObject) {
-			Chart dto = (Chart) eObject;
-			if (dto == null) {
+			Chart chart = (Chart) eObject;
+			if (chart == null) {
 				return "";
 			}
-			ChartPackage pkg = (ChartPackage) dto.eContainer();
-			return pkg.getName() + "." + dto.getName();
+			ChartPackage pkg = (ChartPackage) chart.eContainer();
+			return pkg.getName() + "." + chart.getName();
 		}
 
 		/**
@@ -722,12 +953,12 @@
 		 * @return the report FQN
 		 */
 		private static String getReportFQN(EObject eObject) {
-			Report dto = (Report) eObject;
-			if (dto == null) {
+			Report report = (Report) eObject;
+			if (report == null) {
 				return "";
 			}
-			ReportPackage pkg = (ReportPackage) dto.eContainer();
-			return pkg.getName() + "." + dto.getName();
+			ReportPackage pkg = (ReportPackage) report.eContainer();
+			return pkg.getName() + "." + report.getName();
 		}
 
 		/**
@@ -738,20 +969,30 @@
 		 * @return the dialog FQN
 		 */
 		private static String getDialogFQN(EObject eObject) {
-			Dialog dto = (Dialog) eObject;
-			if (dto == null) {
+			Dialog dialog = (Dialog) eObject;
+			if (dialog == null) {
 				return "";
 			}
-			DialogPackage pkg = (DialogPackage) dto.eContainer();
-			return pkg.getName() + "." + dto.getName();
+			DialogPackage pkg = (DialogPackage) dialog.eContainer();
+			String name = pkg.getName() + "." + dialog.getName();
+			
+			return name;
+		}
+
+		private static String getDatainterchangeFQN(EObject eObject) {
+			DataInterchangePackage data = (DataInterchangePackage) eObject;
+			if (data == null) {
+				return "";
+			}
+			return data.getName();
 		}
 
 		/**
-		 * Gets the dialog FQN.
+		 * Gets the perspective FQN.
 		 *
 		 * @param eObject
 		 *            the e object
-		 * @return the dialog FQN
+		 * @return the perspective FQN
 		 */
 		private static String getPerspectiveFQN(EObject eObject) {
 			Perspective perspective = (Perspective) eObject;
@@ -770,18 +1011,19 @@
 		 * @return the topology FQN
 		 */
 		private static String getTopologyFQN(EObject eObject) {
-			Topology dto = (Topology) eObject;
-			if (dto == null) {
+			Topology topology = (Topology) eObject;
+			if (topology == null) {
 				return "";
 			}
-			TopologyPackage pkg = (TopologyPackage) dto.eContainer();
-			return pkg.getName() + "." + dto.getName();
+			TopologyPackage pkg = (TopologyPackage) topology.eContainer();
+			return pkg.getName() + "." + topology.getName();
 		}
 
 		/**
 		 * Gets the datamart FQN.
 		 *
-		 * @param eObject the e object
+		 * @param eObject
+		 *            the e object
 		 * @return the datamart FQN
 		 */
 		private static String getDatamartFQN(EObject eObject) {
@@ -794,6 +1036,28 @@
 		}
 
 		/**
+		 * Gets the dto class name.
+		 *
+		 * @param eObject
+		 *            the e object
+		 * @return the dto class name
+		 */
+		private static String getDtoClassName(EObject eObject) {
+			return getDtoFQN(eObject);
+		}
+
+		/**
+		 * Gets the entity class name.
+		 *
+		 * @param eObject
+		 *            the e object
+		 * @return the entity class name
+		 */
+		private static String getEntityClassName(EObject eObject) {
+			return getEntityFQN(eObject);
+		}
+
+		/**
 		 * Gets the topology class name.
 		 *
 		 * @param eObject
@@ -807,7 +1071,8 @@
 		/**
 		 * Gets the datamart class name.
 		 *
-		 * @param eObject the e object
+		 * @param eObject
+		 *            the e object
 		 * @return the datamart class name
 		 */
 		private static String getDatamartClassName(EObject eObject) {
@@ -871,7 +1136,41 @@
 		 * @return the dialog class name
 		 */
 		private static String getDialogClassName(EObject eObject) {
-			return getDialogFQN(eObject) + "Dialog";
+			Dialog dialog = (Dialog) eObject;
+			if(dialog.isEmbedded()) {
+				return getDialogFQN(eObject) + "DialogEmbedded";
+			}else{
+				return getDialogFQN(eObject) + "Dialog";
+			}
+		}
+
+		private static String getDataInterchangeClassName(EObject eObject) {
+			return getDatainterchangeFQN(eObject) + "TriggerView";
+		}
+
+		/**
+		 * Gets the ecview id.
+		 *
+		 * @param dialog
+		 *            the dialog
+		 * @return the ecview id
+		 */
+		private static String getECViewId(Dialog dialog) {
+			if (dialog == null) {
+				return "";
+			}
+			DialogPackage pkg = (DialogPackage) dialog.eContainer();
+			String ecviewId = null;
+			if (dialog.isAutowire()) {
+				ecviewId = pkg.getName() + ".autobinded." + dialog.getName();
+			} else if (dialog.getUiView() != null) {
+				UiView ui = dialog.getUiView();
+				UiModel model = (UiModel) ui.eContainer();
+				ecviewId = model.getPackageName() + "." + ui.getName();
+			} else {
+				ecviewId = pkg.getName() + "." + dialog.getName();
+			}
+			return ecviewId;
 		}
 	}
 
diff --git a/pom.xml b/pom.xml
index 6c123b3..55cea39 100644
--- a/pom.xml
+++ b/pom.xml
@@ -85,4 +85,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>