refactor image handling, adjusted legal info
diff --git a/org.eclipse.osbp.xtext.table.feature/feature.xml b/org.eclipse.osbp.xtext.table.feature/feature.xml
index a92456c..2832f5b 100644
--- a/org.eclipse.osbp.xtext.table.feature/feature.xml
+++ b/org.eclipse.osbp.xtext.table.feature/feature.xml
@@ -15,7 +15,7 @@
         label="%featureName"
         version="0.9.0.qualifier"
         provider-name="%providerName"
-		plugin="org.eclipse.osbp.xtext.table">
+		plugin="org.eclipse.osbp.license">
         
     <description>
         %description
diff --git a/org.eclipse.osbp.xtext.table.ui/src/org/eclipse/osbp/xtext/table/ui/contentassist/TableDSLProposalProvider.xtend b/org.eclipse.osbp.xtext.table.ui/src/org/eclipse/osbp/xtext/table/ui/contentassist/TableDSLProposalProvider.xtend
index b99714c..339ccbb 100644
--- a/org.eclipse.osbp.xtext.table.ui/src/org/eclipse/osbp/xtext/table/ui/contentassist/TableDSLProposalProvider.xtend
+++ b/org.eclipse.osbp.xtext.table.ui/src/org/eclipse/osbp/xtext/table/ui/contentassist/TableDSLProposalProvider.xtend
@@ -98,7 +98,7 @@
 		var imageSelectorDialog = new ImageSelectorDialog(shell, 16);
 		imageSelectorDialog.setFilterExtensions(extensions)
 		var imageFileName = imageSelectorDialog.open(true);
-		return "\"".concat(imageFileName).concat("\"");
+		return if (imageFileName !== null) "\"".concat(imageFileName).concat("\"") else "";
 	}
 }
 
diff --git a/org.eclipse.osbp.xtext.table.ui/xtend-gen/org/eclipse/osbp/xtext/table/ui/contentassist/ImageFileNameTextApplier.java b/org.eclipse.osbp.xtext.table.ui/xtend-gen/org/eclipse/osbp/xtext/table/ui/contentassist/ImageFileNameTextApplier.java
index cf780ce..8b2a422 100644
--- a/org.eclipse.osbp.xtext.table.ui/xtend-gen/org/eclipse/osbp/xtext/table/ui/contentassist/ImageFileNameTextApplier.java
+++ b/org.eclipse.osbp.xtext.table.ui/xtend-gen/org/eclipse/osbp/xtext/table/ui/contentassist/ImageFileNameTextApplier.java
@@ -50,6 +50,12 @@
     ImageSelectorDialog imageSelectorDialog = new ImageSelectorDialog(shell, 16);
     imageSelectorDialog.setFilterExtensions(this.extensions);
     String imageFileName = imageSelectorDialog.open(true);
-    return "\"".concat(imageFileName).concat("\"");
+    String _xifexpression = null;
+    if ((imageFileName != null)) {
+      _xifexpression = "\"".concat(imageFileName).concat("\"");
+    } else {
+      _xifexpression = "";
+    }
+    return _xifexpression;
   }
 }
diff --git a/org.eclipse.osbp.xtext.table/src-gen/org/eclipse/osbp/xtext/table/parser/antlr/internal/InternalTableDSLLexer.java b/org.eclipse.osbp.xtext.table/src-gen/org/eclipse/osbp/xtext/table/parser/antlr/internal/InternalTableDSLLexer.java
index e33353a..82bbf83 100644
--- a/org.eclipse.osbp.xtext.table/src-gen/org/eclipse/osbp/xtext/table/parser/antlr/internal/InternalTableDSLLexer.java
+++ b/org.eclipse.osbp.xtext.table/src-gen/org/eclipse/osbp/xtext/table/parser/antlr/internal/InternalTableDSLLexer.java
@@ -6957,4 +6957,4 @@
     }
  
 
-}
\ No newline at end of file
+}
diff --git a/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/imports/ShouldImportProvider.java b/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/imports/ShouldImportProvider.java
index badd2b3..e9de7d4 100644
--- a/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/imports/ShouldImportProvider.java
+++ b/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/imports/ShouldImportProvider.java
@@ -27,10 +27,12 @@
 
 public class ShouldImportProvider extends DefaultShouldImportProvider {
 
+	@Override
 	protected boolean doShouldImport(EObject toImport, EReference eRef, EObject context) {
 		return toImport instanceof LDto || toImport instanceof DatamartDefinition || toImport instanceof ActionToolbar;
 	}
 
+	@Override
 	protected boolean doShouldProposeAllElements(EObject object, EReference reference) {
 		EClass type = reference.getEReferenceType();
 		return DatamartDSLPackage.Literals.DATAMART_DEFINITION.isSuperTypeOf(type)
diff --git a/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/jvmmodel/TableDSLJvmModelInferrer.xtend b/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/jvmmodel/TableDSLJvmModelInferrer.xtend
index 14ef6a1..11ea3c5 100644
--- a/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/jvmmodel/TableDSLJvmModelInferrer.xtend
+++ b/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/jvmmodel/TableDSLJvmModelInferrer.xtend
@@ -578,7 +578,7 @@
 				taskClient.subscribeTaskEventNotification(this);
 				taskClient.subscribeProcessCompletedEventNotification(this);
 				«ENDIF»
-				«IF !table.grid && !table.isEmbedded && (table.task || table.cube)»
+				«IF !table.grid && !table.isEmbedded»
 				filterGenerator.addFilterChangeListener(this);
 				«ENDIF»
 				''')]
@@ -853,11 +853,8 @@
 						«FOR e:findRequestedEntities(table)»
 						if(event.getTopic().equals("«e.fullyQualifiedName»")){
 							datamartInstance.clearCache();
-							List<DatamartPrimary<?>> primaryKeys = datamartInstance.getPrimaryList();
-							for(DatamartPrimary key : primaryKeys) {
-								if(key.contains(event.getData().get(EventDispatcherDataTag.ID))) {
-									dataRefresh();
-								}
+							if(datamartInstance.contains(event.getData().get(EventDispatcherDataTag.ID))) {
+								dataRefresh();
 							}
 						}
 						«ENDFOR»
@@ -878,6 +875,45 @@
 					}*/
 					break;
 			'''
+			if (!table.isEmbedded && table.tabletype.toolbar !== null && table.tabletype.toolbar.eContainer !== null) {
+				body = '''
+				«body»
+					case ACTION:
+						if (toolbarUUID.equals(event.getTopic()) && event.getData().containsKey(EventDispatcherDataTag.BUTTON_ID)) {
+							Object id = event.getData().get(EventDispatcherDataTag.BUTTON_ID);
+							if (id instanceof TableActionEnum) {
+								TableActionEnum enumId = (TableActionEnum) id;
+								switch (enumId) {
+								case EXPORT_EXCEL:
+									for(CellSetFilterTable table:tables) {
+										ExcelExport excelExport = new ExcelExport(table, themeResourceService);
+						                excelExport.excludeCollapsedColumns();
+						                excelExport.setReportTitle(layoutManager.getCaption());
+						                excelExport.export();
+						            }
+					                break;
+								case EXPORT_CSV:
+									for(CellSetFilterTable table:tables) {
+										CsvExport csvExport = new CsvExport(table, themeResourceService);
+						                csvExport.excludeCollapsedColumns();
+						                csvExport.setReportTitle(layoutManager.getCaption());
+						                csvExport.export();
+						            }
+					                break;
+								case EXPORT_PDF:
+									for(CellSetFilterTable table:tables) {
+										PdfExport pdfExport = new PdfExport(table, themeResourceService);
+						                pdfExport.excludeCollapsedColumns();
+						                pdfExport.setReportTitle(layoutManager.getCaption());
+						                pdfExport.export();
+						            }
+									break;
+								}
+							}
+						}
+						break;
+				'''
+			}
 			body = '''
 			«body»
 				}
@@ -2802,7 +2838,10 @@
 					}
 					«IF table.isEmbedded && table.isTask»
 					for(Button b:taskButtons) {
-						b.setEnabled(table.getValue() != null);
+						b.setEnabled(table.getValue() != null && 
+							(dataSourceContainer.getTaskStatus(selection).equals(BPMStatus.Created) ||
+							dataSourceContainer.getTaskStatus(selection).equals(BPMStatus.Ready) ||
+							dataSourceContainer.getTaskStatus(selection).equals(BPMStatus.Suspended)));
 					}
 					«ENDIF»
 		'''
@@ -2828,18 +2867,19 @@
 							body = '''
 							«body»
 									«IF entity.primaryKeyAttribute !== null»
-									Object idObj = dataSourceContainer.getValueByProperty(selection, "«alias.toLowerCase»");
-									MPerspective perspective = getContext().get(MPerspective.class);
-									EventDispatcherEvent evnt = new EventDispatcherEvent(perspective, EventDispatcherCommand.SELECT, "«entity.baseType.fullyQualifiedName».«entity.idAttributeName»", "«table.fullyQualifiedName»");
-									evnt.addItem(EventDispatcherDataTag.ID, idObj);
-									eventDispatcher.sendEvent(evnt);
-									SelectionStore.putSelectionToPerspectiveContext(getPart(), "«entity.baseType.fullyQualifiedName».«entity.idAttributeName»", idObj);
-									for (DatamartPrimary<?> primary : datamartInstance.getPrimaryList()){
-										if (!"«entity.baseType.fullyQualifiedName»".equals(primary.getEntityName())){
-											Object primaryValue = dataSourceContainer.getValueByProperty(selection, primary.getAlias().toLowerCase());
-											evnt = new EventDispatcherEvent(perspective, EventDispatcherCommand.SELECT, primary.getEntityName() + "." + primary.getAttributeName(), "«table.fullyQualifiedName»");
-											evnt.addItem(EventDispatcherDataTag.ID, primaryValue);
-											eventDispatcher.sendEvent(evnt);
+									if(selection != -1) {
+										Object idObj = datamartInstance.getPrimaryListKeys("«alias»").get(selection);
+										EventDispatcherEvent evnt = new EventDispatcherEvent(getContext().get(MPerspective.class), EventDispatcherCommand.SELECT, "«entity.baseType.fullyQualifiedName».«entity.idAttributeName»", "«table.fullyQualifiedName»");
+										evnt.addItem(EventDispatcherDataTag.ID, idObj);
+										eventDispatcher.sendEvent(evnt);
+										SelectionStore.putSelectionToPerspectiveContext(getPart(), "«entity.baseType.fullyQualifiedName».«entity.idAttributeName»", idObj);
+										// send all refs too
+										for (String alias : datamartInstance.getPrimaryList().keySet()){
+											if (!"«alias»".equals(alias)){
+												evnt = new EventDispatcherEvent(getContext().get(MPerspective.class), EventDispatcherCommand.SELECT, datamartInstance.getPrimaryList().get(alias).getEntityName() + "." + datamartInstance.getPrimaryList().get(alias).getAttributeName(), "«table.fullyQualifiedName»");
+												evnt.addItem(EventDispatcherDataTag.ID, datamartInstance.getPrimaryListKeys(alias).get(selection));
+												eventDispatcher.sendEvent(evnt);
+											}
 										}
 									}
 									«ENDIF»
@@ -2856,18 +2896,20 @@
 				for (event : axis.events) {
 					body = '''
 					«body»
-							«IF event.source instanceof TableOrdinal»
-							EventDispatcherEvent evnt«evntCnt» = new EventDispatcherEvent(perspective, EventDispatcherCommand.SELECT, "«(event.source as TableOrdinal).valueRef»", "«table.fullyQualifiedName»");
-							«ELSEIF event.source instanceof TableAttribute»
-							EventDispatcherEvent evnt«evntCnt» = new EventDispatcherEvent(perspective, EventDispatcherCommand.SELECT, "«(event.source as TableAttribute).valueRef.attributeRef.name»", "«table.fullyQualifiedName»");
-							«ENDIF» 
-							«IF event.source instanceof TableOrdinal»
-							evnt«evntCnt».addItem(EventDispatcherDataTag.LIST, dataSourceContainer.getValueByProperty(selection, "«(event.source as TableOrdinal).valueRef»"));
-							eventDispatcher.sendEvent(evnt«evntCnt»);
-							«ELSEIF event.source instanceof TableAttribute»
-							evnt«evntCnt».addItem(EventDispatcherDataTag.LIST, dataSourceContainer.getValueByProperty(selection, "«(event.source as TableAttribute).valueRef.attributeRef.name»"));
-							eventDispatcher.sendEvent(evnt«evntCnt»);
-							«ENDIF» 
+							if(selection != -1) {
+								«IF event.source instanceof TableOrdinal»
+								EventDispatcherEvent evnt«evntCnt» = new EventDispatcherEvent(getContext().get(MPerspective.class), EventDispatcherCommand.SELECT, "«(event.source as TableOrdinal).valueRef»", "«table.fullyQualifiedName»");
+								«ELSEIF event.source instanceof TableAttribute»
+								EventDispatcherEvent evnt«evntCnt» = new EventDispatcherEvent(getContext().get(MPerspective.class), EventDispatcherCommand.SELECT, "«(event.source as TableAttribute).valueRef.attributeRef.name»", "«table.fullyQualifiedName»");
+								«ENDIF» 
+								«IF event.source instanceof TableOrdinal»
+								evnt«evntCnt».addItem(EventDispatcherDataTag.LIST, dataSourceContainer.getValueByProperty(selection, "«(event.source as TableOrdinal).valueRef»"));
+								eventDispatcher.sendEvent(evnt«evntCnt»);
+								«ELSEIF event.source instanceof TableAttribute»
+								evnt«evntCnt».addItem(EventDispatcherDataTag.LIST, dataSourceContainer.getValueByProperty(selection, "«(event.source as TableAttribute).valueRef.attributeRef.name»"));
+								eventDispatcher.sendEvent(evnt«evntCnt»);
+								«ENDIF»
+							} 
 					'''
 					evntCnt = evntCnt + 1
 				}
@@ -2922,9 +2964,12 @@
 		// creates a hash code by the column position members		
 		int membersHash = 0;
 		if (container != null) {
-			List<DerivedMember> members = container.getColumnPosition(visibleColumnKey).getMembers();
-			for (DerivedMember member : members) {
-				membersHash += (member.getUniqueName() != null) ? member.getUniqueName().hashCode() : member.hashCode();
+			DerivedPosition pos = container.getColumnPosition(visibleColumnKey);
+			if ( pos != null ) {
+				List<DerivedMember> members = pos.getMembers();
+				for (DerivedMember member : members) {
+					membersHash += (member.getUniqueName() != null) ? member.getUniqueName().hashCode() : member.hashCode();
+				}
 			}
 		}
 	'''
@@ -3050,6 +3095,10 @@
 		var prop = new IdAttribute()
 		prop.collapsed = true
 		map.put(DatamartDefinitionUtil.getEntityIdAliasName(entity.entityRef), prop)
+		if(entity.entityRef.historizedOrTimedependentWithParent) {
+			map.put(DatamartDefinitionUtil.getEntityValidAliasName(entity.entityRef), prop)
+			map.put(DatamartDefinitionUtil.getEntityCurrentAliasName(entity.entityRef), prop)
+		}
 		for (navigation : entity.navigations) {
 			navigation.datamartEntity.iterateIdMap(map)
 		}
@@ -3098,21 +3147,23 @@
 		}
 		'''
 		List<Integer> selections = new ArrayList<>();
-		IDto workloadDto = taskClient.getWorkloadDto(taskSummary);
-		List<IDto> operativeDtos = workLoadItem.getOperativeDtos(workloadDto);
-		if	(operativeDtos != null) {
-			Set<String> ids = new TreeSet<String>();
-		    for	(IDto operativeDto : operativeDtos) {
-		    	ids.add(String.valueOf(((«dtoFqn»)operativeDto).«keyGetter»));
-		    }
-		    for	(Object selection : dataSourceContainer.getAllItemIds()) {
-		        String idValue = dataSourceContainer.getStringValueByProperty((Integer)selection,"«alias»");
-		    	if	(ids.contains(idValue)) {
-		    		selections.add((Integer)selection);
-		    	}
-		    }
+		if(taskSummary != null) {
+			IDto workloadDto = taskClient.getWorkloadDto(taskSummary);
+			List<IDto> operativeDtos = workLoadItem.getOperativeDtos(workloadDto);
+			if	(operativeDtos != null) {
+				Set<String> ids = new TreeSet<String>();
+			    for	(IDto operativeDto : operativeDtos) {
+			    	ids.add(String.valueOf(((«dtoFqn»)operativeDto).«keyGetter»));
+			    }
+			    for	(Object selection : dataSourceContainer.getAllItemIds()) {
+			        String idValue = dataSourceContainer.getStringValueByProperty((Integer)selection,"«alias»");
+			    	if	(ids.contains(idValue)) {
+			    		selections.add((Integer)selection);
+			    	}
+			    }
+			}
+			selectTable.setValue(selections);
 		}
-		selectTable.setValue(selections);
 		'''
 	}
 		
