diff --git a/.artifactVersions b/.artifactVersions
new file mode 100644
index 0000000..9a17bde
--- /dev/null
+++ b/.artifactVersions
@@ -0,0 +1,4 @@
+version=0.9.1-SNAPSHOT
+relengVersion=0.12.5-SNAPSHOT
+relengP2Version=0.12.5-SNAPSHOT
+relengGroupId=org.lunifera.releng.maven
\ No newline at end of file
diff --git a/.depVersions b/.depVersions
new file mode 100644
index 0000000..90b0f6b
--- /dev/null
+++ b/.depVersions
@@ -0,0 +1,14 @@
+org.eclipse.xtend;min=2.7.3;max=2.8.0
+org.eclipse.xtext;min=2.7.3;max=2.8.0
+org.semanticsoft;min=2.7.3;max=3.0.0
+org.lunifera.dependencies.feature.assert-utilities;min=1.2.2.2;max=1.2.3
+org.lunifera.dependencies.feature.jetty.websockets;min=8.1.15;max=8.1.16
+org.lunifera.dependencies.feature.atmosphere;min=2.1.2.vaadin6;max=2.1.3
+org.lunifera.dependencies.feature.transaction;min=0.3.1;max=0.3.2
+org.lunifera.dependencies.feature.vaadin;min=7.3.8;max=7.3.9
+org.lunifera.dsl;min=0.9.0;max=0.10.0
+org.lunifera;min=0.9.0;max=0.10.0
+com.google.guava;min=10.0.0;max=19.0.0
+com.vaadin.external.atmosphere.runtime;min=2.1.2;max=2.1.3
+com.vaadin.external.org.slf4j;min=1.6.1;max=1.6.2
+com.vaadin;min=7.3.8;max=7.3.9
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..3260e4f
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,204 @@
+Eclipse Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
+LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
+CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and documentation
+   distributed under this Agreement, and
+b) in the case of each subsequent Contributor:
+    i) changes to the Program, and
+   ii) additions to the Program;
+
+   where such changes and/or additions to the Program originate from and are
+   distributed by that particular Contributor. A Contribution 'originates'
+   from a Contributor if it was added to the Program by such Contributor
+   itself or anyone acting on such Contributor's behalf. Contributions do not
+   include additions to the Program which: (i) are separate modules of
+   software distributed in conjunction with the Program under their own
+   license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which are
+necessarily infringed by the use or sale of its Contribution alone or when
+combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+2. GRANT OF RIGHTS
+  a) Subject to the terms of this Agreement, each Contributor hereby grants
+     Recipient a non-exclusive, worldwide, royalty-free copyright license to
+     reproduce, prepare derivative works of, publicly display, publicly
+     perform, distribute and sublicense the Contribution of such Contributor,
+     if any, and such derivative works, in source code and object code form.
+  b) Subject to the terms of this Agreement, each Contributor hereby grants
+     Recipient a non-exclusive, worldwide, royalty-free patent license under
+     Licensed Patents to make, use, sell, offer to sell, import and otherwise
+     transfer the Contribution of such Contributor, if any, in source code and
+     object code form. This patent license shall apply to the combination of
+     the Contribution and the Program if, at the time the Contribution is
+     added by the Contributor, such addition of the Contribution causes such
+     combination to be covered by the Licensed Patents. The patent license
+     shall not apply to any other combinations which include the Contribution.
+     No hardware per se is licensed hereunder.
+  c) Recipient understands that although each Contributor grants the licenses
+     to its Contributions set forth herein, no assurances are provided by any
+     Contributor that the Program does not infringe the patent or other
+     intellectual property rights of any other entity. Each Contributor
+     disclaims any liability to Recipient for claims brought by any other
+     entity based on infringement of intellectual property rights or
+     otherwise. As a condition to exercising the rights and licenses granted
+     hereunder, each Recipient hereby assumes sole responsibility to secure
+     any other intellectual property rights needed, if any. For example, if a
+     third party patent license is required to allow Recipient to distribute
+     the Program, it is Recipient's responsibility to acquire that license
+     before distributing the Program.
+  d) Each Contributor represents that to its knowledge it has sufficient
+     copyright rights in its Contribution, if any, to grant the copyright
+     license set forth in this Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under
+its own license agreement, provided that:
+
+  a) it complies with the terms and conditions of this Agreement; and
+  b) its license agreement:
+      i) effectively disclaims on behalf of all Contributors all warranties
+         and conditions, express and implied, including warranties or
+         conditions of title and non-infringement, and implied warranties or
+         conditions of merchantability and fitness for a particular purpose;
+     ii) effectively excludes on behalf of all Contributors all liability for
+         damages, including direct, indirect, special, incidental and
+         consequential damages, such as lost profits;
+    iii) states that any provisions which differ from this Agreement are
+         offered by that Contributor alone and not by any other party; and
+     iv) states that source code for the Program is available from such
+         Contributor, and informs licensees how to obtain it in a reasonable
+         manner on or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+  a) it must be made available under this Agreement; and
+  b) a copy of this Agreement must be included with each copy of the Program.
+     Contributors may not remove or alter any copyright notices contained
+     within the Program.
+
+Each Contributor must identify itself as the originator of its Contribution,
+if
+any, in a manner that reasonably allows subsequent Recipients to identify the
+originator of the Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with
+respect to end users, business partners and the like. While this license is
+intended to facilitate the commercial use of the Program, the Contributor who
+includes the Program in a commercial product offering should do so in a manner
+which does not create potential liability for other Contributors. Therefore,
+if a Contributor includes the Program in a commercial product offering, such
+Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
+every other Contributor ("Indemnified Contributor") against any losses,
+damages and costs (collectively "Losses") arising from claims, lawsuits and
+other legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such Commercial
+Contributor in connection with its distribution of the Program in a commercial
+product offering. The obligations in this section do not apply to any claims
+or Losses relating to any actual or alleged intellectual property
+infringement. In order to qualify, an Indemnified Contributor must:
+a) promptly notify the Commercial Contributor in writing of such claim, and
+b) allow the Commercial Contributor to control, and cooperate with the
+Commercial Contributor in, the defense and any related settlement
+negotiations. The Indemnified Contributor may participate in any such claim at
+its own expense.
+
+For example, a Contributor might include the Program in a commercial product
+offering, Product X. That Contributor is then a Commercial Contributor. If
+that Commercial Contributor then makes performance claims, or offers
+warranties related to Product X, those performance claims and warranties are
+such Commercial Contributor's responsibility alone. Under this section, the
+Commercial Contributor would have to defend claims against the other
+Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
+IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
+Recipient is solely responsible for determining the appropriateness of using
+and distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to the
+risks and costs of program errors, compliance with applicable laws, damage to
+or loss of data, programs or equipment, and unavailability or interruption of
+operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
+CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
+LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
+EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of the
+remainder of the terms of this Agreement, and without further action by the
+parties hereto, such provision shall be reformed to the minimum extent
+necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Program itself
+(excluding combinations of the Program with other software or hardware)
+infringes such Recipient's patent(s), then such Recipient's rights granted
+under Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to
+comply with any of the material terms or conditions of this Agreement and does
+not cure such failure in a reasonable period of time after becoming aware of
+such noncompliance. If all Recipient's rights under this Agreement terminate,
+Recipient agrees to cease use and distribution of the Program as soon as
+reasonably practicable. However, Recipient's obligations under this Agreement
+and any licenses granted by Recipient relating to the Program shall continue
+and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in
+order to avoid inconsistency the Agreement is copyrighted and may only be
+modified in the following manner. The Agreement Steward reserves the right to
+publish new versions (including revisions) of this Agreement from time to
+time. No one other than the Agreement Steward has the right to modify this
+Agreement. The Eclipse Foundation is the initial Agreement Steward. The
+Eclipse Foundation may assign the responsibility to serve as the Agreement
+Steward to a suitable separate entity. Each new version of the Agreement will
+be given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version of the
+Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly
+stated in Sections 2(a) and 2(b) above, Recipient receives no rights or
+licenses to the intellectual property of any Contributor under this Agreement,
+whether expressly, by implication, estoppel or otherwise. All rights in the
+Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to this
+Agreement will bring a legal action under this Agreement more than one year
+after the cause of action arose. Each party waives its rights to a jury trial in
+any resulting litigation.
+
diff --git a/org.eclipse.osbp.vaaclipse.addons.app/META-INF/MANIFEST.MF b/org.eclipse.osbp.vaaclipse.addons.app/META-INF/MANIFEST.MF
index af7a0f5..5766330 100644
--- a/org.eclipse.osbp.vaaclipse.addons.app/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.vaaclipse.addons.app/META-INF/MANIFEST.MF
@@ -33,7 +33,8 @@
  org.eclipse.osbp.vaaclipse.addons.common;bundle-version="[0.9.0,0.10.0)",
  org.jsoup;bundle-version="1.7.2",
  org.slf4j.api;bundle-version="1.7.2",
