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 339584f..f0ef321 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
@@ -85,6 +85,7 @@
 import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherDataTag;
 import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
 import org.eclipse.osbp.runtime.common.event.SelectionStore;
+import org.eclipse.osbp.runtime.common.filter.IDTOHistorizedService;
 import org.eclipse.osbp.runtime.common.filter.IDTOService;
 import org.eclipse.osbp.runtime.common.filter.IDTOService;
 import org.eclipse.osbp.runtime.common.validation.IStatus;
@@ -605,11 +606,17 @@
 		createNew(dto);
 	}
 
+	/**
+	 * Check other dialogs whether we could use their selection to prefill owners.
+	 * Check eclipse context for information to prefill owners
+	 *
+	 * @param newDto the new dto
+	 */
 	private void prefillOwners(Object newDto) {
 		if(mPart != null) {
 			MPerspective mPersp = mPart.getContext().get(MPerspective.class);
-			for (Field field : DtoUtils.getOwnerDomainReferences(newDto.getClass())) {
-				if (mPersp != null) {
+			if (mPersp != null) {
+				for (Field field : DtoUtils.getOwnerDomainReferences(newDto.getClass())) {
 					// look in dialog's contexts
 					List<IViewContext> contexts = ecviewContainer.getECViews(mPersp);
 					for (IViewContext context : contexts) {
@@ -644,6 +651,28 @@
 		}
 	}
 
+	/**
+	 * If there comes a selections event with a potential owner we use it to prefill owners.
+	 *
+	 * @param event the event
+	 */
+	private void reflectOwners(final EventDispatcherEvent event) {
+		List<Field> owners = DtoUtils.getOwnerDomainReferences(dto);
+		for(Field field:owners) {
+			String key = EntityUtils.getQualifiedEntityNameForQualifiedDtoName(field.getType().getName())+"."+DtoUtils.getIdField(field.getType()).getName();
+			if(key.equals(event.getTopic())) {
+				Object currentDto = viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
+				if(currentDto != null) {
+					Object bean = getDtoFromEvent(event, field.getType().getName());
+					if(bean != null) {
+						DtoUtils.setValue(currentDto, field.getName(), bean);
+						DtoUtils.getAdapter(DirtyStateAdapter.class, currentDto).resetDirty();
+					}
+				}
+			}
+		}
+	}
+
 	/*
 	 * (non-Javadoc)
 	 * 
@@ -890,15 +919,15 @@
 		}
 	}
 
-	protected void showSaveDialog(Object newDto) {
-		final Object dto = newDto;
-		AcceptSaveDialog.showDialog(dslMetadataService, themeResourceService, new Runnable() {
-			@Override
-			public void run() {
-				viewContext = ecviewComponent.setValue(viewId, dto, renderingParams);
-			}
-		}, null);
-	}
+//	protected void showSaveDialog(Object newDto) {
+//		final Object dto = newDto;
+//		AcceptSaveDialog.showDialog(dslMetadataService, themeResourceService, new Runnable() {
+//			@Override
+//			public void run() {
+//				viewContext = ecviewComponent.setValue(viewId, dto, renderingParams);
+//			}
+//		}, null);
+//	}
 
 	protected void showDeleteDialog(Object currentDto) {
 		if(isDirtyDto(currentDto)) {
@@ -978,29 +1007,47 @@
 				allowedSenderParts = (ArrayList<String>) eclipseContext.getActive(MPart.class).getTransientData().get(IPerspectiveProvider.EventDispatcherConstants.ACCEPTED_SENDERS);
 			}
 			if((event.getPerspective() == null || (perspective != null && event.getPerspective().equals(perspective))) && ((allowedSenderParts != null && allowedSenderParts.contains(event.getSender())) || allowedSenderParts == null)){
-				if (dtoService != null && viewContext != null && !event.getSender().equals(viewId) && (event.getTopic().equals(dtoName) || event.getTopic().equals(primaryKey))) {
-	    			handleSelectEvent(event);	    				
+				if (dtoService != null && viewContext != null && !event.getSender().equals(viewId)) {
+					if(event.getTopic().equals(dtoName) || event.getTopic().equals(primaryKey)) {
+						handleSelectEvent(event);
+					} else if(newCreatedDto){	// while in mode "new" then reflect all external selections to the owner fields
+						reflectOwners(event);
+					}
 	    		}
 			}
 			break;
 		case REFRESH:
 			if (!event.getSender().equals(viewId) && event.getTopic().equals(entityName)) {
 				if (!newCreatedDto) {
+					final UI currentUi = eclipseContext.get(UI.class); 
 					DTO currentDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
 					IDto newDto = (IDto) dtoService.get(DtoUtils.getIdValue(currentDto));
-					showLoosingDataDialog(newDto, currentDto);
+					currentUi.accessSynchronously(new Runnable() {
+						@Override
+						public void run() {
+							VaadinObservables.activateRealm(currentUi);
+							showLoosingDataDialog(newDto, currentDto);
+						}
+					});
 				}
 			}
 			break;
 		case SAVE:
 			if (!event.getSender().equals(viewId) && event.getTopic().equals(entityName)) {
 				if (event.getData().containsKey(EventDispatcherDataTag.ID)) {
+					final UI currentUi = eclipseContext.get(UI.class); 
 					Object eventDataId = event.getData().get(EventDispatcherDataTag.ID);
 					DTO currentDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
 					Object currentDtoId = DtoUtils.getIdValue(currentDto);
 					IDto newDto = (IDto) dtoService.get(eventDataId);
 					if (eventDataId != null && idEquals(eventDataId, currentDtoId)) {
-						showLoosingDataDialog(newDto, currentDto);
+						currentUi.accessSynchronously(new Runnable() {
+							@Override
+							public void run() {
+								VaadinObservables.activateRealm(currentUi);
+								showLoosingDataDialog(newDto, currentDto);
+							}
+						});
 					}
 				}
 			}
@@ -1008,11 +1055,18 @@
 		case DELETE:
 			if (!event.getSender().equals(viewId) && event.getTopic().equals(entityName)) {
 				if (event.getData().containsKey(EventDispatcherDataTag.ID)) {
+					final UI currentUi = eclipseContext.get(UI.class); 
 					Object eventDataId = event.getData().get(EventDispatcherDataTag.ID);
 					DTO currentDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
 					Object currentDtoId = DtoUtils.getIdValue(currentDto);
 					if (eventDataId != null && idEquals(eventDataId, currentDtoId)) {
-						showDeleteDialog(currentDto);
+						currentUi.accessSynchronously(new Runnable() {
+							@Override
+							public void run() {
+								VaadinObservables.activateRealm(currentUi);
+								showDeleteDialog(currentDto);
+							}
+						});
 					}
 				}
 			}
@@ -1132,7 +1186,6 @@
 
 	private void handleSelectEvent(EventDispatcherEvent event) {
 		log.debug("buffer select. Class:{} ObjectID:{}", getClass().getName(), System.identityHashCode(this));
-		final UI currentUi = eclipseContext.get(UI.class); 
 		if(timer != null && timer.isRunning()) {
 			log.debug("{}", "buffered select restarted.");
 			timer.restart();
@@ -1140,12 +1193,13 @@
 			timer = new Timer(50, new ActionListener(){
 				@Override
 				public void actionPerformed(ActionEvent e) {
+					final UI currentUi = eclipseContext.get(UI.class); 
+					Object newDto = getDtoFromEvent(event);
+					Object currentDto = viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
 					currentUi.accessSynchronously(new Runnable() {
 						@Override
 						public void run() {
 							VaadinObservables.activateRealm(currentUi);
-							Object newDto = getDtoFromEvent(event);
-							Object currentDto = viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
 							showLoosingDataDialog(newDto, currentDto);
 						}
 					});
@@ -1157,11 +1211,23 @@
 	}
 
 	private Object getDtoFromEvent(EventDispatcherEvent event) {
+		return getDtoFromEvent(event, null);
+	}
+	
+	private Object getDtoFromEvent(EventDispatcherEvent event, String refDtoName) {
 		Object dto = null;
 		if (event.getData().containsKey(EventDispatcherDataTag.ID)) {
 			Object id = event.getData().get(EventDispatcherDataTag.ID);
 			if (id != null) {
-				dto = dtoService.get(id);
+				if(refDtoName == null) {
+					if(dtoService instanceof IDTOHistorizedService) {
+						dto = ((IDTOHistorizedService<DTO>)dtoService).get(id, true);
+					} else {
+						dto = dtoService.get(id);
+					}
+				} else {
+					dto = DtoServiceAccess.getService(refDtoName).get(id);
+				}
 			}
 		} else if (event.getData().containsKey(EventDispatcherDataTag.DTO)) {
 			dto = event.getData().get(EventDispatcherDataTag.DTO);
@@ -1189,22 +1255,23 @@
 		log.debug("create new");
 		Object newDto = null;
 		try {
-			newDto = type.newInstance();
+			if(type != null){				
+				newDto = type.newInstance();
+				setNewCreatedDto(true);
+				prefillOwners(newDto);
+				initializeDto(newDto);
+				if(DtoUtils.getAdapter(DirtyStateAdapter.class, newDto) == null) {
+					log.debug("register dirty adapter {}", newDto.getClass().getName());
+					DtoUtils.registerAdapter(dirtyStateAdapter, newDto);
+				}
+				DtoUtils.getAdapter(DirtyStateAdapter.class, newDto).resetDirty();
+				DtoUtils.getAdapter(DirtyStateAdapter.class, newDto).setActive(true);
+				updateBindings(newDto);
+				viewContext.setBean(BEAN_SLOT__VALIDATION_ERROR, Boolean.FALSE);
+			}
 		} catch (InstantiationException | IllegalAccessException e) {
 			log.error("{}", e);
-			return newDto;
 		}
-		setNewCreatedDto(true);
-		prefillOwners(newDto);
-		initializeDto(newDto);
-		if(DtoUtils.getAdapter(DirtyStateAdapter.class, newDto) == null) {
-			log.debug("register dirty adapter {}", newDto.getClass().getName());
-			DtoUtils.registerAdapter(dirtyStateAdapter, newDto);
-		}
-		DtoUtils.getAdapter(DirtyStateAdapter.class, newDto).resetDirty();
-		DtoUtils.getAdapter(DirtyStateAdapter.class, newDto).setActive(true);
-		updateBindings(newDto);
-		viewContext.setBean(BEAN_SLOT__VALIDATION_ERROR, Boolean.FALSE);
 		return newDto;
 	}
 
