catch up with branch development

Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
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);