- org.eclipse.osbp.runtime.common;bundle-version="[0.9.0,0.10.0)"
+ org.eclipse.osbp.runtime.common;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.ui.api;bundle-version="0.9.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Export-Package: org.eclipse.osbp.vaaclipse.addons.app;x-internal:=true;version="0.9.0",
@@ -44,6 +45,7 @@
  javax.inject;version="1.0.0",
  javax.servlet;version="2.6.0",
  javax.servlet.http;version="2.6.0",
+ org.apache.commons.lang,
  org.eclipse.equinox.http.servlet;version="1.1.0",
  org.eclipse.osbp.ui.api.perspective;version="0.9.0",
  org.eclipse.osbp.ui.api.user,
diff --git a/org.eclipse.osbp.vaaclipse.addons.app/OSGI-INF/org.eclipse.osbp.vaaclipse.addons.app.resources.StaticResources.xml b/org.eclipse.osbp.vaaclipse.addons.app/OSGI-INF/org.eclipse.osbp.vaaclipse.addons.app.resources.StaticResources.xml
index 161c06e..2d3323a 100644
--- a/org.eclipse.osbp.vaaclipse.addons.app/OSGI-INF/org.eclipse.osbp.vaaclipse.addons.app.resources.StaticResources.xml
+++ b/org.eclipse.osbp.vaaclipse.addons.app/OSGI-INF/org.eclipse.osbp.vaaclipse.addons.app.resources.StaticResources.xml
@@ -2,6 +2,7 @@
 <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" enabled="true" immediate="true" name="org.eclipse.osbp.vaaclipse.addons.app.resources.StaticResources">
    <implementation class="org.eclipse.osbp.vaaclipse.addons.app.resources.StaticResources"/>
    <property name="http.alias" value="/VAADIN"/>