@@ -3126,18 +3177,26 @@
 					var keyType = entity.primaryKeyAttribute.datatype
 					var dtoFqn = EntityUtils.getDtoFQNForLEntity(entity)
 					'''
-					IDTOServiceWithMutablePersistence<«dtoFqn»> dtoService = (IDTOServiceWithMutablePersistence<«dtoFqn»>) DtoServiceAccess.getService(«dtoFqn».class);
+					IDTOService<«dtoFqn»> dtoService = (IDTOService<«dtoFqn»>) DtoServiceAccess.getService(«dtoFqn».class);
 					String idValue = dataSourceContainer.getStringValueByProperty((Integer)selection,"«alias»");
-					if	(selected) {
-						workLoadItem.addOperativeDto(taskClient.getWorkloadDto(taskSummary), «IF "int".equals(keyType.name)»dtoService.get((int) Integer.parseInt(idValue))«ELSE»dtoService.get(idValue)«ENDIF»);
-					}
-					else {
-					   	for(IDto dtoToRemove : workLoadItem.getOperativeDtos(taskClient.getWorkloadDto(taskSummary))) {
-							if(((«dtoFqn»)dtoToRemove).getId()«IF "int".equals(keyType.name)»==(int) Integer.parseInt(idValue)«ELSE».equals(idValue)«ENDIF») {
-								workLoadItem.removeOperativeDto(taskClient.getWorkloadDto(taskSummary), dtoToRemove);
-								break;
+					if(taskSummary != null) {
+						if	(selected) {
+							workLoadItem.addOperativeDto(taskClient.getWorkloadDto(taskSummary), «IF "int".equals(keyType.name)»dtoService.get((int) Integer.parseInt(idValue))«ELSE»dtoService.get(idValue)«ENDIF»);
+						}
+						else {
+						   	for(IDto dtoToRemove : workLoadItem.getOperativeDtos(taskClient.getWorkloadDto(taskSummary))) {
+								if(((«dtoFqn»)dtoToRemove).getId()«IF "int".equals(keyType.name)»==(int) Integer.parseInt(idValue)«ELSE».equals(idValue)«ENDIF») {
+									workLoadItem.removeOperativeDto(taskClient.getWorkloadDto(taskSummary), dtoToRemove);
+									break;
+								}
 							}
 						}
+					} else {
+						if(selected) {
+							SelectionStore.addSelectionToPerspectiveContext(getPart(), "«dtoFqn»", «IF "int".equals(keyType.name)»dtoService.get((int) Integer.parseInt(idValue))«ELSE»dtoService.get(idValue)«ENDIF»);
+						} else {
+							SelectionStore.removeSelectionFromPerspectiveContext(getPart(), "«dtoFqn»", «IF "int".equals(keyType.name)»dtoService.get((int) Integer.parseInt(idValue))«ELSE»dtoService.get(idValue)«ENDIF»);
+						}
 					}
 					'''
 				}
@@ -3199,5 +3258,4 @@
 			]
 		])
 	}
-	
 }
diff --git a/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/jvmmodel/TableModelGenerator.xtend b/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/jvmmodel/TableModelGenerator.xtend
index fd0947f..a28899d 100644
--- a/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/jvmmodel/TableModelGenerator.xtend
+++ b/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/jvmmodel/TableModelGenerator.xtend
@@ -65,6 +65,7 @@
 import org.eclipse.emf.ecore.EObject
 import org.eclipse.emf.ecore.resource.Resource
 import org.eclipse.osbp.bpm.api.BPMOperation
+import org.eclipse.osbp.bpm.api.BPMStatus
 import org.eclipse.osbp.bpm.api.BPMTaskEventType
 import org.eclipse.osbp.bpm.api.BPMTaskSummary
 import org.eclipse.osbp.bpm.api.BPMTaskUserEvent
@@ -78,7 +79,8 @@
 import org.eclipse.osbp.preferences.ProductConfiguration
 import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent
 import org.eclipse.osbp.runtime.common.event.IDualData
-import org.eclipse.osbp.runtime.common.filter.IDTOServiceWithMutablePersistence
+import org.eclipse.osbp.runtime.common.event.SelectionStore
+import org.eclipse.osbp.runtime.common.filter.IDTOService
 import org.eclipse.osbp.runtime.web.vaadin.common.data.IBeanSearchServiceFactory
 import org.eclipse.osbp.ui.api.contextfunction.IViewEmbeddedProvider
 import org.eclipse.osbp.ui.api.customfields.IBlobService
@@ -112,6 +114,9 @@
 import org.eclipse.osbp.xtext.table.common.CheckboxSelectionCellSetFilterTable
 import org.eclipse.osbp.xtext.table.common.TableFilterDecorator
 import org.eclipse.osbp.xtext.table.common.TableFilterGenerator
+import org.eclipse.osbp.xtext.table.common.export.CsvExport
+import org.eclipse.osbp.xtext.table.common.export.ExcelExport
+import org.eclipse.osbp.xtext.table.common.export.PdfExport
 import org.eclipse.osbp.xtext.table.generator.TableGridSourceGenerator
 import org.eclipse.xtext.generator.IFileSystemAccess
 import org.eclipse.xtext.xbase.compiler.GeneratorConfig
@@ -119,7 +124,7 @@
 import org.osgi.service.event.Event
 import org.osgi.service.event.EventHandler
 import org.vaadin.hene.popupbutton.PopupButton
-import org.eclipse.osbp.runtime.common.event.SelectionStore
+import org.eclipse.osbp.xtext.action.TableActionEnum
 
 class TableModelGenerator extends I18NModelGenerator {
 	@Inject TableGridSourceGenerator delegate
@@ -203,7 +208,7 @@
 			IDto,
 			Task,
 			BlipItem,
-			IDTOServiceWithMutablePersistence,
+			IDTOService,
 			DtoServiceAccess,
 			DatamartFilterGenerator,
 			ViewLayoutManager,
@@ -233,7 +238,12 @@
 			MPerspective,
 			MPart,
 			IPerspectiveProvider,
-			SelectionStore
+			SelectionStore,
+			BPMStatus,
+			ExcelExport,
+			CsvExport,
+			PdfExport,
+			TableActionEnum
 		)
 		super.createAppendable(context, importManager, config)
 	}
diff --git a/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/scoping/TableDSLScopeProvider.xtend b/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/scoping/TableDSLScopeProvider.xtend
index 8d93a83..752e7c9 100644
--- a/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/scoping/TableDSLScopeProvider.xtend
+++ b/org.eclipse.osbp.xtext.table/src/org/eclipse/osbp/xtext/table/scoping/TableDSLScopeProvider.xtend
@@ -26,8 +26,16 @@
 import org.eclipse.osbp.dsl.common.xtext.extensions.ModelExtensions
 import org.eclipse.osbp.dsl.entity.xtext.extensions.EntityTypesBuilder
 import org.eclipse.osbp.infogrid.model.gridsource.CxGridNestedField
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridNestedPath
 import org.eclipse.osbp.infogrid.model.gridsource.CxGridProperty
 import org.eclipse.osbp.infogrid.model.gridsource.CxGridSourcePackage
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropPriceStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropQuantityStyle
+import org.eclipse.osbp.xtext.action.ActionButton
+import org.eclipse.osbp.xtext.action.ActionFunction
+import org.eclipse.osbp.xtext.action.ActionTable
+import org.eclipse.osbp.xtext.action.ActionTask
+import org.eclipse.osbp.xtext.action.ActionToolbar
 import org.eclipse.osbp.xtext.cubedsl.CubeDimensionEntity
 import org.eclipse.osbp.xtext.cubedsl.CubeHierarchy
 import org.eclipse.osbp.xtext.cubedsl.CubeLevel
