adjusted legal info, refactoring
diff --git a/jenkins.build.config.xml b/jenkins.build.config.xml
index 130185a..c8ee5d9 100644
--- a/jenkins.build.config.xml
+++ b/jenkins.build.config.xml
@@ -53,7 +53,6 @@
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.i18n</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.menu</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.perspective</jenkins.build.dependency>
-                <jenkins.build.dependency>org.eclipse.osbp.xtext.strategy</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.table</jenkins.build.dependency>
         </jenkins.build.dependencies>
 </jenkins>
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/feature.xml b/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/feature.xml
index c44ed7d..89bbac5 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/feature.xml
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory.feature/feature.xml
@@ -17,7 +17,7 @@
         label="%featureName"
         version="0.9.0.qualifier"
         provider-name="%providerName"
-		plugin="org.eclipse.osbp.vaaclipse.addons.softwarefactory">
+		plugin="org.eclipse.osbp.license">
         
     <description>
         %description
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/META-INF/MANIFEST.MF b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/META-INF/MANIFEST.MF
index a059916..890a208 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/META-INF/MANIFEST.MF
@@ -73,7 +73,8 @@
  org.eclipse.osbp.runtime.web.ecview.presentation.vaadin;bundle-version="0.9.0",
  org.eclipse.osbp.runtime.web.vaadin.common;bundle-version="0.9.0",
  org.eclipse.osbp.webserver.messagequeue;bundle-version="0.9.0",
- org.eclipse.osbp.vaaclipse.common.ecview;bundle-version="0.9.0"
+ org.eclipse.osbp.vaaclipse.common.ecview;bundle-version="0.9.0",
+ org.eclipse.osbp.ecview.extension.strategy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Import-Package: javax.annotation,
  javax.jms;version="1.1.0",
@@ -95,7 +96,6 @@
  org.eclipse.osbp.vaadin.optiondialog;version="0.9.0",
  org.eclipse.osbp.xtext.builder.metadata.services;version="0.9.0",
  org.eclipse.osbp.xtext.menu.common;version="0.9.0",
- org.eclipse.osbp.xtext.strategy;version="0.9.0",
  org.eclipse.osbp.xtext.table;version="0.9.0",
  org.eclipse.xtext.resource,
  org.vaadin.hene.popupbutton;version="2.5.0"
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/UserHandler.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/UserHandler.java
index 1ae2f49..ad802fb 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/UserHandler.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/handler/UserHandler.java
@@ -130,6 +130,8 @@
 			popup.addStyleName("os-usermenubutton");
 			popup.setContent(userMenu.getMenu(popup));
 			buttons.addComponent(popup);
+		} else {
+			log.info("UserMenu is hidden due to prefereces!");
 		}
 
 		container.addComponent(form);
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/keybinding/KeyBindingDialogProvider.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/keybinding/KeyBindingDialogProvider.java
index 86f10da..6801f30 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/keybinding/KeyBindingDialogProvider.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/keybinding/KeyBindingDialogProvider.java
@@ -20,37 +20,26 @@
 
 import javax.inject.Inject;
 
-import org.eclipse.core.commands.CommandManager;
 import org.eclipse.core.commands.common.NotDefinedException;
 import org.eclipse.e4.ui.model.application.commands.MBindingContext;
 import org.eclipse.e4.ui.model.application.commands.MBindingTable;
 import org.eclipse.e4.ui.model.application.commands.MCommand;
 import org.eclipse.e4.ui.model.application.commands.MKeyBinding;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.osbp.dsl.metadata.service.DSLBuilderParticipant.DSLMetadataService;
-import org.eclipse.osbp.runtime.common.i18n.II18nService;
 import org.eclipse.osbp.ui.api.contextfunction.IVaadinDialogProvider;
 import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
 import org.eclipse.osbp.ui.api.user.IUser;
 import org.eclipse.osbp.vaaclipse.addons.keybinding.IKeyBindingService;
 
-import com.vaadin.data.Property;
-import com.vaadin.data.Property.ValueChangeEvent;
 import com.vaadin.data.util.BeanItemContainer;
-import com.vaadin.event.ItemClickEvent;
 import com.vaadin.ui.Component;
 import com.vaadin.ui.Table;
-import com.vaadin.ui.UI;
 import com.vaadin.ui.VerticalLayout;
 
 /**
  * The Class KeyBindingDialogProvider.
  */
 public class KeyBindingDialogProvider implements IVaadinDialogProvider, IUser.UserLocaleListener {
-	/** The command manager. */
-	@Inject
-	private CommandManager commandManager;
-
 	/** The metadata service. */
 	@Inject
 	private IDSLMetadataService dslMetadataService;
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/BrowserView.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/BrowserView.java
index a939fff..53ac6cb 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/BrowserView.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/BrowserView.java
@@ -8,18 +8,9 @@
 import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.ui.di.Focus;
 import org.eclipse.e4.ui.model.application.MApplication;
-import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
 import org.eclipse.e4.ui.model.application.ui.basic.MPart;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.osbp.ecview.core.extension.model.extension.YBrowser;
-import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent;
-import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherCommand;
-import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherDataTag;
-import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
 import org.eclipse.osbp.runtime.web.ecview.presentation.vaadin.common.BrowserComponent;
-import org.eclipse.osbp.runtime.web.ecview.presentation.vaadin.common.FilteringComponentEmbeddable;
 import org.eclipse.osbp.ui.api.e4.IE4Dialog;
-import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
 import org.eclipse.osbp.ui.api.perspective.IPerspectiveProvider;
 import org.eclipse.osbp.ui.api.user.IUser;
 
@@ -42,12 +33,6 @@
 	@Inject
 	private IUser user;
 
-	@Inject
-	private IEventDispatcher eventDispatcher;
-
-	@Inject
-	private IDSLMetadataService dslMetadataService;
-	
 	private VerticalLayout parent;
 	private BrowserComponent browserComponent;
 	private transient IEclipseContext context;
@@ -58,7 +43,6 @@
 		this.context = context;
 	}
 