+   <reference bind="bindDSLMetadataService" cardinality="1..1" interface="org.eclipse.osbp.ui.api.metadata.IDSLMetadataService" name="bindDSLMetadataService" policy="dynamic" unbind="unbindDSLMetadataService"/>
    <reference bind="bind" cardinality="1..1" interface="org.osgi.service.http.HttpService" name="bindHttpService" policy="static" target="(org.eclipse.osbp.ecview.jetty.serviceType=application)" unbind="unbind"/>
    <reference bind="bindResourceInfoProvider" cardinality="1..1" interface="org.eclipse.osbp.vaaclipse.api.ResourceInfoProvider" name="bindResourceInfoProvider" policy="static" unbind="unbindResourceInfoProvider"/>
    <reference bind="bindThemeEngine" cardinality="1..1" interface="org.eclipse.osbp.vaaclipse.publicapi.theme.ThemeEngine" name="bindThemeEngine" policy="static" unbind="unbindThemeEngine"/>
diff --git a/org.eclipse.osbp.vaaclipse.addons.app/src/org/eclipse/osbp/vaaclipse/addons/app/resources/StaticResources.java b/org.eclipse.osbp.vaaclipse.addons.app/src/org/eclipse/osbp/vaaclipse/addons/app/resources/StaticResources.java
index e590129..1c8961f 100644
--- a/org.eclipse.osbp.vaaclipse.addons.app/src/org/eclipse/osbp/vaaclipse/addons/app/resources/StaticResources.java
+++ b/org.eclipse.osbp.vaaclipse.addons.app/src/org/eclipse/osbp/vaaclipse/addons/app/resources/StaticResources.java
@@ -14,6 +14,7 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.URL;
+import java.util.List;
 import java.util.Map;
 
 import javax.servlet.ServletException;
@@ -21,18 +22,30 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
+import org.eclipse.osbp.ui.api.user.IUser;
 import org.eclipse.osbp.vaaclipse.api.ResourceInfoProvider;
 import org.eclipse.osbp.vaaclipse.publicapi.theme.Theme;
 import org.eclipse.osbp.vaaclipse.publicapi.theme.ThemeContribution;
 import org.eclipse.osbp.vaaclipse.publicapi.theme.ThemeEngine;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.nodes.TextNode;