@@ -38,6 +46,7 @@
 import org.eclipse.osbp.xtext.datamartdsl.DatamartDerivedMeasure
 import org.eclipse.osbp.xtext.datamartdsl.DatamartEntity
 import org.eclipse.osbp.xtext.datamartdsl.DatamartHierarchy
+import org.eclipse.osbp.xtext.datamartdsl.DatamartHierarchyLevelSingle
 import org.eclipse.osbp.xtext.datamartdsl.DatamartMeasure
 import org.eclipse.osbp.xtext.datamartdsl.DatamartMember
 import org.eclipse.osbp.xtext.datamartdsl.DatamartOwner
@@ -46,27 +55,26 @@
 import org.eclipse.osbp.xtext.datamartdsl.DatamartTask
 import org.eclipse.osbp.xtext.datamartdsl.jvmmodel.DatamartDSLJvmModelInferrer
 import org.eclipse.osbp.xtext.datamartdsl.scoping.DatamartDSLScopeProvider
+import org.eclipse.osbp.xtext.datamartdsl.util.DatamartAttributeUtil
 import org.eclipse.osbp.xtext.gridsource.scoping.GridSourceScopeProvider
+import org.eclipse.osbp.xtext.oxtype.resource.EcoreUtil3
 import org.eclipse.osbp.xtext.table.TableAxis
 import org.eclipse.osbp.xtext.table.TableDSLPackage
 import org.eclipse.osbp.xtext.table.TableDatamart
 import org.eclipse.osbp.xtext.table.TableDtoDatasource
+import org.eclipse.osbp.xtext.table.TableOption
 import org.eclipse.xtext.common.types.JvmType
 import org.eclipse.xtext.common.types.util.TypeReferences
 import org.eclipse.xtext.resource.EObjectDescription
 import org.eclipse.xtext.resource.IEObjectDescription
 import org.eclipse.xtext.scoping.IScope
+import org.eclipse.xtext.scoping.impl.FilteringScope
 import org.eclipse.xtext.scoping.impl.MapBasedScope
-import org.eclipse.osbp.xtext.datamartdsl.util.DatamartAttributeUtil
-import org.eclipse.osbp.infogrid.model.gridsource.CxGridNestedPath
-import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropStyle
-import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropQuantityStyle
-import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropPriceStyle
-import org.eclipse.osbp.xtext.datamartdsl.DatamartHierarchyLevelSingle
+import org.eclipse.osbp.xtext.action.ActionCommand
+import org.eclipse.osbp.xtext.action.ActionDatainterchange
 
 class TableDSLScopeProvider extends AbstractTableDSLScopeProvider {
 	@Inject extension ModelExtensions
-	@Inject extension EntityTypesBuilder
 	@Inject extension DatamartDSLScopeProvider datamartScopeProvider
 	@Inject extension DatamartDSLJvmModelInferrer datamartInferrer
 	@Inject GridSourceScopeProvider gridScopeProvider
@@ -87,78 +95,110 @@
 			reference == TableDSLPackage.Literals.TABLE_COLUMN__VALUE_REF ||
 			reference == TableDSLPackage.Literals.TABLE_HIERARCHY__VALUE_REF) {
 				return getScope_Table_valueRef(context, reference)
-		} else if (reference == TableDSLPackage.Literals.TABLE_AGGREGATION__VALUE_REF) {
-			return getScope_Table_Aggregation_valueRef(context)
-		} else {
-			return super.getScope(context, reference)
+			} else if (reference == TableDSLPackage.Literals.TABLE_AGGREGATION__VALUE_REF) {
+				return getScope_Table_Aggregation_valueRef(context)
+			} else if (reference == TableDSLPackage.Literals.TABLE_OPTION__TOOLBAR) {
+				return getScope_Table_Toolbar(context as TableOption, reference)
+			} else {
+				return super.getScope(context, reference)
+			}
 		}
-	}
 
