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;