+import org.jsoup.select.Elements;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
 import org.osgi.service.component.annotations.Reference;
 import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
 import org.osgi.service.http.HttpService;
 
+import com.vaadin.server.VaadinSession;
+
 /**
  * This class runs as an OSGi component and serves the themes and widgetsets
  * directly from the core Vaadin bundle.
@@ -63,6 +76,9 @@
 	/** The theme engine. */
 	private ThemeEngine themeEngine;
 
+	/** The dsl metadata service for translations. */
+	private IDSLMetadataService dslMetadataService;
+
 	/** The alias. */
 	private String alias;
 
@@ -116,6 +132,27 @@
 	}
 
 	/**
+	 * Bind DSL Metadata Service.
+	 *
+	 * @param provider
+	 *            the provider
+	 */
+	@Reference(name = "bindDSLMetadataService", service = IDSLMetadataService.class, policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.MANDATORY)
+	public void bindDSLMetadataService(IDSLMetadataService dslMetadataService) {
+		this.dslMetadataService = dslMetadataService;
+	}
+
+	/**
+	 * Unbind resource DSL Metadata Service.
+	 *
+	 * @param provider
+	 *            the provider
+	 */
+	public void unbindDSLMetadataService(IDSLMetadataService dslMetadataService) {
+		this.dslMetadataService = null;
+	}
+
+	/**
 	 * Bind theme engine.
 	 *
 	 * @param themeEngine
@@ -147,8 +184,7 @@
 	 *             the exception
 	 */
 	@Activate
-	public void start(BundleContext ctx, Map<String, String> properties)
-			throws Exception {
+	public void start(BundleContext ctx, Map<String, String> properties) throws Exception {
 		alias = properties.get("http.alias");
 		httpService.registerServlet(alias, this, null, null);
 	}
@@ -161,16 +197,38 @@
 		httpService.unregister(alias);
 	}
 
+	// @Override
+	// protected void service(HttpServletRequest request, HttpServletResponse
+	// response)
+	// throws ServletException, IOException {
+	// // Handle context root request without trailing slash, see #9921
+	// if (handleContextRootWithoutSlash(request, response)) {
+	// return;
+	// }
+	// CurrentInstance.clearAll();
+	//
+	// VaadinServletRequest vaadinRequest = createVaadinRequest(request);
+	// if (isStaticResourceRequest(vaadinRequest)) {
+	// // Define current servlet and service, but no request and response
+	// getService().setCurrentInstances(null, null);
+	// try {
+	// doGet(request, response);
+	// return;
+	// } finally {
+	// CurrentInstance.clearAll();
+	// }
+	// }
+	//
+	// }
+
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see
-	 * javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest
-	 * , javax.servlet.http.HttpServletResponse)
+	 * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.
+	 * HttpServletRequest , javax.servlet.http.HttpServletResponse)
 	 */
 	@Override