-	@SuppressWarnings("unchecked")
 	@PostConstruct
 	public void createView() {
 		context.set(IE4Dialog.class, this);
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/DialogProvider.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/DialogProvider.java
index 9e25743..339584f 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/DialogProvider.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/DialogProvider.java
@@ -22,19 +22,18 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.function.Consumer;
 import java.util.Set;
 import java.util.UUID;
+import java.util.function.Consumer;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
+import javax.inject.Named;
 import javax.swing.Timer;
 
 import org.eclipse.e4.core.contexts.IEclipseContext;
@@ -44,8 +43,6 @@
 import org.eclipse.e4.ui.model.application.MApplication;
 import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
 import org.eclipse.e4.ui.model.application.ui.basic.MPart;
-import org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl;
-import org.eclipse.e4.ui.model.application.ui.impl.UiPackageImpl;
 import org.eclipse.e4.ui.workbench.IPresentationEngine;
 import org.eclipse.emf.common.notify.impl.AdapterImpl;
 import org.eclipse.emf.ecore.EObject;
@@ -62,7 +59,6 @@
 import org.eclipse.osbp.ecview.core.common.model.core.YEmbeddable;
 import org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent;
 import org.eclipse.osbp.ecview.core.common.model.core.YField;
-import org.eclipse.osbp.ecview.core.common.model.core.YFocusable;
 import org.eclipse.osbp.ecview.core.common.model.core.YView;
 import org.eclipse.osbp.ecview.core.common.model.core.util.BindingIdUtil;
 import org.eclipse.osbp.ecview.core.common.notification.AbstractReloadRequestService;
@@ -71,9 +67,11 @@
 import org.eclipse.osbp.ecview.core.common.store.IViewStore;
 import org.eclipse.osbp.ecview.core.common.validation.IFieldValidationManager;
 import org.eclipse.osbp.ecview.core.extension.model.extension.ExtensionModelPackage;
+import org.eclipse.osbp.ecview.core.extension.model.extension.YButton;
+import org.eclipse.osbp.ecview.core.extension.model.extension.listener.YButtonClickListener;
 import org.eclipse.osbp.ecview.core.util.emf.ModelUtil;
-import org.eclipse.osbp.ecview.dsl.extensions.SuperTypeCollector;
-import org.eclipse.osbp.ecview.extension.model.YStrategyLayout;
+import org.eclipse.osbp.ecview.extension.api.IFocusingStrategy;
+import org.eclipse.osbp.ecview.extension.api.ILayoutingStrategy;
 import org.eclipse.osbp.ecview.extension.presentation.vaadin.components.common.ECViewComponent;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanSlot;
 import org.eclipse.osbp.osgi.hybrid.api.AbstractHybridVaaclipseView;
@@ -88,7 +86,7 @@
 import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
 import org.eclipse.osbp.runtime.common.event.SelectionStore;
 import org.eclipse.osbp.runtime.common.filter.IDTOService;
-import org.eclipse.osbp.runtime.common.filter.IDTOServiceWithMutablePersistence;
+import org.eclipse.osbp.runtime.common.filter.IDTOService;
 import org.eclipse.osbp.runtime.common.validation.IStatus;
 import org.eclipse.osbp.runtime.common.validation.ValidationKind;
 import org.eclipse.osbp.runtime.web.vaadin.components.dialogs.AcceptDeleteDialog;
@@ -129,7 +127,6 @@
 import org.eclipse.osbp.xtext.action.common.IToolbarAction;
 import org.eclipse.osbp.xtext.dialogdsl.Dialog;
 import org.eclipse.osbp.xtext.dialogdsl.DialogFieldHook;
-import org.eclipse.xtext.common.types.JvmTypeReference;
 import org.eclipse.xtext.xbase.lib.Pair;
 import org.osgi.service.event.Event;
 import org.osgi.service.event.EventHandler;
@@ -138,6 +135,7 @@
 
 import com.vaadin.event.LayoutEvents.LayoutClickEvent;
 import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
 import com.vaadin.ui.Component;
 import com.vaadin.ui.HorizontalLayout;
 import com.vaadin.ui.Notification;
@@ -145,7 +143,6 @@
 import com.vaadin.ui.UI;
 import com.vaadin.ui.VerticalLayout;
 import com.vaadin.ui.Window;
-import com.vaadin.ui.Button.ClickEvent;
 
 /**
  * The Class ECViewDialog.
@@ -155,7 +152,8 @@
  */
 @SuppressWarnings("all")
 public class DialogProvider<DTO> extends AbstractHybridVaaclipseView implements 
-	IUser.UserLocaleListener, IEventDispatcher.Receiver, IFieldValidationManager.Listener , IE4Dialog, IViewEmbeddedProvider{
+	IUser.UserLocaleListener, IEventDispatcher.Receiver, IFieldValidationManager.Listener , IE4Dialog, 
+	IViewEmbeddedProvider, YButtonClickListener{
 
 	/** The Constant log. */
 	protected final static Logger log = LoggerFactory.getLogger("vaaclipseDialog");
@@ -241,7 +239,7 @@
 	protected ViewLayoutManager layoutManager;
 
 	/** The dto service. */
-	private IDTOServiceWithMutablePersistence<DTO> dtoService;
+	private IDTOService<DTO> dtoService;
 
 	/** The toolbar helper. */
 	private IToolbarAction toolbar;
@@ -276,11 +274,16 @@
 	/** The underlying xtext dialog model. */
 	private Dialog dialogModel = null; 
 	
+	@Inject
+	@Named("Focusing")
+	private IFocusingStrategy focusingStrategy;
+	
 	/** The reload request service for suggesttext fields. */
 	private IReloadRequestService reloadRequestService = new AbstractReloadRequestService() {
 		@Override
 		public void requestReload(YEmbeddable component, Object newDto) {
 			updateBindings(newDto);
+			setNewCreatedDto(newDto == null);
 		}
 	};
 
@@ -320,6 +323,8 @@
 
 	private VerticalLayout parent;
 
+	private YView yView;
+
 	/**
 	 * Instantiates a new abstract ec view dialog.
 	 *
@@ -356,9 +361,15 @@
 		}
 		parent.addStyleName(EnumCssClass.DIALOG_VIEW.toString());
 		layoutManager = new ViewLayoutManager();
-		layoutManager.init(parent);
+		if(dialogModel.isHasBackgroundImage()) {
+			layoutManager.init(parent, viewId.replaceAll("\\.","-") + "-"+dialogModel.getBackgroundImage(), themeResourceService.getThemeResourceRelativePath(dialogModel.getBackgroundImage(), ThemeResourceType.IMAGE));
+		} else {
+			layoutManager.init(parent);
+		}
+		
 		ecviewComponent.setSizeFull();
 		layoutManager.getDataArea().addComponent(ecviewComponent);
+		layoutManager.setLabelValue(dslMetadataService.translate(user.getLocale().toLanguageTag(), dialogLabel));
 		selectDialog = new SelectDialog();
 		// create toolbar
 		if(dialogModel.getToolbar() != null) {
@@ -374,18 +385,18 @@
 
 	private void initDialog() {
 		if(mPart != null) {
-	    	dialogModel = (Dialog) mPart.getTransientData().get("dialogModel");
+	    	dialogModel = (Dialog) mPart.getTransientData().get(IPerspectiveProvider.TRANSIENT_DIALOG_MODEL);
 	    } else {
-	    	dialogModel = (Dialog) eclipseContext.get("embeddedDialogModel");
+	    	dialogModel = (Dialog) eclipseContext.get(IPerspectiveProvider.TRANSIENT_EMBEDDED_DIALOG_MODEL);
 	    }
 		viewId = dslMetadataService.getECViewId(dialogModel);
 		dtoName = dslMetadataService.getFullyQualifiedName(dialogModel.getDto());
 		if(dtoName != null) {
 			LEntity entity = EntityUtils.getEntityFromDto(dialogModel.getDto());
-			entityName = EntityUtils.getFQNForLEntity(entity);
-			primaryKey = dslMetadataService.getFullyQualifiedName(entity)+"."+entity.getIdAttributeName();
+			entityName = entity!=null?EntityUtils.getFQNForLEntity(entity):"";
+			primaryKey = entity!=null?dslMetadataService.getFullyQualifiedName(entity)+"."+entity.getIdAttributeName():"";
 			dto = dslMetadataService.getClass(dialogModel.getDto(), "dto");
-			dtoService = (IDTOServiceWithMutablePersistence<DTO>) DtoServiceAccess.getService(dto);
+			dtoService = (IDTOService<DTO>) DtoServiceAccess.getService(dto);
 			subTypes = dslMetadataService.getAllSubtypes(user.getLocale().toLanguageTag(), dto);
 		}
 		dialogLabel = dialogModel.getName();
@@ -420,12 +431,14 @@
 			associationService = viewContext.getService(IWidgetAssocationsService.ID);
 			// bridges the validation from ECView core to Vaaclipse
 			setupValidationBridge();
-			YView yView = (YView) viewContext.getViewEditpart().getModel();
+			yView = (YView) viewContext.getViewEditpart().getModel();
 			if (yView == null) {
 				Notification.show("Dialog could not be found!", Type.ERROR_MESSAGE);
 				return;
 			}
 		}
+		
+		addSaveAndNewListener();
 
 		if(dialogModel.getGroup() != null) {
 			dialogFunctionGroup = functionLibraryService.getFunctionLibraryClass(dslMetadataService.getFullyQualifiedName(dialogModel.getGroup()));
@@ -448,7 +461,7 @@
 					postFocus = functionLibraryService.getMethod(dialogFunctionGroup, fieldHook.getPostFocus().getName());
 				}
 				Pair functions = new Pair(preFocus, postFocus);
-				YField fld = (YField)associationService.getModelElement(viewId+"."+dtoName+"."+fieldHook.getAttribute().getName());
+				YField fld = (YField)associationService.getModelElement(viewId+"."+dialogModel.getDto().getName()+"."+fieldHook.getAttribute().getName());
 				if(fld != null) {
 					fieldHooks.put(fld, functions);
 					fld.eAdapters().add(new AdapterImpl() {
@@ -475,6 +488,16 @@
 		}
 	}
 	
+	private void addSaveAndNewListener() {
+		List<EObject> elements = associationService.getModelElements();
+		for(EObject element:elements) {
+			if(element instanceof YButton && ((YButton)element).getTags().contains(ILayoutingStrategy.TAG__SAVEANDNEW)) {
+				((YButton)element).addClickListener(this);
+				((YButton)element).getTags().add(uuid);
+			}
+		}
+	}
+
 	public Component getContent() {
 		return parent;
 	}
@@ -512,58 +535,16 @@
 		}
 		return !result;
 	}
-
-	/**
-	 * Focus a field either by YField or by id.
-	 *
-	 * @param field the field
-	 * @param fieldId the field id
-	 */
-	private void focusField(YField field, String fieldId) {
-		YView yView = null;
-		YField yField = null;
-		Iterator<EObject> iter = ((EObject) viewContext.getViewEditpart().getModel()).eAllContents();
-		while (iter.hasNext()) {
-			EObject eObject = iter.next();
-			if(eObject instanceof YStrategyLayout) {
-				YStrategyLayout yLayout = (YStrategyLayout)eObject;
-				yView = yLayout.getView();
-			}
-			if (eObject instanceof YField) {
-				if(eObject instanceof YFocusable && ((YField) eObject).isVisible() && ((YField) eObject).isEditable() && ((YField) eObject).isEnabled()) {
-					yField = (YField) eObject;
-					// find field by id
-					if(fieldId != null) {
-						if(yField.getId().equals(fieldId)) {
-							break;
-						}
-					} else {
-						// either find first field focusable or the clicked field if not null
-						if(field == null || field.equals(yField)) {
-							break;
-						}
-					}
-				}
-			}
-		}
-		if(yView != null && yField != null) {
-			yView.setCurrentFocus(yField);
-		}
-		
-	}
 	
 	@Focus
 	public void setFocus() {
 		if(viewContext != null && mPart != null) {
-			YField clickedField = null;
+			String fieldId = null;
 			LayoutClickEvent event = mPart.getContext().get(LayoutClickEvent.class);
-			if(event != null) {
-				EObject element = associationService.getModelElement(event.getClickedComponent());
-				if(element instanceof YField) {
-					clickedField = (YField)element;
-				}
+			if(event != null && event.getClickedComponent() instanceof UI) {
+				fieldId = event.getClickedComponent().getId();
 			}
-			focusField(clickedField, null);
+			focusingStrategy.focusField(yView, fieldId);
 		}
 	}
 	
@@ -629,7 +610,6 @@
 			MPerspective mPersp = mPart.getContext().get(MPerspective.class);
 			for (Field field : DtoUtils.getOwnerDomainReferences(newDto.getClass())) {
 				if (mPersp != null) {
-					boolean found = false;
 					// look in dialog's contexts
 					List<IViewContext> contexts = ecviewContainer.getECViews(mPersp);
 					for (IViewContext context : contexts) {
@@ -645,21 +625,18 @@
 								Object beanCopy = ownerService.get(idVal);
 								if(beanCopy != null) {
 									DtoUtils.setValue(newDto, field.getName(), beanCopy);
-									found = true;
 								}
 							}
 						}
 					}
 					// look in context for selection
-					if(!found) {
-						String key = EntityUtils.getQualifiedEntityNameForQualifiedDtoName(field.getType().getName())+"."+DtoUtils.getIdField(field.getType()).getName();
-						Object idObj = SelectionStore.getSelectionFromPerspectiveContext(mPart, key);
-						if(idObj != null) {
-							IDTOService<? extends Object> ownerService = DtoServiceAccess.getService(field.getType());
-							Object beanCopy = ownerService.get(idObj);
-							if(beanCopy != null) {
-								DtoUtils.setValue(newDto, field.getName(), beanCopy);
-							}
+					String key = EntityUtils.getQualifiedEntityNameForQualifiedDtoName(field.getType().getName())+"."+DtoUtils.getIdField(field.getType()).getName();
+					Object idObj = SelectionStore.getSelectionFromPerspectiveContext(mPart, key);
+					if(!(idObj instanceof List<?>) && idObj != null) {
+						IDTOService<? extends Object> ownerService = DtoServiceAccess.getService(field.getType());
+						Object beanCopy = ownerService.get(idObj);
+						if(beanCopy != null) {
+							DtoUtils.setValue(newDto, field.getName(), beanCopy);
 						}
 					}
 				}
@@ -807,21 +784,6 @@
 
 	}
 
-	private boolean hasSupertype(UiBeanSlot slot, Class<?> clz) {
-		SuperTypeCollector collector = new SuperTypeCollector();
-		Set<String> result = new LinkedHashSet<>();
-		collector.collectSuperTypes(slot.getJvmType(), new SuperTypeCollector.SuperTypeAcceptor() {
-			@Override
-			public boolean accept(JvmTypeReference superType, int distance) {
-				if(superType.getQualifiedName().equals(clz.getName())) {
-					result.add(superType.getQualifiedName());
-				}
-				return true;
-			}
-		});
-		return !result.isEmpty();
-	}
-	
 	/**
 	 * Creates the rendering parameters.
 	 *
@@ -844,22 +806,22 @@
 		    	@Override
 		    	public void beforeUiRendering(IContext viewContext) {
 		    		for(UiBeanSlot slot : dialogModel.getUiView().getBeanSlots()) {
-		    			if(hasSupertype(slot, IDto.class)) {
+		    			if(dslMetadataService.hasSupertype(slot.getJvmType(), IDto.class)) {
 		    				Class<?> dtoClass = dslMetadataService.getClass(slot.getJvmType().getQualifiedName(), "dto");
 		    				viewContext.createBeanSlot(slot.getName(), dtoClass).setValue(dslMetadataService.getClassInstance(dtoClass, "dto"));
-		    			} else if(hasSupertype(slot, IStateMachineParticipant.class) || hasSupertype(slot, IPeripheral.class)) {
+		    			} else if(dslMetadataService.hasSupertype(slot.getJvmType(), IStateMachineParticipant.class) || dslMetadataService.hasSupertype(slot.getJvmType(), IPeripheral.class)) {
 		    				Class<?> participantClass = dslMetadataService.getClass(slot.getJvmType().getQualifiedName(), "statemachine");
 		    				IStateMachineParticipant participantInstance = (IStateMachineParticipant)dslMetadataService.getClassInstance(participantClass, "statemachine");
 		    				participantInstance.setLocale(user.getLocale());
 		    				viewContext.createBeanSlot(slot.getName(), participantClass).setValue(participantInstance);
-		    			} else if(hasSupertype(slot, IStateMachine.class)) {
+		    			} else if(dslMetadataService.hasSupertype(slot.getJvmType(), IStateMachine.class)) {
 		    				Class<?> statemachineClass = dslMetadataService.getClass(slot.getJvmType().getQualifiedName(), "statemachine");
 		    				IStateMachine statemachineInstance = (IStateMachine)dslMetadataService.getClassInstance(statemachineClass, "statemachine");
 		    				statemachineInstance.setLocale(user.getLocale());
 		    				statemachineInstance.setUser(user);
 		    				statemachineInstance.setEclipseContext(eclipseContext);
 		    				viewContext.createBeanSlot(slot.getName(), statemachineClass).setValue(statemachineInstance);
-		    			} else if(hasSupertype(slot, IBlobConverter.class)) {
+		    			} else if(dslMetadataService.hasSupertype(slot.getJvmType(), IBlobConverter.class)) {
 				    		viewContext.createBeanSlot(slot.getName(), BlobConverter.class).setValue(new BlobConverter(blobService));
 		    			}
 		    		}
@@ -874,12 +836,12 @@
 		    	@Override
 		    	public void afterBind(IContext context) {
 		    		for(UiBeanSlot slot : dialogModel.getUiView().getBeanSlots()) {
-		    			if(hasSupertype(slot, IStateMachineParticipant.class)) {
+		    			if(dslMetadataService.hasSupertype(slot.getJvmType(), IStateMachineParticipant.class)) {
 		    				((IStateMachineParticipant)context.getBeanSlot(slot.getName()).getValue()).init();
 		    			}
-		    			if(hasSupertype(slot, IDataProvider.class)) {
+		    			if(dslMetadataService.hasSupertype(slot.getJvmType(), IDataProvider.class)) {
 				    		for(UiBeanSlot innerslot : dialogModel.getUiView().getBeanSlots()) {
-				    			if(hasSupertype(innerslot, IDto.class)) {
+				    			if(dslMetadataService.hasSupertype(innerslot.getJvmType(), IDto.class)) {
 						    		if (context.getBeanSlot(innerslot.getName()) != null) {
 						    			((IDataProvider)context.getBeanSlot(slot.getName()).getValue()).addDatasource(innerslot.getName(), context.getBeanSlot(innerslot.getName()).getValueType());
 						    		}
@@ -889,7 +851,7 @@
 		    		}
 		    		// at the very end - start the statemachines
 		    		for(UiBeanSlot slot : dialogModel.getUiView().getBeanSlots()) {
-		    			if(hasSupertype(slot, IStateMachine.class)) {
+		    			if(dslMetadataService.hasSupertype(slot.getJvmType(), IStateMachine.class)) {
 		    				((IStateMachine)context.getBeanSlot(slot.getName()).getValue()).start();
 		    			}
 		    		}
@@ -1065,46 +1027,19 @@
 						makeNew();
 						break;
 					case DIALOG_ACTION_SAVE_AS_NEW:
-						DTO newDto = (DTO) DtoUtils.copyDto(viewContext.getBean(IViewContext.MAIN_BEAN_SLOT));
-						if(validate(newDto)) {
-							executeDialogFunction("pre save", preSaveMethod, newDto);
-							dtoService.update(newDto);
-							newDto = dtoService.reload(newDto);
-							executeDialogFunction("post save", postSaveMethod, newDto);
-							updateBindings(newDto);
-							setNewCreatedDto(false);
-						    Notification.show(dslMetadataService.translate(user.getLocale().toLanguageTag(), "savedas"),Notification.Type.HUMANIZED_MESSAGE);
-						}
+						actionSaveAsNew();
 					    break;
 					case DIALOG_ACTION_SAVE_AND_NEW:
+						actionSaveAndNew();
+						break;
 					case DIALOG_ACTION_SAVE:
-						DTO savedDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
-						if(validate(savedDto)) {
-							executeDialogFunction("pre save", preSaveMethod, savedDto);
-							dtoService.update(savedDto);
-							newDto = dtoService.reload(savedDto);
-							executeDialogFunction("post save", postSaveMethod, newDto);
-						    if(enumId == DialogActionEnum.DIALOG_ACTION_SAVE_AND_NEW) {
-						    	if(lastBaseDto != null) {
-									createNew(lastBaseDto);
-						    	} else {
-						    		makeNew();
-						    	}
-							    Notification.show(dslMetadataService.translate(user.getLocale().toLanguageTag(), "savedandnew"),Notification.Type.HUMANIZED_MESSAGE);
-						    } else {
-						    	updateBindings(newDto);
-						    	setNewCreatedDto(false);
-							    Notification.show(dslMetadataService.translate(user.getLocale().toLanguageTag(), "saved"),Notification.Type.HUMANIZED_MESSAGE);
-						    }
-						}
+						actionSave();
 						break;
 					case DIALOG_ACTION_DELETE:
 						showQueryDeleteDialog();
 						break;
 					case DIALOG_ACTION_CANCEL:
-						DTO reloadedDto = dtoService.reload((DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT));
-				    	setNewCreatedDto(reloadedDto != null);
-						updateBindings(reloadedDto);
+						actionCancel();
 						break;
 					}
 				} else if (id instanceof UIActionEnum) {
@@ -1126,23 +1061,73 @@
 		}
 	}
 
-	private void executeDialogFunction(String what, Method method, Object dto) {
+	private void actionCancel() {
+		DTO reloadedDto = dtoService.reload((DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT));
+		setNewCreatedDto(reloadedDto == null);
+		updateBindings(reloadedDto);
+	}
+
+	private void actionSave() {
+		DTO savedDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
+		if(validate(savedDto)) {
+			executeDialogFunction("pre save", preSaveMethod, savedDto);
+			dtoService.update(savedDto);
+			DTO newDto = dtoService.reload(savedDto);
+			executeDialogFunction("post save", postSaveMethod, newDto);
+	    	updateBindings(newDto);
+	    	setNewCreatedDto(false);
+		    Notification.show(dslMetadataService.translate(user.getLocale().toLanguageTag(), "saved"),Notification.Type.HUMANIZED_MESSAGE);
+		}
+	}
+
+	private void actionSaveAndNew() {
+		DTO savedDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
+		if(validate(savedDto)) {
+			executeDialogFunction("pre save", preSaveMethod, savedDto);
+			dtoService.update(savedDto);
+			DTO newDto = dtoService.reload(savedDto);
+			executeDialogFunction("post save", postSaveMethod, newDto);
+			if(lastBaseDto != null) {
+				createNew(lastBaseDto);
+			} else {
+				makeNew();
+			}
+			Notification.show(dslMetadataService.translate(user.getLocale().toLanguageTag(), "savedandnew"),Notification.Type.HUMANIZED_MESSAGE);
+		}
+	}
+
+	private void actionSaveAsNew() {
+		DTO newDto = (DTO) DtoUtils.copyDto(viewContext.getBean(IViewContext.MAIN_BEAN_SLOT));
+		if(validate(newDto)) {
+			executeDialogFunction("pre save", preSaveMethod, newDto);
+			dtoService.update(newDto);
+			newDto = dtoService.reload(newDto);
+			executeDialogFunction("post save", postSaveMethod, newDto);
+			updateBindings(newDto);
+			setNewCreatedDto(false);
+		    Notification.show(dslMetadataService.translate(user.getLocale().toLanguageTag(), "savedas"),Notification.Type.HUMANIZED_MESSAGE);
+		}
+	}
+
+	private boolean executeDialogFunction(String what, Method method, Object obj) {
 		if(method != null) {
 			Boolean retVal = false;
 			Exception ex = null;
 			try {
-				retVal = (Boolean) method.invoke(dialogFunctionGroup, dto, renderingParams);
+				retVal = (Boolean) method.invoke(dialogFunctionGroup, obj, eclipseContext);
 			} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
 				ex = e;
 			}
 			if(!retVal) {
-				String message = what+" "+dialogModel.getPostSave().getName()+" failed";
+				String message = what+" "+method.getName()+" failed";
 				if(ex != null) {
 					message += " due to exception " + ex.getCause();
 				}
 				Notification.show(message, Type.ERROR_MESSAGE);
+				return false;
 			}
 		}
+		return true;
 	}
 
 	private void handleSelectEvent(EventDispatcherEvent event) {
@@ -1243,7 +1228,7 @@
 					String partId = (String) event.getProperty(IE4Topics.PartEvents.PROP_MPART_ID);
 					String fieldId = (String) event.getProperty(IE4Topics.PartEvents.PROP_FIELD_ID);
 					if(mPart.getElementId().equals(partId)) {
-						focusField(null, fieldId);
+						focusingStrategy.focusField(yView, fieldId);
 					}
 				}
 			};
@@ -1353,7 +1338,7 @@
 	public void setInput(Object dto) {
 		this.dto = (Class<?>) dto;
 		if (dto != null && viewContext != null) {
-			dtoService = (IDTOServiceWithMutablePersistence<DTO>) DtoServiceAccess.getService(this.dto);
+			dtoService = (IDTOService<DTO>) DtoServiceAccess.getService(this.dto);
 			DTO persistentDto = dtoService.get(DtoUtils.getIdValue(dto));
 			viewContext.setBean(IViewContext.MAIN_BEAN_SLOT, persistentDto);
 		}
@@ -1470,4 +1455,14 @@
 	public IBlobService getBlobService() {
 		return blobService;
 	}
+
+	@Override
+	public void clicked(YButton yButton) {
+		// only if the click is for this instance
+		for(String tag:yButton.getTags()) {
+			if(uuid.equals(tag)) {
+				actionSaveAndNew();
+			}
+		}
+	}
 }
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/KanbanView.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/KanbanView.java
index 4087f5b..0ce1153 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/KanbanView.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/KanbanView.java
@@ -29,10 +29,6 @@
 
 public class KanbanView
 		implements IUser.UserLocaleListener, IE4Dialog {
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
 	@Inject
 	MPart part;
 
@@ -107,9 +103,9 @@
 		dialogWindow.center();
 	}
 	
-	private void refreshCard(Object dto){
-		kanbanBoard.refreshCard(dto);
-	}
+//	private void refreshCard(Object dto){
+//		kanbanBoard.refreshCard(dto);
+//	}
 
 	@PostConstruct
 	public void activate() {
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/PerspectiveProvider.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/PerspectiveProvider.java
index 7e9dbf2..b661cc2 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/PerspectiveProvider.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/PerspectiveProvider.java
@@ -15,6 +15,9 @@
  */
 package org.eclipse.osbp.vaaclipse.addons.softwarefactory.perspective;
 
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -69,6 +72,7 @@
 import org.eclipse.osbp.dsl.common.datatypes.IDto;
 import org.eclipse.osbp.ecview.core.extension.model.extension.ExtensionModelPackage;
 import org.eclipse.osbp.eventbroker.EventBrokerMsg;
+import org.eclipse.osbp.preferences.ProductConfiguration;
 import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent;
 import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherCommand;
 import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherDataTag;
@@ -79,7 +83,9 @@
 import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
 import org.eclipse.osbp.ui.api.themes.IThemeResourceService.ThemeResourceType;
 import org.eclipse.osbp.ui.api.user.IUser;
+import org.eclipse.osbp.ui.api.useraccess.IUserAccessService;
 import org.eclipse.osbp.utils.vaadin.bpmn.BpmnView;
+import org.eclipse.osbp.utils.vaadin.saiku.SaikuView;
 import org.eclipse.osbp.vaaclipse.addons.softwarefactory.maintoolbar.IMainToolbarProvider;
 import org.eclipse.osbp.vaaclipse.addons.softwarefactory.welcome.WelcomeView;
 import org.eclipse.osbp.vaaclipse.publicapi.authentication.AuthenticationConstants;
@@ -117,6 +123,7 @@
 import org.eclipse.osbp.xtext.perspective.PerspectivePart;
 import org.eclipse.osbp.xtext.perspective.PerspectivePartStack;
 import org.eclipse.osbp.xtext.perspective.PerspectiveReport;
+import org.eclipse.osbp.xtext.perspective.PerspectiveSaiku;
 import org.eclipse.osbp.xtext.perspective.PerspectiveSashContainer;
 import org.eclipse.osbp.xtext.perspective.PerspectiveSearch;
 import org.eclipse.osbp.xtext.perspective.PerspectiveSelection;
@@ -139,6 +146,7 @@
 import org.osgi.service.event.EventHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import com.vaadin.server.Page;
 
 /**
  * The Class PerspectiveProvider. Available as injectable service to create and
@@ -217,6 +225,9 @@
 	/** The perspective tasks. */
 	private Map<BPMTaskSummary, String> perspectiveTasks = new HashMap<>();
 
+	@Inject
+	private IUserAccessService userAccessService;
+
 	/**
 	 * Inits the PerspectiveSupport.
 	 */
@@ -326,7 +337,13 @@
 		perspective.getTags().add(IPerspectiveProvider.E4Constants.TAG_REMOVE_ON_CLOSE);
 		perspective.getTags().add(IPerspectiveProvider.E4Constants.TAG_NOT_IN_OPEN_PERSPECTIVE_DIALOG);
 
-		perspective.setElementId(PerspectiveProvider.toPerspectiveElementId(perspectiveId));
+		String newPerspectiveId = toPerspectiveElementId(perspectiveId);
+		int offset = 0;
+		while(isPerspectiveIdAlreadyInUse(stack, newPerspectiveId)){
+			newPerspectiveId = toPerspectiveElementId(perspectiveId + offset++);
+		}
+		
+		perspective.setElementId(newPerspectiveId);
 		perspective.setLabel(perspectiveModel.getName());
 		perspective.setVisible(true);
 		perspective.setToBeRendered(true);
@@ -356,6 +373,18 @@
 		}
 		return perspective;
 	}
+	
+	private boolean isPerspectiveIdAlreadyInUse(MPerspectiveStack stack, String perspectiveId){
+		if(stack != null && stack.getChildren() != null && !stack.getChildren().isEmpty() 
+		&& perspectiveId != null && !perspectiveId.isEmpty()){
+			for(MPerspective perspective : stack.getChildren()){
+				if(perspective.getElementId().equals(perspectiveId)){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
 
 	/**
 	 * Register context.
@@ -374,22 +403,26 @@
 		String operativeDtoFqn = null;
 		List<IDto> operativeDtos = null;
 
-		if (taskClient != null) {
-			workloadDtoFqn = taskClient.getWorkloadDtoFqn(perspectiveFound.taskSummary);
-			workloadDto = taskClient.getWorkloadDto(perspectiveFound.taskSummary);
-			if (perspectiveFound.blipTask != null) {
-				startInfo = taskProvider.getStartInfo(perspectiveFound.taskSummary);
-			}
+		if (taskClient != null && perspectiveFound.blipTask != null) {
+			startInfo = taskProvider.getStartInfo(perspectiveFound.taskSummary);
 			if (startInfo != null) {
 				task = startInfo.getWorkloadMofifiableBpmItemForBlipId(perspectiveFound.blipTask.getName());
-			}
-			if (task != null) {
-				operativeDtos = task.getOperativeDtos(workloadDto);
-				operativeDtoClass = task.getOperativeDtoClass();
-				if (operativeDtoClass != null) {
-					operativeDtoFqn = operativeDtoClass.getCanonicalName();
-				} else {
-					operativeDtoClass = null;
+				if (task != null) {
+					workloadDtoFqn = taskClient.getWorkloadDtoFqn(perspectiveFound.taskSummary);
+					workloadDto = taskClient.getWorkloadDto(perspectiveFound.taskSummary);
+					if(workloadDtoFqn == null || workloadDto == null) {
+						workloadDtoFqn = startInfo.getWorkloadDtoFqn();
+						workloadDto = startInfo.createWorkloadDto();
+						taskClient.setWorkloadDtoFqn(perspectiveFound.taskSummary, workloadDtoFqn);
+						taskClient.setWorkloadDto(perspectiveFound.taskSummary, workloadDto);
+					}
+					operativeDtos = task.getOperativeDtos(workloadDto);
+					operativeDtoClass = task.getOperativeDtoClass();
+					if (operativeDtoClass != null) {
+						operativeDtoFqn = operativeDtoClass.getCanonicalName();
+					} else {
+						operativeDtoClass = null;
+					}
 				}
 			}
 		}
@@ -588,9 +621,10 @@
 			((MPartStack) parent).getChildren().add(part);
 		}
 		if (partModel.getView() != null) {
+			String contributionURI = getContributionURI(part, partModel);
 			log.trace("set contribution URI for part {} to {} ", part.getElementId(),
-					getContributionURI(part, partModel));
-			part.setContributionURI(getContributionURI(part, partModel));
+					contributionURI);
+			part.setContributionURI(contributionURI);
 		}
 
 		// DON´T MOVE THE FOLLOWING CODE LINES !!!!
@@ -672,6 +706,10 @@
 			String className = BrowserView.class.getCanonicalName();
 			Bundle bundle = FrameworkUtil.getBundle(BrowserView.class);
 			return E4Constants.BUNDLE_PROTOCOL_SCHEME + "://" + bundle.getSymbolicName() + "/" + className;
+		} else if (viewModel instanceof PerspectiveSaiku) {
+			String className = SaikuView.class.getCanonicalName();
+			Bundle bundle = FrameworkUtil.getBundle(SaikuView.class);
+			return E4Constants.BUNDLE_PROTOCOL_SCHEME + "://" + bundle.getSymbolicName() + "/" + className;
 		}
 		else {
 			return null;
@@ -687,15 +725,17 @@
 	 *            - the current element which is traversed
 	 */
 	private void addElement(MElementContainer<?> parent, EObject element) {
-		if (element instanceof PerspectiveSashContainer) {
-			log.trace("{}","add sashcontainer");
-			addElementPerspectiveSashContainer(parent, element);
-		} else if (element instanceof PerspectivePartStack) {
-			log.trace("{}","add partstack");
-			addElementPerspectivePartStack(parent, element);
-		} else if (element instanceof PerspectivePart) {
-			log.trace("{}","add part");
-			addElementPerspectivePart(parent, element);
+		if(dslMetadataService.isPerspectiveElementAuthorized(element, userAccessService)) {
+			if (element instanceof PerspectiveSashContainer) {
+				log.trace("{}","add sashcontainer");
+				addElementPerspectiveSashContainer(parent, element);
+			} else if (element instanceof PerspectivePartStack) {
+				log.trace("{}","add partstack");
+				addElementPerspectivePartStack(parent, element);
+			} else if (element instanceof PerspectivePart) {
+				log.trace("{}","add part");
+				addElementPerspectivePart(parent, element);
+			}
 		}
 	}
 
@@ -734,7 +774,7 @@
 			String className = getFQN(viewModel)+"Topology";
 			return dslMetadataService.getClassURI(className, IPerspectiveProvider.PerspectiveViewType.TOPOLOGY);
 		} else if (viewModel instanceof PerspectiveDialog) {
-			part.getTransientData().put("dialogModel", ((PerspectiveDialog) viewModel).getRef());
+			part.getTransientData().put(IPerspectiveProvider.TRANSIENT_DIALOG_MODEL, ((PerspectiveDialog) viewModel).getRef());
 			return dslMetadataService.getClassURI(DialogProvider.class.getCanonicalName(), IPerspectiveProvider.PerspectiveViewType.DIALOG);
 		} else if (viewModel instanceof PerspectiveDataInterchange) {
 			String className = getFQN(viewModel)+"TriggerView";
@@ -746,6 +786,10 @@
 			String className = WelcomeView.class.getCanonicalName();
 			Bundle bundle = FrameworkUtil.getBundle(WelcomeView.class);
 			return E4Constants.BUNDLE_PROTOCOL_SCHEME + "://" + bundle.getSymbolicName() + "/" + className;
+		} else if (viewModel instanceof PerspectiveSaiku) {
+			String className = SaikuView.class.getCanonicalName();
+			Bundle bundle = FrameworkUtil.getBundle(SaikuView.class);
+			return E4Constants.BUNDLE_PROTOCOL_SCHEME + "://" + bundle.getSymbolicName() + "/" + className;
 		} else if (viewModel instanceof PerspectiveSearch) {
 			part.getTransientData().put(IPerspectiveProvider.FilterConstants.FILTER_DTO_CLASS,
 					((PerspectiveSearch) viewModel).getDtoRef());
@@ -767,8 +811,19 @@
 			Bundle bundle = FrameworkUtil.getBundle(KanbanView.class);
 			return E4Constants.BUNDLE_PROTOCOL_SCHEME + "://" + bundle.getSymbolicName() + "/" + className;
 		} else if (viewModel instanceof PerspectiveBrowser) {
-			part.getTransientData().put(IPerspectiveProvider.BrowserConstants.URL,
-					((PerspectiveBrowser) viewModel).getUrl());
+			String url = "";
+			if (((PerspectiveBrowser) viewModel).isCubeView()){
+				int port = ProductConfiguration.prefs().getCubeViewPort();
+				URI location = Page.getCurrent().getLocation();
+				try {
+					url = new URL(location.getScheme(), location.getHost(), port, "").toString();
+				} catch (MalformedURLException e) {
+					log.error("cube view URL is malformed!", e);
+				}
+			} else {
+				url = ((PerspectiveBrowser) viewModel).getUrl();
+			}
+			part.getTransientData().put(IPerspectiveProvider.BrowserConstants.URL, url);
 			String className = BrowserView.class.getCanonicalName();
 			Bundle bundle = FrameworkUtil.getBundle(BrowserView.class);
 			return E4Constants.BUNDLE_PROTOCOL_SCHEME + "://" + bundle.getSymbolicName() + "/" + className;
@@ -1063,7 +1118,7 @@
 		if (stack != null) {
 			// bring to top if already contained in model
 			for (MPerspective perspective : stack.getChildren()) {
-				if ((PerspectiveProvider.toPerspectiveElementId(elementId)).equals(perspective.getElementId())) {
+				if ((toPerspectiveElementId(elementId)).equals(perspective.getElementId())) {
 					modelService.bringToTop(perspective);
 					return;
 				}
@@ -1073,7 +1128,7 @@
 			perspective.getTags().add(IPerspectiveProvider.E4Constants.TAG_REMOVE_ON_CLOSE);
 			perspective.getTags().add(IPerspectiveProvider.E4Constants.TAG_NOT_IN_OPEN_PERSPECTIVE_DIALOG);
 
-			perspective.setElementId(PerspectiveProvider.toPerspectiveElementId(elementId));
+			perspective.setElementId(toPerspectiveElementId(elementId));
 			perspective.setLabel(labelName);
 			perspective.setVisible(true);
 			perspective.setToBeRendered(true);
@@ -1084,8 +1139,7 @@
 			perspective.getChildren().add(part);
 			String className = clazz.getCanonicalName();
 			Bundle bundle = FrameworkUtil.getBundle(clazz);
-			String contributionURI = E4Constants.BUNDLE_PROTOCOL_SCHEME + "://" + bundle.getSymbolicName() + "/"
-					+ className;
+			String contributionURI = E4Constants.BUNDLE_PROTOCOL_SCHEME + "://" + bundle.getSymbolicName() + "/"+ className;
 			part.setContributionURI(contributionURI);
 			stack.getChildren().add(perspective);
 			stack.setSelectedElement(perspective);
@@ -1143,7 +1197,7 @@
 			// 02/28/2018
 			if (summary != null) {
 				for (MPerspective perspective : stack.getChildren()) {
-					if ((PerspectiveProvider.toPerspectiveElementId(perspectiveFound.fqn))
+					if ((toPerspectiveElementId(perspectiveFound.fqn))
 							.equals(perspective.getElementId())) {
 						modelService.bringToTop(perspective);
 						return;
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPServiceAddon.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPServiceAddon.java
index d54cac8..673b118 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPServiceAddon.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPServiceAddon.java
@@ -105,16 +105,12 @@
 	@Optional
 	private IDashboardProvider dashboardProvider;
 
-	private IEclipseContext eclipseContext;
-
 	protected Map<String, MessageDialog> messageDialogs = new HashMap<>();
 	protected Locale addonLocale;
 
 
 	@PostConstruct
 	void init(IEclipseContext context) {
-		this.eclipseContext = context;
-		
 		initApplicationLayoutModel();
 
 		BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext();
@@ -124,8 +120,9 @@
 			persistenceService.registerPersistenceExceptionNotification(this);
 		}
 
-		IEventDispatcher clientDispatcher = ContextInjectionFactory.make(EventDispatcher.class, context);
-		context.set(IEventDispatcher.class, clientDispatcher);
+//		IEventDispatcher clientDispatcher = ContextInjectionFactory.make(EventDispatcher.class, context);
+//		context.set(IEventDispatcher.class, clientDispatcher);
+		addToContexts(context, bundleContext, IEventDispatcher.class, EventDispatcher.class, false);
 
 		addToContexts(context, bundleContext, ICommonUIHelper.class, CommonUIHelper.class, false);
 		IThemeResourceService themeResourceService = addToContexts(context, bundleContext, IThemeResourceService.class, ThemeResourceService.class, false);
@@ -166,15 +163,7 @@
 		});
 
 		if (perspectiveProvider != null) {
-//			if(dslMetadataService.isOsbee()) {
-//				if(dashboardProvider != null) {
-//					dashboardProvider.createDashboard(eclipseContext);
-//				} else {
-//					throw new RuntimeException("org.osbee.dashboard plugin is missing");
-//				}
-//			} else {
-				perspectiveProvider.openPerspective("welcomeScreen", "Welcome", WelcomeView.class);
-//			}
+			perspectiveProvider.openPerspective(IPerspectiveProvider.WELCOME_SCREEN_ID, "Welcome", WelcomeView.class);
 		}
 	}
 
@@ -196,16 +185,8 @@
 		bindingTable.setBindingContext(bindingContext);
 		appModel.getBindingTables().add(bindingTable);
 
-		// create trimmed window
-		MTrimmedWindow trimmedWindow = null;
-		if (appModel.getChildren().isEmpty()) {
-			trimmedWindow = BasicFactoryImpl.eINSTANCE.createTrimmedWindow();
-			trimmedWindow.setToBeRendered(true);
-			trimmedWindow.setVisible(true);
-			appModel.getChildren().add(trimmedWindow);
-		} else {
-			trimmedWindow = (MTrimmedWindow) appModel.getChildren().get(0);
-		}
+		// a trimmed window must come with the application
+		MTrimmedWindow trimmedWindow = (MTrimmedWindow) appModel.getChildren().get(0);
 		trimmedWindow.setLabel(appContext.getBrandingName());
 
 		for (ICommandsProvider commandsProvider : OSBPCommandsBinder.getCommandsProviders()) {
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPTranslationService.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPTranslationService.java
index b8d5766..4bfd834 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPTranslationService.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/OSBPTranslationService.java
@@ -15,7 +15,6 @@
  */
  package org.eclipse.osbp.vaaclipse.addons.softwarefactory.service;
 
-import java.lang.reflect.Array;
 import java.util.Arrays;
 import java.util.List;
 import java.util.ResourceBundle;
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/ThemeResourceService.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/ThemeResourceService.java
index 801aac6..2593666 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/ThemeResourceService.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/service/ThemeResourceService.java
@@ -63,7 +63,6 @@
 	private ThemeEngine themeEngine;
 	private ThemeManager themeManager;
 
-	private IApplicationContext appContext;
 	private List<String> cssUris = null;
 	private String resourcePath = null;
 
@@ -72,7 +71,6 @@
 	
 	@Override
 	public void init(IApplicationContext appContext, Object themeEngine, Object themeManager) {
-		this.appContext = appContext;
 		this.themeEngine = (ThemeEngine)themeEngine;
 		this.themeManager = (ThemeManager)themeManager;
 		reset();
@@ -93,7 +91,7 @@
 			return null;
 		}
 	}
-
+	
 	@Override
 	public Resource getThemeResource(String resourceID, ThemeResourceType themeResourceType) {
 		if (resourceID != null) {
@@ -134,6 +132,11 @@
 		}		
 		return stream;
 	}
+
+	@Override
+	public InputStream getThemeResourceInputStream(String resourceID, ThemeResourceType themeResourceType) {
+		return getThemeResourceInputStream(getThemeURI(resourceID, themeResourceType));
+	}
 	
 	@Override
 	public String getThemeResourceHTML(String subject, Locale locale) {
@@ -148,4 +151,20 @@
 		return htmlLoader.toString().replace("$SUBJEC$T", subject).replace("$THEME$", theme).replace("$PATH$", path).replace("$LOCALETAG$", localeTag);
 	}
 
+	@Override
+	public String getThemeResourceRelativePath(String resourceID, ThemeResourceType themeResourceType) {
+		if (resourceID != null) {
+			String relativePath = "./"+resourcePath.substring(resourcePath.indexOf("VAADIN"));
+			return relativePath + getRelativeResourePath(resourceID, themeResourceType);
+		} else {
+			return null;
+		}
+	}
+
+	@Override
+	public String getThemeResourceMxGraphPath() {
+		String theme = themeManager.getThemeId();
+		return "./VAADIN/themes/" + theme + "/mxGraph";
+	}
+	
 }
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/userfilter/UserFilterDialogProvider.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/userfilter/UserFilterDialogProvider.java
index 6e88a83..6761211 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/userfilter/UserFilterDialogProvider.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/userfilter/UserFilterDialogProvider.java
@@ -52,7 +52,7 @@
 import org.eclipse.osbp.jpa.services.filters.LCompare.Equal;
 import org.eclipse.osbp.jpa.services.filters.LJoinFilter;
 import org.eclipse.osbp.runtime.common.annotations.DtoUtils;
-import org.eclipse.osbp.runtime.common.filter.IDTOServiceWithMutablePersistence;
+import org.eclipse.osbp.runtime.common.filter.IDTOService;
 import org.eclipse.osbp.runtime.common.filter.ILFilter;
 import org.eclipse.osbp.runtime.common.types.IBundleSpace;
 import org.eclipse.osbp.runtime.web.vaadin.common.data.BeanServiceLazyLoadingContainer;
@@ -230,7 +230,7 @@
 			try {
 				@SuppressWarnings("unchecked")
 				Class<IDto> dtoClass = (Class<IDto>) bundleSpace.forName(fqnDto);
-				IDTOServiceWithMutablePersistence<IDto> service = (IDTOServiceWithMutablePersistence<IDto>) DtoServiceAccess
+				IDTOService<IDto> service = (IDTOService<IDto>) DtoServiceAccess
 						.getService(dtoClass);
 				StatefulDelegatingDtoSearchService<IDto> loadingService = new StatefulDelegatingDtoSearchService<>(
 						service, dtoClass);
@@ -335,7 +335,7 @@
 			// UserAccount
 			UserAccountDto userDto = (UserAccountDto) userField.getValue();
 			// create UserAccountDTOService
-			IDTOServiceWithMutablePersistence<UserAccountFilterDto> service = (IDTOServiceWithMutablePersistence<UserAccountFilterDto>) DtoServiceAccess
+			IDTOService<UserAccountFilterDto> service = (IDTOService<UserAccountFilterDto>) DtoServiceAccess
 					.getService(UserAccountFilterDto.class);
 			// find all useraccountfilter elements with the reference to the
 			// providing user account id.
@@ -697,7 +697,7 @@
 	 */
 	// ---------- Helper Methods ------------
 	private void fillUsersComboBox() {
-		IDTOServiceWithMutablePersistence<UserAccountDto> service = (IDTOServiceWithMutablePersistence<UserAccountDto>) DtoServiceAccess
+		IDTOService<UserAccountDto> service = (IDTOService<UserAccountDto>) DtoServiceAccess
 				.getService(UserAccountDto.class);
 
 		// getting all existing users.
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/welcome/WelcomeView.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/welcome/WelcomeView.java
index ff62d6b..36f1b18 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/welcome/WelcomeView.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/welcome/WelcomeView.java
@@ -21,23 +21,16 @@
 import javax.inject.Inject;
 
 import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.core.di.annotations.Optional;
 import org.eclipse.e4.ui.model.application.MApplication;
-import org.eclipse.osbp.preferences.ProductConfiguration;
-import org.eclipse.osbp.ui.api.contextfunction.IDashboardProvider;
 import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
 import org.eclipse.osbp.ui.api.user.IUser;
 
-import com.vaadin.event.LayoutEvents.LayoutClickEvent;
-import com.vaadin.event.LayoutEvents.LayoutClickListener;
 import com.vaadin.server.ClientConnector;
 import com.vaadin.server.ClientConnector.AttachEvent;
 import com.vaadin.server.ClientConnector.DetachEvent;
-import com.vaadin.shared.MouseEventDetails.MouseButton;
 import com.vaadin.shared.ui.label.ContentMode;
 import com.vaadin.ui.AbstractComponent;
 import com.vaadin.ui.Label;
-import com.vaadin.ui.RichTextArea;
 import com.vaadin.ui.VerticalLayout;
 
 public class WelcomeView implements IUser.UserLocaleListener, ClientConnector.DetachListener, ClientConnector.AttachListener {