-		def IScope getScope_GridAttribute_path(EObject object, EReference reference) {
-			switch (object) {
-				CxGridProperty: {
-					val CxGridProperty prop = object as CxGridProperty
-					val ds = prop.eContainer as TableDtoDatasource
-					if(ds !== null && ds.dtoSource !== null) {
-						val JvmType type = typeReferences.findDeclaredType(ds.dtoSource.toQualifiedName, prop)
-						return gridScopeProvider.toGetterScope(type)
-					}
-					return null
+		def IScope getScope_Table_Toolbar(TableOption table, EReference reference) {
+			var superScope = super.getScope(table, reference)
+			return new FilteringScope(superScope, [
+				if (it.EObjectOrProxy instanceof ActionToolbar) {
+					var toolbar = it.EObjectOrProxy as ActionToolbar
+					toolbar = EcoreUtil3.resolve(toolbar, table.eResource.resourceSet) as ActionToolbar
+					return toolbar.filterToolbarScopeCondition
 				}
-				CxGridNestedField,
-				CxGridNestedPath,
-				CxGridPropPriceStyle,
-				CxGridPropQuantityStyle: {
-					if (object.eContainer instanceof CxGridProperty) {
-						return object.eContainer.getScope_GridAttribute_path(reference)
-					} else {
-						if (object instanceof CxGridNestedField){
-							var CxGridNestedField containerField = object as CxGridNestedField
-//							if (containerField!==null && containerField.field!==null && containerField.field.returnType!==null){
-								return gridScopeProvider.toGetterScope(containerField?.field?.returnType?.type)
-//							}
-						} else if (object.eContainer instanceof CxGridNestedPath){
-							var CxGridNestedPath containerField = object as CxGridNestedPath
-//							if (containerField!==null && containerField.field!==null && containerField.field.returnType!==null){
-								return gridScopeProvider.toGetterScope(containerField?.field?.returnType?.type)
-//							}
-						} else if (object.eContainer instanceof CxGridNestedField){
-							var CxGridNestedField containerField = object.eContainer as CxGridNestedField
-//							if (containerField!==null && containerField.field!==null && containerField.field.returnType!==null){
-								return gridScopeProvider.toGetterScope(containerField?.field?.returnType?.type)
-//							}
+				return false
+			])
+		}
+
+		private def filterToolbarScopeCondition(ActionToolbar toolbar) {
+			var allItemsOfTable = true
+			if (toolbar !== null) {
+				for (item : toolbar.actions) {
+					if (item instanceof ActionButton) {
+						if (!(item.command.actionType instanceof ActionTable ||
+							item.command.actionType instanceof ActionFunction ||
+							item.command.actionType instanceof ActionTask ||
+							item.command.actionType instanceof ActionCommand ||
+							item.command.actionType instanceof ActionDatainterchange)) {
+								allItemsOfTable = false
+							}
+						}
+					}
+				}
+				return allItemsOfTable
+			}
+
+			def IScope getScope_GridAttribute_path(EObject object, EReference reference) {
+				switch (object) {
+					CxGridProperty: {
+						val CxGridProperty prop = object as CxGridProperty
+						val ds = prop.eContainer as TableDtoDatasource
+						if (ds !== null && ds.dtoSource !== null) {
+							val JvmType type = typeReferences.findDeclaredType(ds.dtoSource.toQualifiedName, prop)
+							return gridScopeProvider.toGetterScope(type)
 						}
 						return null
 					}
-				}
-			}
-			return null
-		}
-
-		def IScope getScope_Table_Axis_axis(EObject object) {
-			var result = <IEObjectDescription>newArrayList
-			var eObj = object
-			while (!(eObj instanceof TableDatamart)) {
-				eObj = eObj.eContainer
-			}
-			if (eObj !== null) {
-				var datamart = (eObj as TableDatamart).datamartRef
-				if (datamart !== null && datamart.source !== null) {
-					if (datamart.source instanceof DatamartCube) {
-						for (axis : (datamart.source as DatamartCube).axisslicer) {
-							if (axis instanceof DatamartCubeAxis) {
-								var literal = (axis as DatamartCubeAxis).axis.name.literal
-								result.add(EObjectDescription.create(literal, (axis as DatamartCubeAxis)))
+					CxGridNestedField,
+					CxGridNestedPath,
+					CxGridPropPriceStyle,
+					CxGridPropQuantityStyle: {
+						if (object.eContainer instanceof CxGridProperty) {
+							return object.eContainer.getScope_GridAttribute_path(reference)
+						} else {
+							if (object instanceof CxGridNestedField) {
+								var CxGridNestedField containerField = object as CxGridNestedField
+								// if (containerField!==null && containerField.field!==null && containerField.field.returnType!==null){
+								return gridScopeProvider.toGetterScope(containerField?.field?.returnType?.type)
+							// }
+							} else if (object.eContainer instanceof CxGridNestedPath) {
+								var CxGridNestedPath containerField = object as CxGridNestedPath
+								// if (containerField!==null && containerField.field!==null && containerField.field.returnType!==null){
+								return gridScopeProvider.toGetterScope(containerField?.field?.returnType?.type)
+							// }
+							} else if (object.eContainer instanceof CxGridNestedField) {
+								var CxGridNestedField containerField = object.eContainer as CxGridNestedField
+								// if (containerField!==null && containerField.field!==null && containerField.field.returnType!==null){
+								return gridScopeProvider.toGetterScope(containerField?.field?.returnType?.type)
+							// }
 							}
+							return null
 						}
-					} else if (datamart.source instanceof DatamartEntity) {
-						getEntityAxes(datamart.source as DatamartEntity, result)
+					}
+				}
+				return null
+			}
 
-						// user must not supply any axes, but we need it with tables
-						if (!result.containsName(AxisEnum.COLUMNS.literal)) {
-							result.add(
-								EObjectDescription.create(AxisEnum.COLUMNS.literal,
-									(datamart.source as DatamartEntity)))
+			def IScope getScope_Table_Axis_axis(EObject object) {
+				var result = <IEObjectDescription>newArrayList
+				var eObj = object
+				while (!(eObj instanceof TableDatamart)) {
+					eObj = eObj.eContainer
+				}
+				if (eObj !== null) {
+					var datamart = (eObj as TableDatamart).datamartRef
+					if (datamart !== null && datamart.source !== null) {
+						if (datamart.source instanceof DatamartCube) {
+							for (axis : (datamart.source as DatamartCube).axisslicer) {
+								if (axis instanceof DatamartCubeAxis) {
+									var literal = (axis as DatamartCubeAxis).axis.name.literal
+									result.add(EObjectDescription.create(literal, (axis as DatamartCubeAxis)))
+								}
+							}
+						} else if (datamart.source instanceof DatamartEntity) {
+							getEntityAxes(datamart.source as DatamartEntity, result)
+
+							// user must not supply any axes, but we need it with tables
+							if (!result.containsName(AxisEnum.COLUMNS.literal)) {
+								result.add(
+									EObjectDescription.create(AxisEnum.COLUMNS.literal,
+										(datamart.source as DatamartEntity)))
 							}
 							if (!result.containsName(AxisEnum.ROWS.literal)) {
 								result.add(
@@ -177,312 +217,271 @@
 					return MapBasedScope.createScope(IScope.NULLSCOPE, result)
 				}
 
-				def void getEntityAxes(DatamartEntity entity, ArrayList<IEObjectDescription> result) {
-					for (navigation : entity.navigations) {
-						if (navigation instanceof DatamartMember) {
-							(navigation as DatamartMember).datamartEntity.getEntityAxes(result)
-							for (property : (navigation as DatamartMember).datamartEntity.attributes) {
-								if (!result.containsName(property.axis.name.literal)) {
-									result.add(
-										EObjectDescription.create(property.axis.name.literal, property as DatamartCubeAxis))
-								}
-							}
-						}
-						if (navigation instanceof DatamartOwner) {
-							(navigation as DatamartOwner).datamartEntity.getEntityAxes(result)
-							for (property : (navigation as DatamartOwner).datamartEntity.attributes) {
-								if (!result.containsName(property.axis.name.literal)) {
-									result.add(
-										EObjectDescription.create(property.axis.name.literal, property as DatamartCubeAxis))
-								}
-							}
-						}
-					}
-					for (property : entity.attributes) {
-						if (property.axis !== null) {
-							if (!result.containsName(property.axis.name.literal)) {
-								result.add(EObjectDescription.create(property.axis.name.literal, property as DatamartCubeAxis))
-							}
-						} else {
-							if (!result.containsName(property.axis.name.literal)) {
-								result.add(EObjectDescription.create(property.axis.name.literal, property as DatamartCubeAxis))
-							}
-						}
+	def void getEntityAxes(DatamartEntity entity, ArrayList<IEObjectDescription> result) {
+		for (navigation : entity.navigations) {
+			if (navigation instanceof DatamartMember) {
+				(navigation as DatamartMember).datamartEntity.getEntityAxes(result)
+				for (property : (navigation as DatamartMember).datamartEntity.attributes) {
+					if (!result.containsName(property.axis.name.literal)) {
+						result.add(
+							EObjectDescription.create(property.axis.name.literal,
+								property as DatamartCubeAxis))
 					}
 				}
+			}
+			if (navigation instanceof DatamartOwner) {
+				(navigation as DatamartOwner).datamartEntity.getEntityAxes(result)
+				for (property : (navigation as DatamartOwner).datamartEntity.attributes) {
+					if (!result.containsName(property.axis.name.literal)) {
+						result.add(
+							EObjectDescription.create(property.axis.name.literal,
+								property as DatamartCubeAxis))
+					}
+				}
+			}
+		}
+		for (property : entity.attributes) {
+			if (property.axis !== null) {
+				if (!result.containsName(property.axis.name.literal)) {
+					result.add(
+						EObjectDescription.create(property.axis.name.literal, property as DatamartCubeAxis))
+				}
+			} else {
+				if (!result.containsName(property.axis.name.literal)) {
+					result.add(
+						EObjectDescription.create(property.axis.name.literal, property as DatamartCubeAxis))
+				}
+			}
+		}
+	}
 
-				def boolean containsName(ArrayList<IEObjectDescription> list, String name) {
-					for (obj : list) {
-						var oname = obj.name.toString
-						if (oname.equals(name)) {
-							return true
-						}
-					}
-					return false
+	def boolean containsName(ArrayList<IEObjectDescription> list, String name) {
+		for (obj : list) {
+			var oname = obj.name.toString
+			if (oname.equals(name)) {
+				return true
+			}
+		}
+		return false
+	}
+	
+	def void allMembers(DatamartHierarchy hierarchy, ArrayList<IEObjectDescription> result) {
+		if ((hierarchy.level instanceof DatamartHierarchyLevelSingle) &&
+			(hierarchy.level as DatamartHierarchyLevelSingle).levelRef !== null) {
+			if (hierarchy.all) { // detailed was modeled - we must add the complete hierarchy
+				var dimEntity = ((hierarchy.level as DatamartHierarchyLevelSingle).levelRef as CubeLevel).
+					eContainer as CubeDimensionEntity
+				for (cubeLevel : dimEntity.hierarchLevels) {
+					result.add(EObjectDescription.create(cubeLevel.name, cubeLevel))
 				}
+			} else {
+				result.add(EObjectDescription.create((hierarchy.level as DatamartHierarchyLevelSingle).levelRef.name,
+					((hierarchy.level as DatamartHierarchyLevelSingle).levelRef as CubeLevel)))
+			}
+
+		} else if ((hierarchy.hierarchyRef as CubeHierarchy).allMemberName) {
+			result.add(EObjectDescription.create((hierarchy.hierarchyRef as CubeHierarchy).allMemberNameValue.toString,
+				(hierarchy.hierarchyRef as CubeHierarchy)))
+		} else if ((hierarchy.defaultMember)) {
+			result.add(EObjectDescription.create((hierarchy.hierarchyRef as CubeHierarchy).defaultMemberValue.toString,
+				(hierarchy.hierarchyRef as CubeHierarchy)))
+		}
+
+	}
 
 				def void getEntityProperties(DatamartEntity entity, ArrayList<IEObjectDescription> result,
-					String requestedAxisName) {
-					for (navigation : entity.navigations) {
-						if (navigation instanceof DatamartMember) {
-							(navigation as DatamartMember).datamartEntity.getEntityProperties(result, requestedAxisName)
-							for (property : (navigation as DatamartMember).datamartEntity.attributes) {
-								if (property.axis.name.literal.equals(requestedAxisName)) {
-									result.add(
-										EObjectDescription.create(DatamartAttributeUtil.getAliasedAttributeName(property),
-											property as DatamartAttribute))
-								}
-							}
-						}
-						if (navigation instanceof DatamartOwner) {
-							(navigation as DatamartOwner).datamartEntity.getEntityProperties(result, requestedAxisName)
-							for (property : (navigation as DatamartOwner).datamartEntity.attributes) {
-								if (property.axis.name.literal.equals(requestedAxisName)) {
-									result.add(
-										EObjectDescription.create(DatamartAttributeUtil.getAliasedAttributeName(property),
-											property as DatamartAttribute))
-								}
-							}
-						}
-					}
-					for (property : entity.attributes) {
-						if (property.axis !== null) {
-							if (property.axis.name.literal.equals(requestedAxisName)) {
-								result.add(
-									EObjectDescription.create(DatamartAttributeUtil.getAliasedAttributeName(property),
-										property as DatamartAttribute))
-							}
-						} else {
-							result.add(
-								EObjectDescription.create(DatamartAttributeUtil.getAliasedAttributeName(property),
-									property as DatamartAttribute))
-
-						}
+		String requestedAxisName) {
+		for (navigation : entity.navigations) {
+			if (navigation instanceof DatamartMember) {
+				(navigation as DatamartMember).datamartEntity.getEntityProperties(result, requestedAxisName)
+				for (property : (navigation as DatamartMember).datamartEntity.attributes) {
+					if (property.axis.name.literal.equals(requestedAxisName)) {
+						result.add(
+							EObjectDescription.create(DatamartAttributeUtil.getAliasedAttributeName(property),
+								property as DatamartAttribute))
 					}
 				}
-
-				def void getTaskColumns(DatamartTask task, ArrayList<IEObjectDescription> result,
-					String requestedAxisName) {
-					for (column : task.columns) {
-						if (AxisEnum.COLUMNS.literal.equals(requestedAxisName)) {
-							result.add(EObjectDescription.create(column.columnRef.literal, column))
-						}
+			}
+			if (navigation instanceof DatamartOwner) {
+				(navigation as DatamartOwner).datamartEntity.getEntityProperties(result, requestedAxisName)
+				for (property : (navigation as DatamartOwner).datamartEntity.attributes) {
+					if (property.axis.name.literal.equals(requestedAxisName)) {
+						result.add(
+							EObjectDescription.create(DatamartAttributeUtil.getAliasedAttributeName(property),
+								property as DatamartAttribute))
 					}
 				}
+			}
+		}
+		for (property : entity.attributes) {
+			if (property.axis !== null) {
+				if (property.axis.name.literal.equals(requestedAxisName)) {
+					result.add(
+						EObjectDescription.create(DatamartAttributeUtil.getAliasedAttributeName(property),
+							property as DatamartAttribute))
+				}
+			} else {
+				result.add(
+					EObjectDescription.create(DatamartAttributeUtil.getAliasedAttributeName(property),
+						property as DatamartAttribute))
 
-				def IScope getScope_Table_valueRef(EObject object, EReference reference) {
-					var result = <IEObjectDescription>newArrayList
-					var eObj = object
-					var requestedAxisName = ""
-					while (!(eObj instanceof TableDatamart)) {
-						eObj = eObj.eContainer
-						if (eObj instanceof TableAxis) {
-							requestedAxisName = (eObj as TableAxis).axis.literal
-						}
-					}
-					if (eObj !== null) {
-						var datamart = (eObj as TableDatamart).datamartRef
-						if (datamart !== null && datamart.source !== null) {
-							if (datamart.source instanceof DatamartCube) {
-								for (axis : (datamart.source as DatamartCube).axisslicer) {
-									if (axis instanceof DatamartCubeAxis) {
-										if ((axis as DatamartCubeAxis).axis.name.literal.equals(requestedAxisName)) {
-											var hasMeasures = false
-											var hasHierarchy = false
-											var hasAggregation = false
-											var isCrossjoined = false
-											for (element : (axis as DatamartCubeAxis).elements) {
-												if (element instanceof DatamartMeasure ||
-													element instanceof DatamartDerivedMeasure) {
-													hasMeasures = true
-												}
-											}
-											for (element : (axis as DatamartCubeAxis).elements) {
-												if (element instanceof DatamartHierarchy) {
-													if (hasHierarchy) {
-														isCrossjoined = true
-													} else {
-														hasHierarchy = true
-													}
-												}
-												if (element instanceof DatamartSetAggregation) {
-													if (hasAggregation) {
-														isCrossjoined = true
-													} else {
-														hasAggregation = true
-													}
-													hasAggregation = true
-												}
-											}
-											if (hasMeasures && (hasHierarchy || hasAggregation)) {
+			}
+		}
+	}
+
+	def void getTaskColumns(DatamartTask task, ArrayList<IEObjectDescription> result, String requestedAxisName) {
+		for (column : task.columns) {
+			if (AxisEnum.COLUMNS.literal.equals(requestedAxisName)) {
+				result.add(EObjectDescription.create(column.columnRef.literal, column))
+			}
+		}
+	}
+
+	def IScope getScope_Table_valueRef(EObject object, EReference reference) {
+		var result = <IEObjectDescription>newArrayList
+		var eObj = object
+		var requestedAxisName = ""
+		while (!(eObj instanceof TableDatamart)) {
+			eObj = eObj.eContainer
+			if (eObj instanceof TableAxis) {
+				requestedAxisName = (eObj as TableAxis).axis.literal
+			}
+		}
+		if (eObj !== null) {
+			var datamart = (eObj as TableDatamart).datamartRef
+			if (datamart !== null && datamart.source !== null) {
+				if (datamart.source instanceof DatamartCube) {
+					for (axis : (datamart.source as DatamartCube).axisslicer) {
+						if (axis instanceof DatamartCubeAxis) {
+							if ((axis as DatamartCubeAxis).axis.name.literal.equals(requestedAxisName)) {
+								var hasMeasures = false
+								var hasHierarchy = false
+								var hasAggregation = false
+								var isCrossjoined = false
+								for (element : (axis as DatamartCubeAxis).elements) {
+									if (element instanceof DatamartMeasure ||
+										element instanceof DatamartDerivedMeasure) {
+										hasMeasures = true
+									}
+								}
+								for (element : (axis as DatamartCubeAxis).elements) {
+									switch(element) {
+										DatamartHierarchy: {
+											if (hasHierarchy) {
 												isCrossjoined = true
+											} else {
+												hasHierarchy = true
 											}
-											for (element : (axis as DatamartCubeAxis).elements) {
-												if (element instanceof DatamartMeasure && reference ==
-													TableDSLPackage.Literals.TABLE_MEASURE__VALUE_REF) {
-													if ((element as DatamartMeasure).measureRef !== null) {
-														result.add(
-															EObjectDescription.create(
-																(element as DatamartMeasure).measureRef.name,
-																element))
-														}
-													}
-													if (element instanceof DatamartDerivedMeasure && reference ==
-														TableDSLPackage.Literals.TABLE_DERIVED__VALUE_REF) {
-														if ((element as DatamartDerivedMeasure).
-															derivedRef !== null) {
-															result.add(
-																EObjectDescription.create(
-																	(element as DatamartDerivedMeasure).
-																		derivedRef.name, element))
-														}
-													}
-													if (element instanceof DatamartHierarchy && !hasMeasures &&
-														reference == TableDSLPackage.Literals.
-															TABLE_HIERARCHY__VALUE_REF) {
-																if ((element as DatamartHierarchy).
-																	hierarchyRef !== null) {
-																	var hierarchy = element as DatamartHierarchy
-																	if ((hierarchy.level instanceof DatamartHierarchyLevelSingle) && (hierarchy.level as DatamartHierarchyLevelSingle).levelRef !== null) {
-																		if (hierarchy.all) { // detailed was modeled - we must add the complete hierarchy
-																			var dimEntity = ((hierarchy.level as DatamartHierarchyLevelSingle).levelRef as CubeLevel).
-																				eContainer as CubeDimensionEntity
-																			for (cubeLevel : dimEntity.
-																				hierarchLevels) {
-																				result.add(
-																					EObjectDescription.create(
-																						cubeLevel.name, cubeLevel))
-																			}
-																		} else {
-																			result.add(
-																				EObjectDescription.create(
-																					(hierarchy.level as DatamartHierarchyLevelSingle).levelRef.name,
-																					((hierarchy.level as DatamartHierarchyLevelSingle).
-																						levelRef as CubeLevel)))
-																			}
-
-																		} else if ((hierarchy.
-																			hierarchyRef as CubeHierarchy).
-																			allMemberName) {
-																			result.add(
-																				EObjectDescription.create(
-																					(hierarchy.
-																						hierarchyRef as CubeHierarchy).
-																						allMemberNameValue.toString,
-																					(hierarchy.
-																						hierarchyRef as CubeHierarchy)))
-																			} else if ((hierarchy.defaultMember)) {
-																				result.add(
-																					EObjectDescription.create(
-																						(hierarchy.
-																							hierarchyRef as CubeHierarchy).
-																							defaultMemberValue.
-																							toString,
-																							(hierarchy.
-																								hierarchyRef as CubeHierarchy)))
-																				}
-																			}
-																		}
-																	}
-																}
-															}
-														}
-													} else if (datamart.source instanceof DatamartEntity) {
-														getEntityProperties(datamart.source as DatamartEntity, result,
-															requestedAxisName)
-													} else if (datamart.source instanceof DatamartTask) {
-														getTaskColumns(datamart.source as DatamartTask, result,
-															requestedAxisName)
-													}
-												}
-
-											}
-											return MapBasedScope.createScope(IScope.NULLSCOPE, result)
 										}
-
-										def IScope getScope_Table_Aggregation_valueRef(EObject object) {
-											var result = <IEObjectDescription>newArrayList
-											var requestedAxisName = ""
-											var eObj = object
-											while (!(eObj instanceof TableDatamart)) {
-												eObj = eObj.eContainer
-												if (eObj instanceof TableAxis) {
-													requestedAxisName = (eObj as TableAxis).axis.literal
-												}
+										DatamartSetAggregation: {
+											if (hasAggregation) {
+												isCrossjoined = true
+											} else {
+												hasAggregation = true
 											}
-											if (eObj !== null) {
-												var datamart = (eObj as TableDatamart).datamartRef
-												if (datamart !== null && datamart.source !== null) {
-													if (datamart.source instanceof DatamartCube) {
-														for (axis : (datamart.source as DatamartCube).axisslicer) {
-															if (axis instanceof DatamartCubeAxis) {
-																if ((axis as DatamartCubeAxis).axis.name.literal.equals(
-																	requestedAxisName)) {
-																	var hasMeasures = false
-																	var hasHierarchy = false
-																	var hasAggregation = false
-																	var isCrossjoined = false
-																	for (element : (axis as DatamartCubeAxis).elements) {
-																		if (element instanceof DatamartMeasure ||
-																			element instanceof DatamartDerivedMeasure) {
-																			hasMeasures = true
-																		}
-																	}
-																	for (element : (axis as DatamartCubeAxis).elements) {
-																		if (element instanceof DatamartHierarchy) {
-																			if (hasHierarchy) {
-																				isCrossjoined = true
-																			} else {
-																				hasHierarchy = true
-																			}
-																		}
-																		if (element instanceof DatamartSetAggregation) {
-																			if (hasAggregation) {
-																				isCrossjoined = true
-																			} else {
-																				hasAggregation = true
-																			}
-																			hasAggregation = true
-																		}
-																	}
-																	if (hasMeasures && (hasHierarchy ||
-																		hasAggregation)) {
-																		isCrossjoined = true
-																	}
-																	if (!hasMeasures && !isCrossjoined) {
-																		for (element : (axis as DatamartCubeAxis).
-																			elements) {
-																			if (element instanceof DatamartSetAggregation) {
-																				if ((element as DatamartSetAggregation).
-																					left !== null) {
-																					if ((element as DatamartSetAggregation).
-																						left.aggregation !== null) {
-																						var aggregation = ((element as DatamartSetAggregation).
-																							left.
-																							aggregation) as DatamartSetAggregationFunction
+											hasAggregation = true
+										}
+									}
+								}
+								if (hasMeasures && (hasHierarchy || hasAggregation)) {
+									isCrossjoined = true
+								}
+								for (element : (axis as DatamartCubeAxis).elements) {
+									switch(element) {
+										DatamartMeasure: {
+											if(reference ==	TableDSLPackage.Literals.TABLE_MEASURE__VALUE_REF && element.measureRef !== null) { 
+												result.add(EObjectDescription.create(element.measureRef.name, element))
+											}
+										}
+										DatamartDerivedMeasure: {
+											if(reference == TableDSLPackage.Literals.TABLE_DERIVED__VALUE_REF && element.derivedRef !== null) {
+												result.add(EObjectDescription.create((element as DatamartDerivedMeasure).derivedRef.name, element))
+											}	
+										}
+										DatamartHierarchy: {
+											if(!hasMeasures && reference ==	TableDSLPackage.Literals.TABLE_HIERARCHY__VALUE_REF && element.hierarchyRef !== null) {
+												element.allMembers(result)
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				} else if (datamart.source instanceof DatamartEntity) {
+					getEntityProperties(datamart.source as DatamartEntity, result, requestedAxisName)
+				} else if (datamart.source instanceof DatamartTask) {
+					getTaskColumns(datamart.source as DatamartTask, result, requestedAxisName)
+				}
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
 
-																							// with EObjectDescription.create, we use our own name computation for scoping - it must return a created scope
-																							result.add(
-																								EObjectDescription.
-																									create(
-																										aggregation.
-																											aggregation.
-																											literal,
-																											aggregation))
-																								}
-																							}
-																						}
-																					}
-																				}
-																			}
-																		}
-																	}
-																}
-															}
-														}
-
-														// with EObjectDescription.create, we use our own name computation for scoping - it must return a created scope
-														return MapBasedScope.createScope(IScope.NULLSCOPE, result)
-													}
-												}
-												
\ No newline at end of file
+	def IScope getScope_Table_Aggregation_valueRef(EObject object) {
+		var result = <IEObjectDescription>newArrayList
+		var requestedAxisName = ""
+		var eObj = object
+		while (!(eObj instanceof TableDatamart)) {
+			eObj = eObj.eContainer
+			if (eObj instanceof TableAxis) {
+				requestedAxisName = (eObj as TableAxis).axis.literal
+			}
+		}
+		if (eObj !== null) {
+			var datamart = (eObj as TableDatamart).datamartRef
+			if (datamart !== null && datamart.source !== null) {
+				if (datamart.source instanceof DatamartCube) {
+					for (axis : (datamart.source as DatamartCube).axisslicer) {
+						if (axis instanceof DatamartCubeAxis) {
+							if ((axis as DatamartCubeAxis).axis.name.literal.equals(requestedAxisName)) {
+								var hasMeasures = false
+								var hasHierarchy = false
+								var hasAggregation = false
+								var isCrossjoined = false
+								for (element : (axis as DatamartCubeAxis).elements) {
+									if (element instanceof DatamartMeasure ||
+										element instanceof DatamartDerivedMeasure) {
+										hasMeasures = true
+									}
+								}
+								for (element : (axis as DatamartCubeAxis).elements) {
+									if (element instanceof DatamartHierarchy) {
+										if (hasHierarchy) {
+											isCrossjoined = true
+										} else {
+											hasHierarchy = true
+										}
+									}
+									if (element instanceof DatamartSetAggregation) {
+										if (hasAggregation) {
+											isCrossjoined = true
+										} else {
+											hasAggregation = true
+										}
+										hasAggregation = true
+									}
+								}
+								if (hasMeasures && (hasHierarchy || hasAggregation)) {
+									isCrossjoined = true
+								}
+								if (!hasMeasures && !isCrossjoined) {
+									for (element : (axis as DatamartCubeAxis).elements) {
+										if (element instanceof DatamartSetAggregation) {
+											if(element.left !== null && element.left.aggregation !== null && element.left.aggregation instanceof DatamartSetAggregationFunction) {
+												var aggregation = element.left.aggregation as DatamartSetAggregationFunction
+												result.add(EObjectDescription.create(aggregation.aggregation.literal, aggregation))
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
+}
+																								
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.table/xtend-gen/org/eclipse/osbp/xtext/table/jvmmodel/TableDSLJvmModelInferrer.java b/org.eclipse.osbp.xtext.table/xtend-gen/org/eclipse/osbp/xtext/table/jvmmodel/TableDSLJvmModelInferrer.java
index 93a0eea..55f196d 100644
--- a/org.eclipse.osbp.xtext.table/xtend-gen/org/eclipse/osbp/xtext/table/jvmmodel/TableDSLJvmModelInferrer.java
+++ b/org.eclipse.osbp.xtext.table/xtend-gen/org/eclipse/osbp/xtext/table/jvmmodel/TableDSLJvmModelInferrer.java
@@ -816,7 +816,7 @@
           }
         }
         {
-          if ((((!this.isGrid(table)) && (!this.isEmbedded(table))) && (this.isTask(table) || this.isCube(table)))) {
+          if (((!this.isGrid(table)) && (!this.isEmbedded(table)))) {
             _builder.append("filterGenerator.addFilterChangeListener(this);");
             _builder.newLine();
           }
@@ -1449,25 +1449,13 @@
           _builder.newLine();
           _builder.append("\t\t\t");
           _builder.append("\t");
-          _builder.append("List<DatamartPrimary<?>> primaryKeys = datamartInstance.getPrimaryList();");
-          _builder.newLine();
-          _builder.append("\t\t\t");
-          _builder.append("\t");
-          _builder.append("for(DatamartPrimary key : primaryKeys) {");
+          _builder.append("if(datamartInstance.contains(event.getData().get(EventDispatcherDataTag.ID))) {");
           _builder.newLine();
           _builder.append("\t\t\t");
           _builder.append("\t\t");
-          _builder.append("if(key.contains(event.getData().get(EventDispatcherDataTag.ID))) {");
-          _builder.newLine();
-          _builder.append("\t\t\t");
-          _builder.append("\t\t\t");
           _builder.append("dataRefresh();");
           _builder.newLine();
           _builder.append("\t\t\t");
-          _builder.append("\t\t");
-          _builder.append("}");
-          _builder.newLine();
-          _builder.append("\t\t\t");
           _builder.append("\t");
           _builder.append("}");
           _builder.newLine();
@@ -1532,67 +1520,175 @@
       _builder.append("break;");
       _builder.newLine();
       body = _builder.toString();
-      StringConcatenation _builder_1 = new StringConcatenation();
-      _builder_1.append(body);
-      _builder_1.newLineIfNotEmpty();
-      _builder_1.append("\t");
-      _builder_1.append("}");
-      _builder_1.newLine();
-      body = _builder_1.toString();
+      if ((((!this.isEmbedded(table)) && (table.getTabletype().getToolbar() != null)) && (table.getTabletype().getToolbar().eContainer() != null))) {
+        StringConcatenation _builder_1 = new StringConcatenation();
+        _builder_1.append(body);
+        _builder_1.newLineIfNotEmpty();
+        _builder_1.append("\t");
+        _builder_1.append("case ACTION:");
+        _builder_1.newLine();
+        _builder_1.append("\t\t");
+        _builder_1.append("if (toolbarUUID.equals(event.getTopic()) && event.getData().containsKey(EventDispatcherDataTag.BUTTON_ID)) {");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t");
+        _builder_1.append("Object id = event.getData().get(EventDispatcherDataTag.BUTTON_ID);");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t");
+        _builder_1.append("if (id instanceof TableActionEnum) {");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t\t");
+        _builder_1.append("TableActionEnum enumId = (TableActionEnum) id;");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t\t");
+        _builder_1.append("switch (enumId) {");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t\t");
+        _builder_1.append("case EXPORT_EXCEL:");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t\t\t");
+        _builder_1.append("for(CellSetFilterTable table:tables) {");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t\t\t\t");
+        _builder_1.append("ExcelExport excelExport = new ExcelExport(table, themeResourceService);");
+        _builder_1.newLine();
+        _builder_1.append("\t\t                ");
+        _builder_1.append("excelExport.excludeCollapsedColumns();");
+        _builder_1.newLine();
+        _builder_1.append("\t\t                ");
+        _builder_1.append("excelExport.setReportTitle(layoutManager.getCaption());");
+        _builder_1.newLine();
+        _builder_1.append("\t\t                ");
+        _builder_1.append("excelExport.export();");
+        _builder_1.newLine();
+        _builder_1.append("\t\t            ");
+        _builder_1.append("}");
+        _builder_1.newLine();
+        _builder_1.append("\t                ");
+        _builder_1.append("break;");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t\t");
+        _builder_1.append("case EXPORT_CSV:");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t\t\t");
+        _builder_1.append("for(CellSetFilterTable table:tables) {");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t\t\t\t");
+        _builder_1.append("CsvExport csvExport = new CsvExport(table, themeResourceService);");
+        _builder_1.newLine();
+        _builder_1.append("\t\t                ");
+        _builder_1.append("csvExport.excludeCollapsedColumns();");
+        _builder_1.newLine();
+        _builder_1.append("\t\t                ");
+        _builder_1.append("csvExport.setReportTitle(layoutManager.getCaption());");
+        _builder_1.newLine();
+        _builder_1.append("\t\t                ");
+        _builder_1.append("csvExport.export();");
+        _builder_1.newLine();
+        _builder_1.append("\t\t            ");
+        _builder_1.append("}");
+        _builder_1.newLine();
+        _builder_1.append("\t                ");
+        _builder_1.append("break;");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t\t");
+        _builder_1.append("case EXPORT_PDF:");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t\t\t");
+        _builder_1.append("for(CellSetFilterTable table:tables) {");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t\t\t\t");
+        _builder_1.append("PdfExport pdfExport = new PdfExport(table, themeResourceService);");
+        _builder_1.newLine();
+        _builder_1.append("\t\t                ");
+        _builder_1.append("pdfExport.excludeCollapsedColumns();");
+        _builder_1.newLine();
+        _builder_1.append("\t\t                ");
+        _builder_1.append("pdfExport.setReportTitle(layoutManager.getCaption());");
+        _builder_1.newLine();
+        _builder_1.append("\t\t                ");
+        _builder_1.append("pdfExport.export();");
+        _builder_1.newLine();
+        _builder_1.append("\t\t            ");
+        _builder_1.append("}");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t\t\t");
+        _builder_1.append("break;");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t\t");
+        _builder_1.append("}");
+        _builder_1.newLine();
+        _builder_1.append("\t\t\t");
+        _builder_1.append("}");
+        _builder_1.newLine();
+        _builder_1.append("\t\t");
+        _builder_1.append("}");
+        _builder_1.newLine();
+        _builder_1.append("\t\t");
+        _builder_1.append("break;");
+        _builder_1.newLine();
+        body = _builder_1.toString();
+      }
+      StringConcatenation _builder_2 = new StringConcatenation();
+      _builder_2.append(body);
+      _builder_2.newLineIfNotEmpty();
+      _builder_2.append("\t");
+      _builder_2.append("}");
+      _builder_2.newLine();
+      body = _builder_2.toString();
     } else {
       boolean _isGrid = this.isGrid(table);
       if (_isGrid) {
-        StringConcatenation _builder_2 = new StringConcatenation();
-        _builder_2.append(body);
-        _builder_2.newLineIfNotEmpty();
-        _builder_2.append("switch(event.getCommand()) {");
-        _builder_2.newLine();
-        _builder_2.append("\t");
-        _builder_2.append("case SAVE:");
-        _builder_2.newLine();
-        _builder_2.append("\t");
-        _builder_2.append("case DELETE:");
-        _builder_2.newLine();
-        _builder_2.append("\t");
-        _builder_2.append("case REFRESH:");
-        _builder_2.newLine();
-        _builder_2.append("\t\t");
-        _builder_2.append("if(!event.getSender().equals(\"");
+        StringConcatenation _builder_3 = new StringConcatenation();
+        _builder_3.append(body);
+        _builder_3.newLineIfNotEmpty();
+        _builder_3.append("switch(event.getCommand()) {");
+        _builder_3.newLine();
+        _builder_3.append("\t");
+        _builder_3.append("case SAVE:");
+        _builder_3.newLine();
+        _builder_3.append("\t");
+        _builder_3.append("case DELETE:");
+        _builder_3.newLine();
+        _builder_3.append("\t");
+        _builder_3.append("case REFRESH:");
+        _builder_3.newLine();
+        _builder_3.append("\t\t");
+        _builder_3.append("if(!event.getSender().equals(\"");
         QualifiedName _fullyQualifiedName_5 = this._iQualifiedNameProvider.getFullyQualifiedName(table);
-        _builder_2.append(_fullyQualifiedName_5, "\t\t");
-        _builder_2.append("\")) {");
-        _builder_2.newLineIfNotEmpty();
+        _builder_3.append(_fullyQualifiedName_5, "\t\t");
+        _builder_3.append("\")) {");
+        _builder_3.newLineIfNotEmpty();
         {
           Set<LEntity> _findRequestedEntities_2 = this.findRequestedEntities(table);
           for(final LEntity e_2 : _findRequestedEntities_2) {
-            _builder_2.append("\t\t\t");
-            _builder_2.append("if(event.getTopic().equals(\"");
+            _builder_3.append("\t\t\t");
+            _builder_3.append("if(event.getTopic().equals(\"");
             QualifiedName _fullyQualifiedName_6 = this._iQualifiedNameProvider.getFullyQualifiedName(e_2);
-            _builder_2.append(_fullyQualifiedName_6, "\t\t\t");
-            _builder_2.append("\")){");
-            _builder_2.newLineIfNotEmpty();
-            _builder_2.append("\t\t\t");
-            _builder_2.append("\t");
-            _builder_2.append("// TODO: GridRefresh");
-            _builder_2.newLine();
-            _builder_2.append("\t\t\t");
-            _builder_2.append("\t");
-            _builder_2.append("grid.refreshData();");
-            _builder_2.newLine();
-            _builder_2.append("\t\t\t");
-            _builder_2.append("}");
-            _builder_2.newLine();
+            _builder_3.append(_fullyQualifiedName_6, "\t\t\t");
+            _builder_3.append("\")){");
+            _builder_3.newLineIfNotEmpty();
+            _builder_3.append("\t\t\t");
+            _builder_3.append("\t");
+            _builder_3.append("// TODO: GridRefresh");
+            _builder_3.newLine();
+            _builder_3.append("\t\t\t");
+            _builder_3.append("\t");
+            _builder_3.append("grid.refreshData();");
+            _builder_3.newLine();
+            _builder_3.append("\t\t\t");
+            _builder_3.append("}");
+            _builder_3.newLine();
           }
         }
-        _builder_2.append("\t\t");
-        _builder_2.append("}");
-        _builder_2.newLine();
-        _builder_2.append("\t\t");
-        _builder_2.append("break;");
-        _builder_2.newLine();
-        _builder_2.append("}");
-        _builder_2.newLine();
-        body = _builder_2.toString();
+        _builder_3.append("\t\t");
+        _builder_3.append("}");
+        _builder_3.newLine();
+        _builder_3.append("\t\t");
+        _builder_3.append("break;");
+        _builder_3.newLine();
+        _builder_3.append("}");
+        _builder_3.newLine();
+        body = _builder_3.toString();
       }
     }
     return body;
@@ -5915,7 +6011,19 @@
         _builder.newLine();
         _builder.append("\t\t");
         _builder.append("\t");
-        _builder.append("b.setEnabled(table.getValue() != null);");
+        _builder.append("b.setEnabled(table.getValue() != null && ");
+        _builder.newLine();
+        _builder.append("\t\t");
+        _builder.append("\t\t");
+        _builder.append("(dataSourceContainer.getTaskStatus(selection).equals(BPMStatus.Created) ||");
+        _builder.newLine();
+        _builder.append("\t\t");
+        _builder.append("\t\t");
+        _builder.append("dataSourceContainer.getTaskStatus(selection).equals(BPMStatus.Ready) ||");
+        _builder.newLine();
+        _builder.append("\t\t");
+        _builder.append("\t\t");
+        _builder.append("dataSourceContainer.getTaskStatus(selection).equals(BPMStatus.Suspended)));");
         _builder.newLine();
         _builder.append("\t\t");
         _builder.append("}");
@@ -5970,71 +6078,79 @@
                 boolean _tripleNotEquals = (_primaryKeyAttribute != null);
                 if (_tripleNotEquals) {
                   _builder_1.append("\t\t");
-                  _builder_1.append("Object idObj = dataSourceContainer.getValueByProperty(selection, \"");
-                  String _lowerCase = alias.toLowerCase();
-                  _builder_1.append(_lowerCase, "\t\t");
-                  _builder_1.append("\");");
-                  _builder_1.newLineIfNotEmpty();
-                  _builder_1.append("\t\t");
-                  _builder_1.append("MPerspective perspective = getContext().get(MPerspective.class);");
-                  _builder_1.newLine();
-                  _builder_1.append("\t\t");
-                  _builder_1.append("EventDispatcherEvent evnt = new EventDispatcherEvent(perspective, EventDispatcherCommand.SELECT, \"");
-                  QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(this.baseType(entity));
-                  _builder_1.append(_fullyQualifiedName, "\t\t");
-                  _builder_1.append(".");
-                  String _idAttributeName = entity.getIdAttributeName();
-                  _builder_1.append(_idAttributeName, "\t\t");
-                  _builder_1.append("\", \"");
-                  QualifiedName _fullyQualifiedName_1 = this._iQualifiedNameProvider.getFullyQualifiedName(table);
-                  _builder_1.append(_fullyQualifiedName_1, "\t\t");
-                  _builder_1.append("\");");
-                  _builder_1.newLineIfNotEmpty();
-                  _builder_1.append("\t\t");
-                  _builder_1.append("evnt.addItem(EventDispatcherDataTag.ID, idObj);");
-                  _builder_1.newLine();
-                  _builder_1.append("\t\t");
-                  _builder_1.append("eventDispatcher.sendEvent(evnt);");
-                  _builder_1.newLine();
-                  _builder_1.append("\t\t");
-                  _builder_1.append("SelectionStore.putSelectionToPerspectiveContext(getPart(), \"");
-                  QualifiedName _fullyQualifiedName_2 = this._iQualifiedNameProvider.getFullyQualifiedName(this.baseType(entity));
-                  _builder_1.append(_fullyQualifiedName_2, "\t\t");
-                  _builder_1.append(".");
-                  String _idAttributeName_1 = entity.getIdAttributeName();
-                  _builder_1.append(_idAttributeName_1, "\t\t");
-                  _builder_1.append("\", idObj);");
-                  _builder_1.newLineIfNotEmpty();
-                  _builder_1.append("\t\t");
-                  _builder_1.append("for (DatamartPrimary<?> primary : datamartInstance.getPrimaryList()){");
+                  _builder_1.append("if(selection != -1) {");
                   _builder_1.newLine();
                   _builder_1.append("\t\t");
                   _builder_1.append("\t");
-                  _builder_1.append("if (!\"");
-                  QualifiedName _fullyQualifiedName_3 = this._iQualifiedNameProvider.getFullyQualifiedName(this.baseType(entity));
-                  _builder_1.append(_fullyQualifiedName_3, "\t\t\t");
-                  _builder_1.append("\".equals(primary.getEntityName())){");
+                  _builder_1.append("Object idObj = datamartInstance.getPrimaryListKeys(\"");
+                  _builder_1.append(alias, "\t\t\t");
+                  _builder_1.append("\").get(selection);");
                   _builder_1.newLineIfNotEmpty();
                   _builder_1.append("\t\t");
-                  _builder_1.append("\t\t");
-                  _builder_1.append("Object primaryValue = dataSourceContainer.getValueByProperty(selection, primary.getAlias().toLowerCase());");
-                  _builder_1.newLine();
-                  _builder_1.append("\t\t");
-                  _builder_1.append("\t\t");
-                  _builder_1.append("evnt = new EventDispatcherEvent(perspective, EventDispatcherCommand.SELECT, primary.getEntityName() + \".\" + primary.getAttributeName(), \"");
-                  QualifiedName _fullyQualifiedName_4 = this._iQualifiedNameProvider.getFullyQualifiedName(table);
-                  _builder_1.append(_fullyQualifiedName_4, "\t\t\t\t");
+                  _builder_1.append("\t");
+                  _builder_1.append("EventDispatcherEvent evnt = new EventDispatcherEvent(getContext().get(MPerspective.class), EventDispatcherCommand.SELECT, \"");
+                  QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(this.baseType(entity));
+                  _builder_1.append(_fullyQualifiedName, "\t\t\t");
+                  _builder_1.append(".");
+                  String _idAttributeName = entity.getIdAttributeName();
+                  _builder_1.append(_idAttributeName, "\t\t\t");
+                  _builder_1.append("\", \"");
+                  QualifiedName _fullyQualifiedName_1 = this._iQualifiedNameProvider.getFullyQualifiedName(table);
+                  _builder_1.append(_fullyQualifiedName_1, "\t\t\t");
                   _builder_1.append("\");");
                   _builder_1.newLineIfNotEmpty();
                   _builder_1.append("\t\t");
+                  _builder_1.append("\t");
+                  _builder_1.append("evnt.addItem(EventDispatcherDataTag.ID, idObj);");
+                  _builder_1.newLine();
                   _builder_1.append("\t\t");
-                  _builder_1.append("evnt.addItem(EventDispatcherDataTag.ID, primaryValue);");
+                  _builder_1.append("\t");
+                  _builder_1.append("eventDispatcher.sendEvent(evnt);");
+                  _builder_1.newLine();
+                  _builder_1.append("\t\t");
+                  _builder_1.append("\t");
+                  _builder_1.append("SelectionStore.putSelectionToPerspectiveContext(getPart(), \"");
+                  QualifiedName _fullyQualifiedName_2 = this._iQualifiedNameProvider.getFullyQualifiedName(this.baseType(entity));
+                  _builder_1.append(_fullyQualifiedName_2, "\t\t\t");
+                  _builder_1.append(".");
+                  String _idAttributeName_1 = entity.getIdAttributeName();
+                  _builder_1.append(_idAttributeName_1, "\t\t\t");
+                  _builder_1.append("\", idObj);");
+                  _builder_1.newLineIfNotEmpty();
+                  _builder_1.append("\t\t");
+                  _builder_1.append("\t");
+                  _builder_1.append("// send all refs too");
+                  _builder_1.newLine();
+                  _builder_1.append("\t\t");
+                  _builder_1.append("\t");
+                  _builder_1.append("for (String alias : datamartInstance.getPrimaryList().keySet()){");
                   _builder_1.newLine();
                   _builder_1.append("\t\t");
                   _builder_1.append("\t\t");
+                  _builder_1.append("if (!\"");
+                  _builder_1.append(alias, "\t\t\t\t");
+                  _builder_1.append("\".equals(alias)){");
+                  _builder_1.newLineIfNotEmpty();
+                  _builder_1.append("\t\t");
+                  _builder_1.append("\t\t\t");
+                  _builder_1.append("evnt = new EventDispatcherEvent(getContext().get(MPerspective.class), EventDispatcherCommand.SELECT, datamartInstance.getPrimaryList().get(alias).getEntityName() + \".\" + datamartInstance.getPrimaryList().get(alias).getAttributeName(), \"");
+                  QualifiedName _fullyQualifiedName_3 = this._iQualifiedNameProvider.getFullyQualifiedName(table);
+                  _builder_1.append(_fullyQualifiedName_3, "\t\t\t\t\t");
+                  _builder_1.append("\");");
+                  _builder_1.newLineIfNotEmpty();
+                  _builder_1.append("\t\t");
+                  _builder_1.append("\t\t\t");
+                  _builder_1.append("evnt.addItem(EventDispatcherDataTag.ID, datamartInstance.getPrimaryListKeys(alias).get(selection));");
+                  _builder_1.newLine();
+                  _builder_1.append("\t\t");
+                  _builder_1.append("\t\t\t");
                   _builder_1.append("eventDispatcher.sendEvent(evnt);");
                   _builder_1.newLine();
                   _builder_1.append("\t\t");
+                  _builder_1.append("\t\t");
+                  _builder_1.append("}");
+                  _builder_1.newLine();
+                  _builder_1.append("\t\t");
                   _builder_1.append("\t");
                   _builder_1.append("}");
                   _builder_1.newLine();
@@ -6060,34 +6176,37 @@
             StringConcatenation _builder_1 = new StringConcatenation();
             _builder_1.append(body);
             _builder_1.newLineIfNotEmpty();
+            _builder_1.append("\t\t");
+            _builder_1.append("if(selection != -1) {");
+            _builder_1.newLine();
             {
               TableValueElement _source_1 = event.getSource();
               if ((_source_1 instanceof TableOrdinal)) {
-                _builder_1.append("\t\t");
+                _builder_1.append("\t\t\t");
                 _builder_1.append("EventDispatcherEvent evnt");
-                _builder_1.append(evntCnt, "\t\t");
-                _builder_1.append(" = new EventDispatcherEvent(perspective, EventDispatcherCommand.SELECT, \"");
+                _builder_1.append(evntCnt, "\t\t\t");
+                _builder_1.append(" = new EventDispatcherEvent(getContext().get(MPerspective.class), EventDispatcherCommand.SELECT, \"");
                 TableValueElement _source_2 = event.getSource();
                 String _valueRef = ((TableOrdinal) _source_2).getValueRef();
-                _builder_1.append(_valueRef, "\t\t");
+                _builder_1.append(_valueRef, "\t\t\t");
                 _builder_1.append("\", \"");
                 QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(table);
-                _builder_1.append(_fullyQualifiedName, "\t\t");
+                _builder_1.append(_fullyQualifiedName, "\t\t\t");
                 _builder_1.append("\");");
                 _builder_1.newLineIfNotEmpty();
               } else {
                 TableValueElement _source_3 = event.getSource();
                 if ((_source_3 instanceof TableAttribute)) {
-                  _builder_1.append("\t\t");
+                  _builder_1.append("\t\t\t");
                   _builder_1.append("EventDispatcherEvent evnt");
-                  _builder_1.append(evntCnt, "\t\t");
-                  _builder_1.append(" = new EventDispatcherEvent(perspective, EventDispatcherCommand.SELECT, \"");
+                  _builder_1.append(evntCnt, "\t\t\t");
+                  _builder_1.append(" = new EventDispatcherEvent(getContext().get(MPerspective.class), EventDispatcherCommand.SELECT, \"");
                   TableValueElement _source_4 = event.getSource();
                   String _name = ((TableAttribute) _source_4).getValueRef().getAttributeRef().getName();
-                  _builder_1.append(_name, "\t\t");
+                  _builder_1.append(_name, "\t\t\t");
                   _builder_1.append("\", \"");
                   QualifiedName _fullyQualifiedName_1 = this._iQualifiedNameProvider.getFullyQualifiedName(table);
-                  _builder_1.append(_fullyQualifiedName_1, "\t\t");
+                  _builder_1.append(_fullyQualifiedName_1, "\t\t\t");
                   _builder_1.append("\");");
                   _builder_1.newLineIfNotEmpty();
                 }
@@ -6096,40 +6215,43 @@
             {
               TableValueElement _source_5 = event.getSource();
               if ((_source_5 instanceof TableOrdinal)) {
-                _builder_1.append("\t\t");
+                _builder_1.append("\t\t\t");
                 _builder_1.append("evnt");
-                _builder_1.append(evntCnt, "\t\t");
+                _builder_1.append(evntCnt, "\t\t\t");
                 _builder_1.append(".addItem(EventDispatcherDataTag.LIST, dataSourceContainer.getValueByProperty(selection, \"");
                 TableValueElement _source_6 = event.getSource();
                 String _valueRef_1 = ((TableOrdinal) _source_6).getValueRef();
-                _builder_1.append(_valueRef_1, "\t\t");
+                _builder_1.append(_valueRef_1, "\t\t\t");
                 _builder_1.append("\"));");
                 _builder_1.newLineIfNotEmpty();
-                _builder_1.append("\t\t");
+                _builder_1.append("\t\t\t");
                 _builder_1.append("eventDispatcher.sendEvent(evnt");
-                _builder_1.append(evntCnt, "\t\t");
+                _builder_1.append(evntCnt, "\t\t\t");
                 _builder_1.append(");");
                 _builder_1.newLineIfNotEmpty();
               } else {
                 TableValueElement _source_7 = event.getSource();
                 if ((_source_7 instanceof TableAttribute)) {
-                  _builder_1.append("\t\t");
+                  _builder_1.append("\t\t\t");
                   _builder_1.append("evnt");
-                  _builder_1.append(evntCnt, "\t\t");
+                  _builder_1.append(evntCnt, "\t\t\t");
                   _builder_1.append(".addItem(EventDispatcherDataTag.LIST, dataSourceContainer.getValueByProperty(selection, \"");
                   TableValueElement _source_8 = event.getSource();
                   String _name_1 = ((TableAttribute) _source_8).getValueRef().getAttributeRef().getName();
-                  _builder_1.append(_name_1, "\t\t");
+                  _builder_1.append(_name_1, "\t\t\t");
                   _builder_1.append("\"));");
                   _builder_1.newLineIfNotEmpty();
-                  _builder_1.append("\t\t");
+                  _builder_1.append("\t\t\t");
                   _builder_1.append("eventDispatcher.sendEvent(evnt");
-                  _builder_1.append(evntCnt, "\t\t");
+                  _builder_1.append(evntCnt, "\t\t\t");
                   _builder_1.append(");");
                   _builder_1.newLineIfNotEmpty();
                 }
               }
             }
+            _builder_1.append("\t\t");
+            _builder_1.append("} ");
+            _builder_1.newLine();
             body = _builder_1.toString();
             evntCnt = (evntCnt + 1);
           }
@@ -6254,14 +6376,23 @@
     _builder.append("if (container != null) {");
     _builder.newLine();
     _builder.append("\t");
-    _builder.append("List<DerivedMember> members = container.getColumnPosition(visibleColumnKey).getMembers();");
+    _builder.append("DerivedPosition pos = container.getColumnPosition(visibleColumnKey);");
     _builder.newLine();
     _builder.append("\t");
-    _builder.append("for (DerivedMember member : members) {");
+    _builder.append("if ( pos != null ) {");
     _builder.newLine();
     _builder.append("\t\t");
+    _builder.append("List<DerivedMember> members = pos.getMembers();");
+    _builder.newLine();
+    _builder.append("\t\t");
+    _builder.append("for (DerivedMember member : members) {");
+    _builder.newLine();
+    _builder.append("\t\t\t");
     _builder.append("membersHash += (member.getUniqueName() != null) ? member.getUniqueName().hashCode() : member.hashCode();");
     _builder.newLine();
+    _builder.append("\t\t");
+    _builder.append("}");
+    _builder.newLine();
     _builder.append("\t");
     _builder.append("}");
     _builder.newLine();
@@ -6521,6 +6652,11 @@
     IdAttribute prop = new IdAttribute();
     prop.collapsed = true;
     map.put(DatamartDefinitionUtil.getEntityIdAliasName(entity.getEntityRef()), prop);
+    boolean _isHistorizedOrTimedependentWithParent = entity.getEntityRef().isHistorizedOrTimedependentWithParent();
+    if (_isHistorizedOrTimedependentWithParent) {
+      map.put(DatamartDefinitionUtil.getEntityValidAliasName(entity.getEntityRef()), prop);
+      map.put(DatamartDefinitionUtil.getEntityCurrentAliasName(entity.getEntityRef()), prop);
+    }
     EList<DatamartNavigation> _navigations = entity.getNavigations();
     for (final DatamartNavigation navigation : _navigations) {
       this.iterateIdMap(navigation.getDatamartEntity(), map);
@@ -6620,52 +6756,61 @@
       StringConcatenation _builder = new StringConcatenation();
       _builder.append("List<Integer> selections = new ArrayList<>();");
       _builder.newLine();
-      _builder.append("IDto workloadDto = taskClient.getWorkloadDto(taskSummary);");
-      _builder.newLine();
-      _builder.append("List<IDto> operativeDtos = workLoadItem.getOperativeDtos(workloadDto);");
-      _builder.newLine();
-      _builder.append("if\t(operativeDtos != null) {");
+      _builder.append("if(taskSummary != null) {");
       _builder.newLine();
       _builder.append("\t");
+      _builder.append("IDto workloadDto = taskClient.getWorkloadDto(taskSummary);");
+      _builder.newLine();
+      _builder.append("\t");
+      _builder.append("List<IDto> operativeDtos = workLoadItem.getOperativeDtos(workloadDto);");
+      _builder.newLine();
+      _builder.append("\t");
+      _builder.append("if\t(operativeDtos != null) {");
+      _builder.newLine();
+      _builder.append("\t\t");
       _builder.append("Set<String> ids = new TreeSet<String>();");
       _builder.newLine();
-      _builder.append("    ");
+      _builder.append("\t    ");
       _builder.append("for\t(IDto operativeDto : operativeDtos) {");
       _builder.newLine();
-      _builder.append("    \t");
+      _builder.append("\t    \t");
       _builder.append("ids.add(String.valueOf(((");
-      _builder.append(dtoFqn, "    \t");
+      _builder.append(dtoFqn, "\t    \t");
       _builder.append(")operativeDto).");
-      _builder.append(keyGetter, "    \t");
+      _builder.append(keyGetter, "\t    \t");
       _builder.append("));");
       _builder.newLineIfNotEmpty();
-      _builder.append("    ");
+      _builder.append("\t    ");
       _builder.append("}");
       _builder.newLine();
-      _builder.append("    ");
+      _builder.append("\t    ");
       _builder.append("for\t(Object selection : dataSourceContainer.getAllItemIds()) {");
       _builder.newLine();
-      _builder.append("        ");
+      _builder.append("\t        ");
       _builder.append("String idValue = dataSourceContainer.getStringValueByProperty((Integer)selection,\"");
-      _builder.append(alias, "        ");
+      _builder.append(alias, "\t        ");
       _builder.append("\");");
       _builder.newLineIfNotEmpty();
-      _builder.append("    \t");
+      _builder.append("\t    \t");
       _builder.append("if\t(ids.contains(idValue)) {");
       _builder.newLine();
-      _builder.append("    \t\t");
+      _builder.append("\t    \t\t");
       _builder.append("selections.add((Integer)selection);");
       _builder.newLine();
-      _builder.append("    \t");
+      _builder.append("\t    \t");
       _builder.append("}");
       _builder.newLine();
-      _builder.append("    ");
+      _builder.append("\t    ");
       _builder.append("}");
       _builder.newLine();
+      _builder.append("\t");
       _builder.append("}");
       _builder.newLine();
+      _builder.append("\t");
       _builder.append("selectTable.setValue(selections);");
       _builder.newLine();
+      _builder.append("}");
+      _builder.newLine();
       _xblockexpression = _builder;
     }
     return _xblockexpression;
@@ -6692,9 +6837,9 @@
           LDataType keyType = this._modelExtensions.getDatatype(entity.getPrimaryKeyAttribute());
           String dtoFqn = EntityUtils.getDtoFQNForLEntity(entity);
           StringConcatenation _builder = new StringConcatenation();
-          _builder.append("IDTOServiceWithMutablePersistence<");
+          _builder.append("IDTOService<");
           _builder.append(dtoFqn);
-          _builder.append("> dtoService = (IDTOServiceWithMutablePersistence<");
+          _builder.append("> dtoService = (IDTOService<");
           _builder.append(dtoFqn);
           _builder.append(">) DtoServiceAccess.getService(");
           _builder.append(dtoFqn);
@@ -6704,9 +6849,12 @@
           _builder.append(alias);
           _builder.append("\");");
           _builder.newLineIfNotEmpty();
-          _builder.append("if\t(selected) {");
+          _builder.append("if(taskSummary != null) {");
           _builder.newLine();
           _builder.append("\t");
+          _builder.append("if\t(selected) {");
+          _builder.newLine();
+          _builder.append("\t\t");
           _builder.append("workLoadItem.addOperativeDto(taskClient.getWorkloadDto(taskSummary), ");
           {
             boolean _equals = "int".equals(keyType.getName());
@@ -6718,16 +6866,18 @@
           }
           _builder.append(");");
           _builder.newLineIfNotEmpty();
+          _builder.append("\t");
           _builder.append("}");
           _builder.newLine();
+          _builder.append("\t");
           _builder.append("else {");
           _builder.newLine();
-          _builder.append("   \t");
+          _builder.append("\t   \t");
           _builder.append("for(IDto dtoToRemove : workLoadItem.getOperativeDtos(taskClient.getWorkloadDto(taskSummary))) {");
           _builder.newLine();
-          _builder.append("\t\t");
+          _builder.append("\t\t\t");
           _builder.append("if(((");
-          _builder.append(dtoFqn, "\t\t");
+          _builder.append(dtoFqn, "\t\t\t");
           _builder.append(")dtoToRemove).getId()");
           {
             boolean _equals_1 = "int".equals(keyType.getName());
@@ -6739,18 +6889,60 @@
           }
           _builder.append(") {");
           _builder.newLineIfNotEmpty();
-          _builder.append("\t\t\t");
+          _builder.append("\t\t\t\t");
           _builder.append("workLoadItem.removeOperativeDto(taskClient.getWorkloadDto(taskSummary), dtoToRemove);");
           _builder.newLine();
-          _builder.append("\t\t\t");
+          _builder.append("\t\t\t\t");
           _builder.append("break;");
           _builder.newLine();
+          _builder.append("\t\t\t");
+          _builder.append("}");
+          _builder.newLine();
           _builder.append("\t\t");
           _builder.append("}");
           _builder.newLine();
           _builder.append("\t");
           _builder.append("}");
           _builder.newLine();
+          _builder.append("} else {");
+          _builder.newLine();
+          _builder.append("\t");
+          _builder.append("if(selected) {");
+          _builder.newLine();
+          _builder.append("\t\t");
+          _builder.append("SelectionStore.addSelectionToPerspectiveContext(getPart(), \"");
+          _builder.append(dtoFqn, "\t\t");
+          _builder.append("\", ");
+          {
+            boolean _equals_2 = "int".equals(keyType.getName());
+            if (_equals_2) {
+              _builder.append("dtoService.get((int) Integer.parseInt(idValue))");
+            } else {
+              _builder.append("dtoService.get(idValue)");
+            }
+          }
+          _builder.append(");");
+          _builder.newLineIfNotEmpty();
+          _builder.append("\t");
+          _builder.append("} else {");
+          _builder.newLine();
+          _builder.append("\t\t");
+          _builder.append("SelectionStore.removeSelectionFromPerspectiveContext(getPart(), \"");
+          _builder.append(dtoFqn, "\t\t");
+          _builder.append("\", ");
+          {
+            boolean _equals_3 = "int".equals(keyType.getName());
+            if (_equals_3) {
+              _builder.append("dtoService.get((int) Integer.parseInt(idValue))");
+            } else {
+              _builder.append("dtoService.get(idValue)");
+            }
+          }
+          _builder.append(");");
+          _builder.newLineIfNotEmpty();
+          _builder.append("\t");
+          _builder.append("}");
+          _builder.newLine();
           _builder.append("}");
           _builder.newLine();
           _xblockexpression = _builder;
diff --git a/org.eclipse.osbp.xtext.table/xtend-gen/org/eclipse/osbp/xtext/table/jvmmodel/TableModelGenerator.java b/org.eclipse.osbp.xtext.table/xtend-gen/org/eclipse/osbp/xtext/table/jvmmodel/TableModelGenerator.java
index 90ba902..9d39d53 100644
--- a/org.eclipse.osbp.xtext.table/xtend-gen/org/eclipse/osbp/xtext/table/jvmmodel/TableModelGenerator.java
+++ b/org.eclipse.osbp.xtext.table/xtend-gen/org/eclipse/osbp/xtext/table/jvmmodel/TableModelGenerator.java
@@ -55,6 +55,7 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.osbp.bpm.api.BPMOperation;
+import org.eclipse.osbp.bpm.api.BPMStatus;
 import org.eclipse.osbp.bpm.api.BPMTaskEventType;
 import org.eclipse.osbp.bpm.api.BPMTaskSummary;
 import org.eclipse.osbp.bpm.api.BPMTaskUserEvent;
@@ -69,7 +70,7 @@
 import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent;
 import org.eclipse.osbp.runtime.common.event.IDualData;
 import org.eclipse.osbp.runtime.common.event.SelectionStore;
-import org.eclipse.osbp.runtime.common.filter.IDTOServiceWithMutablePersistence;
+import org.eclipse.osbp.runtime.common.filter.IDTOService;
 import org.eclipse.osbp.runtime.web.vaadin.common.data.IBeanSearchServiceFactory;
 import org.eclipse.osbp.ui.api.contextfunction.IViewEmbeddedProvider;
 import org.eclipse.osbp.ui.api.customfields.IBlobService;
@@ -84,6 +85,7 @@
 import org.eclipse.osbp.utils.vaadin.ViewLayoutManager;
 import org.eclipse.osbp.vaaclipse.common.ecview.api.IECViewSessionHelper;
 import org.eclipse.osbp.xtext.action.SelectWorkloadActionEnum;
+import org.eclipse.osbp.xtext.action.TableActionEnum;
 import org.eclipse.osbp.xtext.basic.generator.BasicDslGeneratorUtils;
 import org.eclipse.osbp.xtext.blip.BlipItem;
 import org.eclipse.osbp.xtext.datamart.common.AEntityDatamart;
@@ -102,6 +104,9 @@
 import org.eclipse.osbp.xtext.table.common.CheckboxSelectionCellSetFilterTable;
 import org.eclipse.osbp.xtext.table.common.TableFilterDecorator;
 import org.eclipse.osbp.xtext.table.common.TableFilterGenerator;
+import org.eclipse.osbp.xtext.table.common.export.CsvExport;
+import org.eclipse.osbp.xtext.table.common.export.ExcelExport;
+import org.eclipse.osbp.xtext.table.common.export.PdfExport;
 import org.eclipse.osbp.xtext.table.generator.TableGridSourceGenerator;
 import org.eclipse.xtext.generator.IFileSystemAccess;
 import org.eclipse.xtext.xbase.compiler.GeneratorConfig;
@@ -199,7 +204,7 @@
         IDto.class, 
         Task.class, 
         BlipItem.class, 
-        IDTOServiceWithMutablePersistence.class, 
+        IDTOService.class, 
         DtoServiceAccess.class, 
         DatamartFilterGenerator.class, 
         ViewLayoutManager.class, 
@@ -227,7 +232,12 @@
         MPerspective.class, 
         MPart.class, 
         IPerspectiveProvider.class, 
-        SelectionStore.class);
+        SelectionStore.class, 
+        BPMStatus.class, 
+        ExcelExport.class, 
+        CsvExport.class, 
+        PdfExport.class, 
+        TableActionEnum.class);
       _xblockexpression = super.createAppendable(context, importManager, config);
     }
     return _xblockexpression;