-	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
-			throws ServletException, IOException {
+	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 
 		if (this.resourceInfoProvider == null)
 			resp.sendError(HttpServletResponse.SC_CONFLICT);
@@ -190,10 +248,8 @@
 		if (themeId == null || themeId.isEmpty()) {
 			themeId = resourceInfoProvider.getCssTheme();
 		}
-		InputStream in = getInputStream(resourcePath,
-				themeEngine.getTheme(themeId),
-				resourceInfoProvider.getApplicationtWidgetset(),
-				resourceInfoProvider.getApplicationtWidgetsetName(),
+		InputStream in = getInputStream(resourcePath, themeEngine.getTheme(themeId),
+				resourceInfoProvider.getApplicationtWidgetset(), resourceInfoProvider.getApplicationtWidgetsetName(),
 				resourceInfoProvider.getApplicationHeaderIcon());
 
 		if (in == null) {
@@ -201,19 +257,40 @@
 			return;
 		}
 
+		boolean translatable = false;
+		if (resourcePath.contains("TRANSLATABLE")) {
+			translatable = true;
+		}
 		try {
-			OutputStream out = resp.getOutputStream();
-
-			byte[] buffer = new byte[1024];
-			int read = 0;
-
-			try {
-				while (-1 != (read = in.read(buffer))) {
-					out.write(buffer, 0, read);
+			if (translatable && dslMetadataService != null) {
+				Document doc = Jsoup.parse(in, "utf-8", resourcePath);
+				Elements els = doc.body().getAllElements();
+				for (Element e : els) {
+					List<TextNode> tnList = e.textNodes();
+					for (TextNode tn : tnList) {
+						String orig = tn.text();
+						if (orig.startsWith("$") && orig.endsWith("$")) {
+							String localeTag = req.getParameter("localeTag");
+							String trans = dslMetadataService.translate(localeTag,
+									orig.substring(1, orig.length() - 1));
+							tn.text(orig.replace(orig, trans));
+						}
+					}
 				}
-			} finally {
-				out.close();
+				String html = doc.toString();
+				try (OutputStream out = resp.getOutputStream()) {
+					out.write(html.getBytes("utf-8"), 0, html.getBytes("utf-8").length);
+				}
+			} else {
+				byte[] inbuffer = new byte[1024];
+				int read = 0;
+				try (OutputStream out = resp.getOutputStream()) {
+					while (-1 != (read = in.read(inbuffer))) {
+						out.write(inbuffer, 0, read);
+					}
+				}
 			}
+
 		} catch (Exception e) {
 			e.printStackTrace();
 			resp.sendError(HttpServletResponse.SC_NOT_FOUND);
@@ -237,11 +314,11 @@
 	 *            the header icon uri
 	 * @return the input stream
 	 */
-	public InputStream getInputStream(String url, Theme theme,
-			String e4WidgetsetUri, String e4WidgetsetName, String headerIconUri) {
+	public InputStream getInputStream(String url, Theme theme, String e4WidgetsetUri, String e4WidgetsetName,
+			String headerIconUri) {
 		String path = null;
 
-		StringBuffer urlString = new StringBuffer(url);
+		StringBuilder urlString = new StringBuilder(url);
 		urlString.trimToSize();
 		if (urlString.length() == 0)
 			throw new IllegalArgumentException();
@@ -257,9 +334,6 @@
 			throw new IllegalArgumentException();
 
 		if (segments[1].equals("widgetsets")) {
-			// return
-			// "platform:/plugin/org.eclipse.osbp.vaaclipse.resources" +
-			// url;
 			String widgetSetName = segments[2];
 			if (e4WidgetsetName.equals(widgetSetName)) {
 				String restPath = buildSegments(segments, 3);
@@ -280,26 +354,18 @@
 														// bundle path
 					{
 						String bundleName = segments[4];
-						path = "platform:/plugin/" + bundleName + "/"
-								+ buildSegments(segments, 5);
+						path = "platform:/plugin/" + bundleName + "/" + buildSegments(segments, 5);
 					} else {// this is relative theme path
 						if (url.endsWith("css")) {
-							String cssFileName = url.substring(url
-									.lastIndexOf('/') + 1);
-							cssFileName = cssFileName.substring(0,
-									cssFileName.lastIndexOf('.'));
-							ThemeContribution themeContribution = themeEngine
-									.getThemeContributionByWebId(cssFileName);
+							String cssFileName = url.substring(url.lastIndexOf('/') + 1);
+							cssFileName = cssFileName.substring(0, cssFileName.lastIndexOf('.'));
+							ThemeContribution themeContribution = themeEngine.getThemeContributionByWebId(cssFileName);
 							if (themeContribution != null)
 								path = themeContribution.getCssUri();
 							else {
 								for (String cssUri : theme.getAllCssURIs()) {
-									String relPath = buildSegments(
-											segments, 3);
-									String cssPath = cssUri.substring(0,
-											cssUri.lastIndexOf('/'))
-											+ "/"
-											+ relPath;
+									String relPath = buildSegments(segments, 3);
+									String cssPath = cssUri.substring(0, cssUri.lastIndexOf('/')) + "/" + relPath;
 									try {
 										URL cssUrl = new URL(cssPath);
 										return cssUrl.openStream();
@@ -351,7 +417,7 @@
 	 * @return the string
 	 */
 	private static String buildSegments(String[] segments, int start) {
-		StringBuffer b = new StringBuffer();
+		StringBuilder b = new StringBuilder();
 		for (int i = start; i < segments.length; i++) {
 			b.append(segments[i]);
 			b.append('/');
diff --git a/org.eclipse.osbp.vaaclipse.addons.app/src/org/eclipse/osbp/vaaclipse/addons/app/webapp/VaadinUI.java b/org.eclipse.osbp.vaaclipse.addons.app/src/org/eclipse/osbp/vaaclipse/addons/app/webapp/VaadinUI.java
index df94015..4ca2e01 100644
--- a/org.eclipse.osbp.vaaclipse.addons.app/src/org/eclipse/osbp/vaaclipse/addons/app/webapp/VaadinUI.java
+++ b/org.eclipse.osbp.vaaclipse.addons.app/src/org/eclipse/osbp/vaaclipse/addons/app/webapp/VaadinUI.java
@@ -12,11 +12,15 @@
 
 package org.eclipse.osbp.vaaclipse.addons.app.webapp;
 
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.util.ArrayList;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.UUID;
@@ -44,7 +48,9 @@
 import org.eclipse.e4.ui.internal.workbench.PlaceholderResolver;
 import org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory;
 import org.eclipse.e4.ui.internal.workbench.WorkbenchLogger;
+import org.eclipse.e4.ui.model.application.MAddon;
 import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.MApplicationFactory;
 import org.eclipse.e4.ui.model.application.MContribution;
 import org.eclipse.e4.ui.model.application.commands.impl.CommandsPackageImpl;
 import org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl;
@@ -172,6 +178,20 @@
 
 	/** The temp user store. */
 	private static Map<String, Object[]> tempUserStore = new HashMap<String, Object[]>();
+	
+	private static List<String> addOns = new ArrayList<String>() {
+		private static final long serialVersionUID = 1L;
+	{
+		add("bundleclass://org.eclipse.osbp.vaaclipse.addons.softwarefactory/org.eclipse.osbp.vaaclipse.addons.softwarefactory.service.OSBPServiceAddon");
+		add("bundleclass://org.eclipse.e4.core.commands/org.eclipse.e4.core.commands.CommandServiceAddon");
+		add("bundleclass://org.eclipse.e4.ui.services/org.eclipse.e4.ui.services.ContextServiceAddon");
+		add("bundleclass://org.eclipse.e4.ui.bindings/org.eclipse.e4.ui.bindings.BindingServiceAddon");
+		add("bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.CommandProcessingAddon");
+		add("bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.HandlerProcessingAddon");
+		add("bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.ContextProcessingAddon");
+		add("bundleclass://org.eclipse.osbp.vaaclipse.emf.addon/org.eclipse.osbp.vaaclipse.addon.EMFAddon");
+		add("bundleclass://org.eclipse.osbp.vaaclipse.addons.keybinding/org.eclipse.osbp.vaaclipse.addons.keybinding.KeyBindingServiceAddon");
+	}};
 
 	/**
 	 * Instantiates a new vaadin ui.
@@ -499,14 +519,21 @@
 			ContextInjectionFactory.invoke(lcManager, ProcessRemovals.class, appContext, null);
 		}
 		// Create the addons
-		for (MContribution addon : appModel.getAddons()) {
+//		for (MContribution addon : appModel.getAddons()) {
+//			Object obj = factory.create(addon.getContributionURI(), appContext);
+//			addon.setObject(obj);
+//		}
+		
+		// Create pre-defined addOns and discard the model
+		for (String contributionUri : addOns) {
+			MAddon addon = MApplicationFactory.INSTANCE.createAddon();
+			addon.setContributionURI(contributionUri);
+			addon.setElementId(UUID.randomUUID().toString());
 			Object obj = factory.create(addon.getContributionURI(), appContext);
 			addon.setObject(obj);
 		}
 
-		E4Workbench e4Workbench = new E4Workbench(appModel, appContext);
-
-		return e4Workbench;
+		return new E4Workbench(appModel, appContext);
 	}
 
 	/**
@@ -581,6 +608,12 @@
 		logger.debug("VaadinE4Application.loadApplicationModel()");
 		MApplication theApp = null;
 
+		RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
+		List<String> arguments = runtimeMxBean.getInputArguments();
+		if(arguments.contains("-XstartOnFirstThread")) {
+			throw new RuntimeException("Please remove the -XstartOnFirstThread for Mac-OS from launch configuration. Else OSBP will crash.");
+		}
+		
 		instanceLocation = VaadinE4Application.getInstance().getInstanceLocation();
 
 		String appModelPath = getArgValue(E4Workbench.XMI_URI_ARG, appContext, false);
