catch up with development

Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a013ef6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,37 @@
+**._trace
+**/target/
+**.log.properties
+**git.properties
+**/target/
+**/.metadata/
+
+**/emf-gen/**/.gitignore
+**/src-gen/**/.gitignore
+**/git.properties
+**/*.java._trace
+**/*.log
+**/*.log.properties
+
+**/bin/
+**/build/
+*.class
+*.ctrl
+**/Debug/
+.DS_Store
+*.ear
+*.war
+
+**/*.actionbin
+**/*.blipbin
+**/*.chartbin
+**/*.cubebin
+**/*.datatypebin
+**/*.dtobin
+**/*.entitybin
+**/*.servicebin
+**/*.tablebin
+**/*.uibin
+**/*.uisemanticbin
+**/*.xtendbin
+**/*.xtextbin
+
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/jenkins.build.config.xml b/jenkins.build.config.xml
index b0e8a32..5792be1 100644
--- a/jenkins.build.config.xml
+++ b/jenkins.build.config.xml
@@ -22,7 +22,7 @@
                 <jenkins.build.dependency>org.eclipse.osbp.runtime.web</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.ui.api</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.utils</jenkins.build.dependency>
-                <jenkins.build.dependency>org.eclipse.osbp.utils.ui</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.xtext.entitymock.common</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.i18n</jenkins.build.dependency>
         </jenkins.build.dependencies>
 </jenkins>
diff --git a/org.eclipse.osbp.xtext.datamart.common.feature/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.xtext.datamart.common.feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datamart.common.feature/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.xtext.datamart.common.feature/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.xtext.datamart.common.feature/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datamart.common.feature/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.xtext.datamart.common.feature/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.xtext.datamart.common.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datamart.common.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.xtext.datamart.common.feature/feature.xml b/org.eclipse.osbp.xtext.datamart.common.feature/feature.xml
index 83b6ee9..deb3e9c 100644
--- a/org.eclipse.osbp.xtext.datamart.common.feature/feature.xml
+++ b/org.eclipse.osbp.xtext.datamart.common.feature/feature.xml
@@ -14,7 +14,8 @@
         id="org.eclipse.osbp.xtext.datamart.common.feature"
         label="%featureName"
         version="0.9.0.qualifier"
-        provider-name="%providerName">
+        provider-name="%providerName"
+		plugin="org.eclipse.osbp.xtext.datamart.common">
         
     <description>
         %description
diff --git a/org.eclipse.osbp.xtext.datamart.common/.classpath b/org.eclipse.osbp.xtext.datamart.common/.classpath
new file mode 100644
index 0000000..cf36b56
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datamart.common/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.osbp.xtext.datamart.common/.gitignore b/org.eclipse.osbp.xtext.datamart.common/.gitignore
new file mode 100644
index 0000000..ae3c172
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datamart.common/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/org.eclipse.osbp.xtext.datamart.common/.settings/com.vaadin.integration.eclipse.prefs b/org.eclipse.osbp.xtext.datamart.common/.settings/com.vaadin.integration.eclipse.prefs
new file mode 100644
index 0000000..0904e44
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datamart.common/.settings/com.vaadin.integration.eclipse.prefs
@@ -0,0 +1,2 @@
+com.vaadin.integration.eclipse.mavenLatestVersionsUpgrade=["7.7.7"]
+eclipse.preferences.version=1
diff --git a/org.eclipse.osbp.xtext.datamart.common/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.xtext.datamart.common/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datamart.common/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.xtext.datamart.common/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osbp.xtext.datamart.common/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datamart.common/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.osbp.xtext.datamart.common/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.xtext.datamart.common/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datamart.common/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.xtext.datamart.common/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.xtext.datamart.common/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..0b6859d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datamart.common/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,10 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.xtext.datamart.common/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.datamart.common/META-INF/MANIFEST.MF
index 225587d..510228b 100644
--- a/org.eclipse.osbp.xtext.datamart.common/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.xtext.datamart.common/META-INF/MANIFEST.MF
@@ -6,21 +6,22 @@
 Bundle-Version: 0.9.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Require-Bundle: mondrian.osgi;bundle-version="[3.5.0,3.5.1)",
- javax.annotation;bundle-version="[1.1.0,1.2.0)",
  olap4j.osgi;bundle-version="[1.1.0,1.3.0)",
  org.jsoup;bundle-version="1.8.1",
  org.eclipse.core.runtime,
- org.eclipse.core.databinding;bundle-version="1.4.2",
- org.eclipse.core.databinding.beans;bundle-version="1.2.200",
+ org.eclipse.core.databinding;bundle-version="[1.6.0,1.7.0)",
+ org.eclipse.core.databinding.beans;bundle-version="[1.3.100,1.4.0)",
  org.eclipse.osbp.runtime.web.vaadin.databinding;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.dsl.entity.xtext;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.dsl.common.xtext;bundle-version="[0.9.0,0.10.0)",
- com.vaadin.client;bundle-version="7.5.7",
- com.vaadin.server;bundle-version="7.5.7",
- com.vaadin.shared;bundle-version="7.5.7",
- org.eclipse.xtext.common.types;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.osbp.dsl.datatype.lib
-Import-Package: javax.validation,
+ com.vaadin.client;bundle-version="[7.7.6,7.8.0)",
+ com.vaadin.server;bundle-version="[7.7.6,7.8.0)",
+ com.vaadin.shared;bundle-version="[7.7.6,7.8.0)",
+ org.eclipse.xtext.common.types;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.osbp.dsl.datatype.lib;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.runtime.common
+Import-Package: javax.annotation,
+ javax.validation,
  javax.validation.constraints,
  org.apache.commons.lang3,
  org.apache.log4j,
@@ -33,16 +34,11 @@
  org.eclipse.osbp.ui.api.datamart;version="0.9.0",
  org.eclipse.osbp.ui.api.layout;version="0.9.0",
  org.eclipse.osbp.ui.api.metadata;version="0.9.0",
+ org.eclipse.osbp.ui.api.themes;version="0.9.0",
  org.eclipse.osbp.ui.api.user;version="0.9.0",
- org.eclipse.osbp.utils.common;version="0.9.0",
- org.eclipse.osbp.utils.constants;version="0.9.0",
  org.eclipse.osbp.utils.entityhelper;version="0.9.0",
- org.eclipse.osbp.utils.fillertext;version="0.9.0",
- org.eclipse.osbp.utils.theme;version="0.9.0",
- org.eclipse.osbp.utils.vaadin;version="0.9.0",
+ org.eclipse.osbp.xtext.entitymock.common.filler;version="0.9.0",
  org.eclipse.osbp.xtext.i18n;version="0.9.0",
- org.jbpm.task,
- org.jbpm.task.query,
  org.slf4j;resolution:=optional
 Export-Package: org.eclipse.osbp.xtext.datamart.common;version="0.9.0",
  org.eclipse.osbp.xtext.datamart.common.olap;version="0.9.0",
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ACubeDatamart.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ACubeDatamart.java
index 57a0863..291805f 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ACubeDatamart.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ACubeDatamart.java
@@ -20,13 +20,14 @@
 import mondrian.rolap.RolapConnection;
 
 import org.eclipse.osbp.dsl.common.datatypes.IDto;
+import org.eclipse.osbp.ui.api.datamart.DatamartFilter;
 import org.eclipse.osbp.ui.api.user.IUser;
 import org.eclipse.osbp.xtext.datamart.common.olap.DerivedCellSet;
 
 @SuppressWarnings("all")
 public abstract class ACubeDatamart extends ADatamart<RolapConnection> {
 
-	public abstract DerivedCellSet getResults(final IUser user, final Map<String,String> filteredItems, final Class operativeDtoClass, final List<IDto> operativeDtos);
+	public abstract DerivedCellSet getResults(final Class operativeDtoClass, final List<IDto> operativeDtos);
 	@Override
 	public final HashMap<Integer, ArrayList<String>> getAxisMap() {
 		return null;
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ADatamart.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ADatamart.java
index e6b2e77..f90d8ac 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ADatamart.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ADatamart.java
@@ -14,80 +14,249 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
+import java.util.Iterator;
+import java.util.List;
 
 import org.eclipse.osbp.preferences.EnumDatabaseVendor;
 import org.eclipse.osbp.preferences.ProductConfiguration;
+import org.eclipse.osbp.runtime.common.event.IDualData;
+import org.eclipse.osbp.ui.api.datamart.DatamartFilter;
 import org.eclipse.osbp.ui.api.datamart.IDataMart;
-import org.eclipse.osbp.ui.api.user.IUser;
-import org.eclipse.osbp.ui.api.datamart.IDataMart.EType;
 
+/**
+ * The Class ADatamart.
+ *
+ * @param <C> the generic type
+ */
 @SuppressWarnings("all")
 public abstract class ADatamart<C> implements IDataMart {
-	public abstract C connect();
-	public abstract HashMap<Integer,ArrayList<String>> getAxisMap();
-	public abstract int getNumberOfAxes();
-	public abstract HashMap<String, EType> getIdMap();
-	public abstract HashMap<String, EType> getTypesMap(IUser user);
-	public String setFilters(final Map<String,String> filteredItems) {
-		return null;
-	}
+	
 	/**
-	 * @see {@link #enableFillerText(boolean)}
-	 * @param filteredItems
+	 * Connect.
+	 *
+	 * @return the c
+	 */
+	public abstract C connect();
+	
+	/**
+	 * Gets the axis map.
+	 *
+	 * @return the axis map
+	 */
+	public abstract HashMap<Integer,ArrayList<String>> getAxisMap();
+	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.ui.api.datamart.IDataMart#getIdMap()
+	 */
+	public abstract HashMap<String, EType> getIdMap();
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.ui.api.datamart.IDataMart#getTypesMap()
+	 */
+	public abstract HashMap<String, EType> getTypesMap();
+	
+	/**
+	 * Disconnect.
+	 *
 	 * @return returns results from datamart. If filler text is enabled, the result will be generated via filler text.
+	 * @see {@link #enableFillerText(boolean)}
 	 */
 	public abstract void disconnect();
 	
+	/** The db vendor. */
 	protected EnumDatabaseVendor dbVendor = null;
-    private HashMap<String, String> filterMap = null;
+    
+    /** The filter map. */
+    private ArrayList<DatamartFilter> filterMap = null;
     
     /** 
      * @return the map with all filters, which has to be initialized once
      */
-    private HashMap<String, String> getFilterMap() {
+    @Override
+    public ArrayList<DatamartFilter> getFilters() {
     	if	(filterMap == null) {
-    		String jndiName = ProductConfiguration.getPersistenceUnitJndiName(getPersistenceUnit());
-    		dbVendor = ProductConfiguration.getDataSource(jndiName).getDatabaseVendor();
+    		if(getPersistenceUnit() != null) {
+	    		String jndiName = ProductConfiguration.getPersistenceUnitJndiName(getPersistenceUnit());
+	    		dbVendor = ProductConfiguration.getDataSource(jndiName).getDatabaseVendor();
+    		}
     		filterMap = initializeFilterMap();
     	}
     	return filterMap;
     }
 
     /**
-     * @return all filter ids
+     * Gets the vendor specific sql.
+     *
+     * @param filter the filter
+     * @return the vendor sql
      */
-    protected Set<String> getFilterIds() {
-    	return getFilterMap().keySet();    	
-    }
-
-    /**
-     * @param filterID
-     * @return the filter for the given filter id
-     */
-    protected String getFilter(String filterID) {
-    	String filter = getFilterMap().get(filterID);
-    	if	(filter != null) {
-    		filter = dbVendor.applySqlSpecifications(filter);
+    protected String getVendorSql(DatamartFilter filter) {
+    	if(dbVendor != null) {
+    		return dbVendor.applySqlSpecifications(filter.getSql());
     	}
-    	return filter;
+    	return filter.getSql();
     }
-
+    
     /**
+     * Gets the vendor specific 'to date' sql method prefix.
+     *
+     * @return the vendor 'to date' sql method prefix
+     */
+    protected String getVendorToDateSQLMethod() {
+    	if(dbVendor != null) {
+    		return dbVendor.getToDateSQLMethod();
+    	}
+    	return "to_date";
+    }
+    
+    /**
+     * Gets the vendor specific 'to timestamp' sql method prefix.
+     *
+     * @return the vendor 'to timestamp' sql method prefix
+     */
+    protected String getVendorToTimestampSQLMethod() {
+    	if(dbVendor != null) {
+    		return dbVendor.getToTimestampSQLMethod();
+    	}
+    	return "to_timestamp";
+    }
+    
+    /**
+     * Gets the filters count.
+     *
      * @return count of filters
      */
     protected int getFiltersCount() {
-    	return getFilterMap().size();
+    	return getFilters().size();
     }
 
     /**
+     * Gets the persistence unit.
+     *
      * @return the persistence unit used
      */
     abstract protected String getPersistenceUnit();
     
     /**
+     * Initialize filter map.
+     *
      * @return the initialized filter map
      */
-    abstract protected HashMap<String, String> initializeFilterMap();
+    abstract protected ArrayList<DatamartFilter> initializeFilterMap();
+
+	/**
+	 * Compute conditions from selected data according to the filter type.
+	 */
+    @Override
+	public void computeConditions() {
+		ArrayList<DatamartFilter> filters = getFilters();
+		if (filters != null) {
+			DatamartFilter firstFilter = null;
+			List<List<String>> filterGroup = new ArrayList<List<String>>();
+			for (DatamartFilter filter : filters) {
+				filter.setCondition(null);
+				switch (filter.getType()) {
+				case BY_ID:
+					if(!filter.getSql().isEmpty()) {
+						filter.setCondition(filter.getName()+"="+filter.getSql());
+					}
+					break;
+				case SINGLE:
+				case SINGLEHIERARCHY:
+				case EXCEPT:
+				case SINGLESLICER:
+					if(!filter.getSelectedData().isEmpty()) {
+						filter.setCondition(filter.getSelectedData().get(0).getDatabaseSelectionValue());
+					} else {	// failsafe - but only if filter is optional
+						filter.setCondition("'*'");
+					}
+					break;
+				case BETWEEN:
+				case BETWEEN_DATE:
+					if(filter.getBetweenInputComponent() != null) {
+						if ((!filter.getBetweenInputComponent().getFrom().isEmpty()) && (!filter.getBetweenInputComponent().getUntil().isEmpty())){
+							filter.setCondition(filter.getName() + " BETWEEN '" + filter.getBetweenInputComponent().getFrom() + "' AND '" + filter.getBetweenInputComponent().getUntil() + "'");
+						} else {
+							filter.setCondition("1=1");
+						}
+					} else {	// failsafe - but only if filter is optional
+						filter.setCondition("'*'");
+					}
+					break;
+				case MULTIPLE:
+				case MULTIPLEHIERARCHY:
+					String selection = "";
+					for(IDualData item : filter.getSelectedData()) {
+						if (item != null) {
+							if (!selection.isEmpty()) {
+								selection += ",";
+							}
+							selection += item.getDatabaseSelectionValue();
+						}
+					}
+					filter.setCondition(selection);
+					break;
+				case MULTIPLESLICER:
+					// all multiple slicer filters are accumulated to the first filter multiple slicer filter
+					List<String> myList = new ArrayList<String>();
+					for (IDualData item : filter.getSelectedData()) {
+						if (item != null) {
+							myList.add(item.getDatabaseSelectionValue());
+						}
+					}
+					filterGroup.add(myList);
+					if (firstFilter == null) {
+						firstFilter = filter;
+					} else {
+						filter.setCondition("<empty>");
+					}
+					break;
+				}
+			}
+			if(firstFilter != null) {
+				// calculate every permutation of selection as slices must be created
+				List<List<String>> permutations = new ArrayList<List<String>>();
+				int numEntries = 1;
+				for (List<String> list : filterGroup) {
+					numEntries *= list.size();
+				}
+				for (int i = 0; i < numEntries; i++) {
+					permutations.add(new ArrayList<String>());
+				}
+				for (List<String> itemList : filterGroup) {
+					Iterator<String> iterator = itemList.iterator();
+					if (iterator.hasNext()) {
+						for (List<String> entry : permutations) {
+							entry.add(iterator.next());
+							if (!iterator.hasNext()) {
+								iterator = itemList.iterator();
+							}
+						}
+					}
+				}
+				String set = "";
+				boolean firstSet = true;
+				for (List<String> permutation : permutations) {
+					boolean firstTuple = true;
+					String tuple = "";
+					for (String item : permutation) {
+						if (firstTuple) {
+							firstTuple = false;
+						} else {
+							tuple += ",";
+						}
+						tuple += item;
+					}
+					if (firstSet) {
+						firstSet = false;
+					} else {
+						set += ",";
+					}
+					set += "(" + tuple + ")";
+				}
+				firstFilter.setCondition("{" + set + "}");
+			}
+		}
+	}
 }
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/AEntityDatamart.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/AEntityDatamart.java
index 02931ee..cb18666 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/AEntityDatamart.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/AEntityDatamart.java
@@ -14,24 +14,16 @@
 
 import java.sql.Connection;
 import java.sql.ResultSet;
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import org.eclipse.osbp.dsl.common.datatypes.IDto;
-import org.eclipse.osbp.ui.api.datamart.DerivedOlapException;
-import org.eclipse.osbp.ui.api.user.IUser;
-import org.eclipse.osbp.utils.common.IEntityIdModificationListenerView;
-import org.eclipse.osbp.utils.fillertext.FillerTextProvider;
-import org.eclipse.osbp.xtext.datamart.common.olap.DerivedAxis;
-import org.eclipse.osbp.xtext.datamart.common.olap.DerivedCell;
 import org.eclipse.osbp.xtext.datamart.common.olap.DerivedCellSet;
-import org.eclipse.osbp.xtext.datamart.common.olap.DerivedPosition;
+import org.eclipse.osbp.xtext.entitymock.common.filler.FillerTextProvider;
 
 @SuppressWarnings("all")
 public abstract class AEntityDatamart extends ADatamart<Connection> {
-	public abstract DerivedCellSet getResults(final IUser user, final Map<String,String> filteredItems, Class operativeDtoClass, List<IDto> operativeDtos);
+	public abstract DerivedCellSet getResults(Class operativeDtoClass, List<IDto> operativeDtos);
 	protected boolean fFillerTextEnabled = false;
 
 	/**
@@ -53,66 +45,4 @@
 	public Map<String, Object> generateFillerTextRow(FillerTextProvider provider) {
 		return null;
 	}
-	
-	/**
-	 * @see {@link IEntityIdModificationListenerView}
-	 * The view has to subscribe/unsubsribe to REFRESH_VIEW!
-	 * <br>
-	 * <b>The IDs/UUIDs for entities have to be on the AXIS_COLUMN only!</b>
-	 * @param listeningView the view, that should listen to modifications on modified entity ids
-	 * @param cellSet the result set, from which the entity ids, that should be listened to, are extracted 
-	 */
-	public void addEntityIdsToModifyListener(IEntityIdModificationListenerView listeningView, DerivedCellSet cellSet) {
-		// --- find all columns containing entity ids/uuids
-		Map<String,Integer> entityIdColumns = new HashMap<String, Integer>();
-		try {
-			// --- next get the header for all "columns" ---
-			// Column header
-			// See
-			// http://www.olap4j.org/api/index.html?org/olap4j/Position.html
-			// on how Position works, it helps a lot
-			// Every position will be a column in the header
-			int count = 0;
-			for (DerivedPosition pos : cellSet.getAxes().get(DerivedAxis.AXIS_COLUMNS).getPositions()) {
-				String columnName = pos.getMembers().get(0).getCaption();
-				if	(DatamartDefinitionUtil.isEntityIdColumnName(columnName)) {
-					entityIdColumns.put(DatamartDefinitionUtil.getEntityNameForIdColumnName(columnName), count);
-				}
-				count++;
-			}
-		}
-		catch (Exception e) {
-		}
-		if	(!entityIdColumns.isEmpty()) {
-			addEntityIdsToModifyListener(listeningView, cellSet, entityIdColumns, cellSet.getAxes().size(), new ArrayList<Integer>());
-		}
-	}
-	
-	private void addEntityIdsToModifyListener(IEntityIdModificationListenerView listeningView, DerivedCellSet cellSet, Map<String,Integer> entityIdColumns, int axisDepth, ArrayList<Integer> coordinate) {
-		int itemCount = cellSet.getAxes().get(axisDepth-1).getPositions().size();
-		if	(axisDepth > 1) {
-			for	(int item = 0; item < itemCount; item++) {
-				ArrayList<Integer> newCoordinate = new ArrayList<Integer>();
-				newCoordinate.add(item);
-				newCoordinate.addAll(coordinate);
-				addEntityIdsToModifyListener(listeningView, cellSet, entityIdColumns, axisDepth-1, newCoordinate);
-			}
-		}
-		else {
-			for	(String entityName : entityIdColumns.keySet()) {
-				ArrayList<Integer> newCoordinate = new ArrayList<Integer>();
-				newCoordinate.add(entityIdColumns.get(entityName));
-				newCoordinate.addAll(coordinate);
-				DerivedCell result;
-				try {
-					result = cellSet.getCell(newCoordinate);
-					if	(result != null) {
-						listeningView.addEntityIdToModifyListener(entityName, result.getFormattedValue().trim());
-					}
-				} catch (DerivedOlapException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-	}
 }
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ATaskDatamart.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ATaskDatamart.java
index f649509..6a9dd2f 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ATaskDatamart.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/ATaskDatamart.java
@@ -14,12 +14,14 @@
  package org.eclipse.osbp.xtext.datamart.common;
 
 import java.sql.Connection;
+import java.util.ArrayList;
 import java.util.Map;
 
 import org.eclipse.osbp.bpm.api.IBPMTaskClient;
+import org.eclipse.osbp.ui.api.datamart.DatamartFilter;
 import org.eclipse.osbp.ui.api.user.IUser;
 import org.eclipse.osbp.xtext.datamart.common.olap.DerivedCellSet;
 
 public abstract class ATaskDatamart extends ADatamart<Connection> {
-	public abstract DerivedCellSet getResults(final IBPMTaskClient client, final IUser user, final Map<String,String> filteredItems);
+	public abstract DerivedCellSet getResults();
 }
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartBetweenDate.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartBetweenDate.java
new file mode 100644
index 0000000..4a05360
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartBetweenDate.java
@@ -0,0 +1,280 @@
+/**
+ *                                                                            
+ * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *                                                                            
+ * All rights reserved. This program and the accompanying materials           
+ * are made available under the terms of the Eclipse Public License v1.0       
+ * which accompanies this distribution, and is available at                  
+ * http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ * Contributors:   
+ * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
+ */
+package org.eclipse.osbp.xtext.datamart.common;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+
+import org.eclipse.osbp.ui.api.datamart.DatamartFilter;
+import org.eclipse.osbp.ui.api.datamart.IDatamartBetweenInput;
+import org.eclipse.osbp.ui.api.themes.EnumCssClass;
+import org.slf4j.Logger;
+
+import com.vaadin.data.Property.ReadOnlyException;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.data.util.converter.Converter.ConversionException;
+import com.vaadin.shared.ui.datefield.Resolution;
+import com.vaadin.ui.DateField;
+import com.vaadin.ui.HorizontalLayout;
+
+public class DatamartBetweenDate extends HorizontalLayout implements IDatamartBetweenInput {
+
+	private static Logger LOGGER = org.slf4j.LoggerFactory.getLogger(DatamartBetweenDate.class.getName());
+
+	private DateField fromInput;
+
+	private DateField untilInput;
+
+	private static final long serialVersionUID = -5673052113801450589L;
+
+	// private DateFormat formatter = DateFormat.getDateTimeInstance();
+	private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+	public static long getSerialversionuid() {
+		return serialVersionUID;
+	}
+
+	public DatamartBetweenDate() {
+		fromInput = new DateField();
+		untilInput = new DateField();
+		fromInput.setDateFormat("yyyy-MM-dd HH:mm:ss");
+		untilInput.setDateFormat("yyyy-MM-dd HH:mm:ss");
+		fromInput.setResolution(Resolution.SECOND);
+		untilInput.setResolution(Resolution.SECOND);
+		addComponent(fromInput);
+		addComponent(untilInput);
+		addStyleName(EnumCssClass.SINGLE_SELECTION.styleName());
+	}
+
+	public DatamartBetweenDate(DatamartFilter.DateTimeFormat filterFormat, DatamartFilter.DateResolution filterResolution) {
+		fromInput = new DateField();
+		untilInput = new DateField();
+		String dateFormat = "yyyy-MM-dd HH:mm:ss";
+		Resolution resolution = Resolution.MINUTE;
+		if (filterFormat != null && filterResolution != null) {
+			dateFormat = getFormat(filterFormat, filterResolution);
+			resolution = mapToVaadin(filterResolution);
+		}
+		fromInput.setDateFormat(dateFormat);
+		untilInput.setDateFormat(dateFormat);
+		fromInput.setResolution(resolution);
+		untilInput.setResolution(resolution);
+		addComponent(fromInput);
+		addComponent(untilInput);
+		addStyleName(EnumCssClass.SINGLE_SELECTION.styleName());
+	}
+
+	private String getFormat(DatamartFilter.DateTimeFormat format, DatamartFilter.DateResolution resolution) {
+		DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT);
+		String pattern  = ((SimpleDateFormat)formatter).toPattern();
+		String dateFormat = null;
+		if (format != null) {
+			switch (format) {
+			case DATE:
+				switch (resolution) {
+				case YEAR:
+					dateFormat = filterFormat(pattern, "yyyy");
+					break;
+				case MONTH:
+					dateFormat = filterFormat(pattern, "yyyy.MM");
+					break;
+				case DAY:
+					dateFormat = filterFormat(pattern, "yyyy.MM.dd");
+					break;
+				default:
+					throw new IllegalArgumentException(resolution
+							+ " is not a valid resolution for " + format);
+				}
+				break;
+			case DATE_TIME:
+				switch (resolution) {
+				case YEAR:
+					dateFormat = filterFormat(pattern, "yyyy");
+					break;
+				case MONTH:
+					dateFormat = filterFormat(pattern, "yyyy.MM");
+					break;
+				case DAY:
+					dateFormat = filterFormat(pattern, "yyyy.MM.dd");
+					break;
+				case HOUR:
+					dateFormat = filterFormat(pattern, "yyyy.MM.dd hhHH");
+					break;
+				case MINUTE:
+					dateFormat = filterFormat(pattern, "yyyy.MM.dd hhHH:mm");
+					break;
+				case SECOND:
+					dateFormat = filterFormat(pattern, "yyyy.MM.dd hhHH:mm:ss");
+					break;
+				default:
+					throw new IllegalArgumentException(resolution
+							+ " is not a valid resolution for " + format);
+				}
+				break;
+			case TIME:
+				switch (resolution) {
+				case HOUR:
+					dateFormat = filterFormat(pattern, "HH");
+					break;
+				case MINUTE:
+					dateFormat = filterFormat(pattern, "HH:mm");
+					break;
+				case SECOND:
+					dateFormat = filterFormat(pattern, "HH:mm:ss");
+					break;
+				default:
+					throw new IllegalArgumentException(resolution
+							+ " is not a valid resolution for " + format);
+				}
+				break;
+			}
+		}
+		return dateFormat;
+	}
+	
+	/**
+	 * filters from any localized date-time pattern the desired subset
+	 * defined by filterPattern without destroying the original localized
+	 * pattern .
+	 *
+	 * @param localizedPattern
+	 *            the localized full date-time pattern
+	 * @param filterPattern
+	 *            the subset of desired date-time formatter patterns
+	 * @return the string
+	 */
+	private String filterFormat(String localizedPattern, String filterPattern) {
+		// remove any multiple characters sequences and remove all separator signs from filterPattern 
+		String filter = filterPattern.replaceAll("(.)\\1+", "$1").replaceAll("[^\\w\\s]", "")+",";
+		// create a replacement pattern to remove unnecessary blanks disturbing the recognition of orphaned separators
+		// rule: each blank must be surrounded by any filter-letter to be valid
+		String invalidBlanks = "(?!["+filter+"])( )(?!["+filter+"])";
+		// create a replacement pattern to remove remaining separators without formatting function
+		// rule: each separator must be surrounded by any filter-letter or blank to be valid
+		String invalidSeparators = "(?!["+filter+" ])([.:])(?!["+filter+" ])";
+		return localizedPattern.replaceAll("[^"+filter+",.: ]", "").replaceAll(invalidBlanks, "").trim().replaceAll(invalidSeparators, "");
+	}
+
+	/**
+	 * Map to vaadin.
+	 *
+	 * @param resolution
+	 *            the resolution
+	 * @return the resolution
+	 */
+	private Resolution mapToVaadin(DatamartFilter.DateResolution resolution) {
+		switch (resolution) {
+		case YEAR:
+			return Resolution.YEAR;
+		case MONTH:
+			return Resolution.MONTH;
+		case DAY:
+			return Resolution.DAY;
+		case HOUR:
+			return Resolution.HOUR;
+		case MINUTE:
+			return Resolution.MINUTE;
+		case SECOND:
+			return Resolution.SECOND;
+		case UNDEFINED:
+			return Resolution.DAY;
+		}
+
+		return Resolution.DAY;
+	}
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.osbp.xtext.datamart.common.IDatamartBetweenInput#getFrom()
+	 */
+	@Override
+	public String getFrom() {
+		return fromInput.getValue() != null ? formatter.format(fromInput.getValue()) : "";
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.osbp.xtext.datamart.common.IDatamartBetweenInput#setFrom(java
+	 * .lang.String)
+	 */
+	@Override
+	public void setFrom(String from) {
+		try {
+			fromInput.setValue(formatter.parse(from));
+		} catch (ReadOnlyException | ConversionException | ParseException e) {
+			LOGGER.error("DateParseError on setFrom method!", e);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.osbp.xtext.datamart.common.IDatamartBetweenInput#getUntil()
+	 */
+	@Override
+	public String getUntil() {
+		return untilInput.getValue() != null ? formatter.format(untilInput.getValue()) : "";
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.osbp.xtext.datamart.common.IDatamartBetweenInput#setUntil(
+	 * java.lang.String)
+	 */
+	@Override
+	public void setUntil(String until) {
+		try {
+			untilInput.setValue(formatter.parse(until));
+		} catch (ReadOnlyException | ConversionException | ParseException e) {
+			LOGGER.error("DateParseError on setUntil method!", e);
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	public DateField getFromInput() {
+		return fromInput;
+	}
+
+	@SuppressWarnings("unchecked")
+	public DateField getUntilInput() {
+		return untilInput;
+	}
+
+	@Override
+	public void addValueChangeListener(ValueChangeListener listener) {
+		fromInput.addValueChangeListener(listener);
+		untilInput.addValueChangeListener(listener);
+	}
+
+	@Override
+	public void removeValueChangeListener(ValueChangeListener listener) {
+		fromInput.removeValueChangeListener(listener);
+		untilInput.removeValueChangeListener(listener);
+	}
+
+	@Override
+	public void setDescription(String description) {
+		fromInput.setDescription("[" + description);
+		untilInput.setDescription(description + "]");
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartBetweenText.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartBetweenText.java
new file mode 100644
index 0000000..11a45c8
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartBetweenText.java
@@ -0,0 +1,105 @@
+/**
+ *                                                                            
+ * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *                                                                            
+ * All rights reserved. This program and the accompanying materials           
+ * are made available under the terms of the Eclipse Public License v1.0       
+ * which accompanies this distribution, and is available at                  
+ * http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ * Contributors:   
+ * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
+ */
+package org.eclipse.osbp.xtext.datamart.common;
+
+import org.eclipse.osbp.ui.api.datamart.IDatamartBetweenInput;
+import org.eclipse.osbp.ui.api.themes.EnumCssClass;
+
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.TextField;
+
+public class DatamartBetweenText extends HorizontalLayout implements IDatamartBetweenInput {
+	
+	private TextField fromInput;
+	
+	private TextField untilInput; 
+	
+	private static final long serialVersionUID = -5673052113801450589L;
+
+	public static long getSerialversionuid() {
+		return serialVersionUID;
+	}
+
+	public DatamartBetweenText() {
+		fromInput = new TextField();
+		untilInput = new TextField();
+		addComponent(fromInput);
+		addComponent(untilInput);
+		addStyleName(EnumCssClass.SINGLE_SELECTION.styleName());
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.xtext.datamart.common.IDatamartBetweenInput#getFrom()
+	 */
+	@Override
+	public String getFrom() {
+		return fromInput.getValue();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.xtext.datamart.common.IDatamartBetweenInput#setFrom(java.lang.String)
+	 */
+	@Override
+	public void setFrom(String from) {
+		fromInput.setValue((String) from);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.xtext.datamart.common.IDatamartBetweenInput#getUntil()
+	 */
+	@Override
+	public String getUntil() {
+		return untilInput.getValue();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.xtext.datamart.common.IDatamartBetweenInput#setUntil(java.lang.String)
+	 */
+	@Override
+	public void setUntil(String until) {
+		untilInput.setValue((String) until);
+	}
+	
+	@SuppressWarnings("unchecked")
+	public TextField getFromInput() {
+		return fromInput;
+	}
+
+	@SuppressWarnings("unchecked")
+	public TextField getUntilInput() {
+		return untilInput;
+	}
+
+	@Override
+	public void addValueChangeListener(ValueChangeListener listener) {
+		fromInput.addValueChangeListener(listener);
+		untilInput.addValueChangeListener(listener);
+	}
+
+	@Override
+	public void removeValueChangeListener(ValueChangeListener listener) {
+		fromInput.removeValueChangeListener(listener);
+		untilInput.removeValueChangeListener(listener);
+	}
+
+	
+	@Override
+	public void setDescription(String description) {
+		fromInput.setDescription("[" + description);
+		untilInput.setDescription(description + "]");
+	}
+	
+
+	
+}
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartDefinitionUtil.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartDefinitionUtil.java
index 331b726..e35c9c0 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartDefinitionUtil.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartDefinitionUtil.java
@@ -43,13 +43,23 @@
 		}
 	}
 	
+	private static boolean hasSuperType(LEntity entityRef) {
+		return entityRef.getSuperType() != null &&
+			!entityRef.getSuperType().isMappedSuperclass() &&  
+			!entityRef.getSuperType().equals(entityRef);
+	}
+
 	public static String getEntityIdAliasName(LEntity entityRef) {
 		LEntityAttribute idAttribute = getEntityIdAttribute(entityRef);
 		if	(idAttribute == null) {
 			return null;
 		}
 		else {
-			return IDataMart.DATAMART_ID_COLUMN_PREFIX+entityRef.getName()+IDataMart.DATAMART_ID_COLUMN_POSTFIX;
+			if(hasSuperType(entityRef)) {
+				return IDataMart.DATAMART_ID_COLUMN_PREFIX+entityRef.getSuperType().getName()+IDataMart.DATAMART_ID_COLUMN_POSTFIX;
+			} else {
+				return IDataMart.DATAMART_ID_COLUMN_PREFIX+entityRef.getName()+IDataMart.DATAMART_ID_COLUMN_POSTFIX;
+			}
 		}
 	}
 	
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartFilterGenerator.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartFilterGenerator.java
index a951fd5..ca29d18 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartFilterGenerator.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartFilterGenerator.java
@@ -1,6 +1,6 @@
 /**
  *                                                                            
- * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ * Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
  *                                                                            
  * All rights reserved. This program and the accompanying materials           
  * are made available under the terms of the Eclipse Public License v1.0       
@@ -13,116 +13,332 @@
 package org.eclipse.osbp.xtext.datamart.common;
 
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
-import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
 
+import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent;
+import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherDataTag;
+import org.eclipse.osbp.runtime.common.event.IDualData;
+import org.eclipse.osbp.ui.api.datamart.DatamartFilter;
 import org.eclipse.osbp.ui.api.datamart.IDataMart;
 import org.eclipse.osbp.ui.api.datamart.IDatamartFilterGenerator;
-import org.eclipse.osbp.ui.api.datamart.IDatamartSelectable;
-import org.eclipse.osbp.ui.api.datamart.IDualData;
 import org.eclipse.osbp.ui.api.layout.IViewLayoutManager;
 import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
 import org.eclipse.osbp.ui.api.user.IUser;
-import org.eclipse.osbp.utils.theme.EnumCssClass;
-import org.eclipse.osbp.utils.vaadin.ViewLayoutManager;
 import org.eclipse.osbp.xtext.i18n.I18NKeyGenerator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import com.vaadin.data.Property.ValueChangeEvent;
 import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.ui.AbstractOrderedLayout;
-import com.vaadin.ui.Alignment;
 import com.vaadin.ui.Component;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.TextField;
 
 // creates a filtermap from selected and multiselected components. 
+/**
+ * The Class DatamartFilterGenerator.
+ */
 // For cubes the class creates permutated slices over all filter aspects
-public class DatamartFilterGenerator implements IDatamartFilterGenerator {
+@SuppressWarnings("serial")
+public class DatamartFilterGenerator implements IDatamartFilterGenerator, ValueChangeListener, IUser.UserLocaleListener {
 
-	private static Logger log = LoggerFactory
-			.getLogger(DatamartFilterGenerator.class);
+	/** The dsl metadata service. */
+	private transient IDSLMetadataService dslMetadataService;
+	
+	/** The datamart. */
+	private transient IDataMart datamart;
+	
+	/** The listeners. */
+	private transient List<FilterChangeListener> listeners = new CopyOnWriteArrayList<>();
+	
+	/** avoid concurrent modification of vadin multiselect list **/
+	private boolean concurrentModificationLock = false;
+	private ValueChangeEvent concurrentEvent;
+	private boolean concurrentEventOccured = false;
 
-	// the key is the same as the filterMap key
-	// the selection component is therefore associated with the filterMap id and
-	// so with the event id
-	private Map<String, IDatamartSelectable> selectors = new HashMap<String, IDatamartSelectable>();
-	private boolean idMode = false;
-	private String id = null;
-	private String idProperty;
-	private boolean cube = false;
-	private HorizontalLayout selectionArea = null;
-	private IDSLMetadataService dslMetadataService;
-	private boolean showCaption;
-
-	@Override
-	public void setDslMetadataService(IDSLMetadataService dslMetadataService) {
+	/**
+	 * Instantiates a new datamart filter generator.
+	 *
+	 * @param datamart the datamart
+	 * @param dslMetadataService the dsl metadata service
+	 */
+	public DatamartFilterGenerator(IDataMart datamart, IDSLMetadataService dslMetadataService) {
+		this.datamart = datamart;
 		this.dslMetadataService = dslMetadataService;
+		if(this.datamart != null && datamart.getUser() != null) {
+			this.datamart.getUser().addUserLocaleListener(this);
+		}
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.ui.api.datamart.IDatamartFilterGenerator#addFilterChangeListener(org.eclipse.osbp.ui.api.datamart.IDatamartFilterGenerator.FilterChangeListener)
+	 */
 	@Override
-	public void setId(String idProperty, String id) {
-		idMode = true;
-		this.idProperty = idProperty;
-		this.id = id;
+	public void addFilterChangeListener(FilterChangeListener listener) {
+		listeners.add(listener);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.ui.api.datamart.IDatamartFilterGenerator#removeChangeListener(org.eclipse.osbp.ui.api.datamart.IDatamartFilterGenerator.FilterChangeListener)
+	 */
+	@Override
+	public void removeFilterChangeListener(FilterChangeListener listener) {
+		listeners.remove(listener);
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.ui.api.datamart.IDatamartFilterGenerator#selectItem(java.lang.String, java.lang.String)
+	 */
 	@Override
-	public void resetId() {
-		idMode = false;
-	}
-
-	@Override
-	public Map<String, IDatamartSelectable> getSelectors() {
-		return selectors;
-	}
-
-	@Override
-	public boolean isCube() {
-		return cube;
-	}
-
-	@Override
-	public void setCube(boolean cube) {
-		this.cube = cube;
-	}
-
-	@Override
-	public void selectItem(String filter, String selection) {
-		if (selection != null) {
+	public void selectItem(String filterID, String selection) {
+		if (selection != null && datamart != null) {
 			String sel = selection.replace("_", " ");
-			if (selectors.containsKey(filter)) {
-				for (Object id : selectors.get(filter).getContainerDataSource()
-						.getItemIds()) {
-					if (((IDualData) id).getSignificantValue().equals(sel)) {
-						selectors.get(filter).select(id);
-						break;
+			ArrayList<DatamartFilter> filters = datamart.getFilters();
+			if (filters != null) {
+				for (DatamartFilter filter : filters) {
+					if(filter.getType() != DatamartFilter.FilterType.BY_ID && filter.getName().equals(filterID)) {
+						for(IDualData item : filter.getData()) {
+							if(item.getSelectionValue().equals(sel)) {
+								filter.getSelector().select(item);
+								return;
+							}
+						}
 					}
 				}
 			}
 		}
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.ui.api.datamart.IDatamartFilterGenerator#selectItem(java.util.Map)
+	 */
 	@Override
-	public void resetItem(String filter) {
-		if (selectors.containsKey(filter)) {
-			selectors.get(filter).select(selectors.get(filter).getFirstItem());
+	public boolean selectItem(EventDispatcherEvent event, boolean byId) {
+		boolean mustRefresh = false;
+		for(DatamartFilter filter : datamart.getFilters()) {
+			switch (filter.getType()) {
+			case BY_ID:
+				if(byId && event.getData().containsKey(EventDispatcherDataTag.ID)) {
+					Object id = event.getData().get(EventDispatcherDataTag.ID);
+					filter.setSql("");
+					if(event.getTopic().endsWith(filter.getName())) {
+						if(id instanceof Integer) {
+							filter.setSql(((Integer)id).toString());
+						} else if (id instanceof String) {
+							filter.setSql("'"+(String)id+"'");
+						}
+						
+					} else {
+						filter.setSql("");
+					}
+					mustRefresh = true;
+				}
+				break;
+			case SINGLE:
+				if(filter.canSelectData(event.getData(), false, false)) {
+					filter.getSelector().select(filter.getSelectedData().get(0));
+					return false;
+				}
+				break;
+			case MULTIPLE:
+				if(filter.canSelectData(event.getData(), true, false)) {
+					concurrentModificationLock = true;
+					filter.getSelector().select(filter.getSelectedData());
+					concurrentModificationLock = false;
+					if(concurrentEventOccured) {
+						valueChange(concurrentEvent);
+					}
+					return false;
+				}
+				break;
+			case SINGLEHIERARCHY:
+			case SINGLESLICER:
+			case EXCEPT:
+				if(filter.canSelectData(event.getData(), false, true)) {
+					filter.getSelector().select(filter.getSelectedData().get(0));
+					return false;
+				}
+				break;
+			case MULTIPLEHIERARCHY:
+			case MULTIPLESLICER:
+				if(filter.canSelectData(event.getData(), true, true)) {
+					concurrentModificationLock = true;
+					filter.getSelector().select(filter.getSelectedData());
+					concurrentModificationLock = false;
+					if(concurrentEventOccured) {
+						valueChange(concurrentEvent);
+					}
+					return false;
+				}
+				break;
+			}
+		}
+		return mustRefresh;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.ui.api.datamart.IDatamartFilterGenerator#resetItem(java.lang.String)
+	 */
+	@Override
+	public void resetItem(String filterID) {
+		if (datamart != null) {
+			ArrayList<DatamartFilter> filters = datamart.getFilters();
+			if (filters != null) {
+				for (DatamartFilter filter : filters) {
+					if(filter.getType() != DatamartFilter.FilterType.BY_ID) {
+						filter.getSelector().select(filter.getSelector().getFirstItem());
+						return;
+					}
+				}
+			}
 		}
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.ui.api.datamart.IDatamartFilterGenerator#createUIFilters(org.eclipse.osbp.ui.api.layout.IViewLayoutManager)
+	 */
+	@Override
+	public boolean createUIFilters(IViewLayoutManager layoutManager) {
+		boolean hasFilters = false;
+		if(datamart != null) {
+			datamart.renderFilters();
+			ArrayList<DatamartFilter> filters = datamart.getFilters();
+			if (filters != null) {
+				hasFilters = true;
+				for (DatamartFilter filter : filters) {
+					switch (filter.getType()) {
+					case BY_ID:
+						break;
+					case SINGLE:
+					case SINGLEHIERARCHY:
+						filter.setSelector(new DatamartSingleSelect(false, false, filter.getData()));
+						layoutManager.getTopArea().addComponent((Component)filter.getSelector());
+						break;
+					case SINGLESLICER:
+						filter.setSelector(new DatamartSingleSelect(false, true, filter.getData()));
+						layoutManager.getTopArea().addComponent((Component)filter.getSelector());
+						break;
+					case EXCEPT:
+						filter.setSelector(new DatamartSingleSelect(true, false, filter.getData()));
+						layoutManager.getTopArea().addComponent((Component)filter.getSelector());
+						break;
+					case MULTIPLE:
+					case MULTIPLEHIERARCHY:
+						filter.setSelector(new DatamartMultiSelect(IDatamartFilterGenerator.MULTISELECTION_ROWS, false, false, filter.getData()));
+						layoutManager.getSideArea().addComponent((Component)filter.getSelector());
+						break;
+					case MULTIPLESLICER:
+						filter.setSelector(new DatamartMultiSelect(IDatamartFilterGenerator.MULTISELECTION_ROWS, false, true, filter.getData()));
+						layoutManager.getSideArea().addComponent((Component)filter.getSelector());
+						break;
+					case BETWEEN:
+						filter.setBetweenInputComponent(new DatamartBetweenText());
+						layoutManager.getTopArea().addComponent((Component) filter.getBetweenInputComponent());
+						break;
+					case BETWEEN_DATE:
+						filter.setBetweenInputComponent(new DatamartBetweenDate(filter.format, filter.resolution));
+						layoutManager.getTopArea().addComponent((Component) filter.getBetweenInputComponent());
+						break;
+					}
+					if(filter.getType() != DatamartFilter.FilterType.BY_ID) {
+						if (DatamartFilter.FilterType.BETWEEN == filter.getType() || DatamartFilter.FilterType.BETWEEN_DATE == filter.getType()){
+							filter.getBetweenInputComponent().addValueChangeListener(this);
+						} else {
+							filter.getSelector().addValueChangeListener(this);
+						}
+					}
+				}
+			}
+			localeChanged(datamart.getUser().getLocale());
+			getSelections();
+		}
+		return hasFilters;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.ui.api.datamart.IDatamartFilterGenerator#updateFilter()
+	 */
+	@Override
+	public void updateFilter() {
+		if(datamart != null) {
+			datamart.renderFilters();
+			ArrayList<DatamartFilter> filters = datamart.getFilters();
+			if (filters != null) {
+				for (DatamartFilter filter : filters) {
+					if(filter.getType() != DatamartFilter.FilterType.BY_ID) {
+						filter.getSelector().update(filter.getData());
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Gets the selections.
+	 *
+	 * @return the selections
+	 */
+	private boolean getSelections() {
+		boolean allFiltersSet = true;
+		if(datamart != null) {
+			ArrayList<DatamartFilter> filters = datamart.getFilters();
+			if (filters != null) {
+				for (DatamartFilter filter : filters) {
+					filter.clearSelectedData();
+					switch (filter.getType()) {
+					case BY_ID:
+						break;
+					case SINGLE:
+					case SINGLEHIERARCHY:
+					case EXCEPT:
+					case SINGLESLICER:
+						if(filter.getSelector().getValue() != null) {
+							filter.addSelectedItem((IDualData)filter.getSelector().getValue());
+						} else {
+							filter.clearSelectedData();
+							allFiltersSet = false;
+						}
+						break;
+					case MULTIPLE:
+					case MULTIPLEHIERARCHY:
+					case MULTIPLESLICER:
+						filter.setSelectedData(filter.getSelector().getSelectedItems());
+						if(filter.getSelector().getSelectedItems().isEmpty()) {
+							allFiltersSet = false;
+						}
+						break;
+					}
+				}
+			}
+		}
+		return allFiltersSet;
+	}
+
+	/**
+	 * Strip MDX characters.
+	 *
+	 * @param filterName the filter name
+	 * @return the string
+	 */
+	private String stripMDXCharacters(String filterName) {
+		return filterName.replace("[", "").replace("]", "");
+	}
+	
+	/**
+	 * Gets the translatable key.
+	 *
+	 * @param filterName the filter name
+	 * @return the translatable key
+	 */
 	private String getTranslatableKey(String filterName) {
 		return I18NKeyGenerator.key(stripHierarchy(filterName));
 	}
 
-	private String stripMDXCharacters(String filterName) {
-		return filterName.replace(IDataMart.singleSelectDecorator, "").replace(IDataMart.multiSelectDecorator, "").replace(IDataMart.exceptDecorator, "")
-				.replace(IDataMart.slicerSingleSelectDecorator, "").replace(IDataMart.slicerMultiSelectDecorator, "").replace("[", "")
-				.replace("]", "");
-	}
-
+	/**
+	 * Strip hierarchy.
+	 *
+	 * @param filterName the filter name
+	 * @return the string
+	 */
 	private String stripHierarchy(String filterName) {
 		String result = filterName;
 		String[] parts = stripMDXCharacters(filterName).split("\\.");
@@ -133,270 +349,70 @@
 		return result.replace(".", " ");
 	}
 
+	/* (non-Javadoc)
+	 * @see com.vaadin.data.Property.ValueChangeListener#valueChange(com.vaadin.data.Property.ValueChangeEvent)
+	 */
 	@Override
-	public boolean createFilter(IDataMart datamart, IUser user,
-			ValueChangeListener filterChangeListener,
-			IViewLayoutManager layoutManager) {
-		return createFilter(datamart, user, filterChangeListener, layoutManager, false);
-	}
-
-	@Override
-	public boolean createFilter(IDataMart datamart, IUser user,
-			ValueChangeListener filterChangeListener,
-			IViewLayoutManager layoutManager,
-			boolean showCaption) {
-		boolean hasFilters = false;
-		this.showCaption = showCaption;
-		HashMap<String, ArrayList<IDualData>> filters = datamart
-				.getFilters(user);
-		if ((filters != null) && filters.size() > 0) {
-			for (String filter : filters.keySet()) {
-				if (!hasFilters) {
-					hasFilters = true;
-				}
-				// the id filter solution
-				if (!filters.get(filter).contains(IDataMart.filterIdPlaceholder)) {
-					boolean isSingleSelect = false;
-					boolean isMultiSelect = false;
-					boolean isSlicer = false;
-					boolean isExcept = false;
-					if (filter.contains(IDataMart.multiSelectDecorator)) {
-						isMultiSelect = true;
-					}
-					if (filter.contains(IDataMart.singleSelectDecorator)) {
-						isSingleSelect = true;
-					}
-					if (filter.contains(IDataMart.exceptDecorator)) {
-						isSingleSelect = true;
-						isExcept = true;
-					}
-					if (filter.contains(IDataMart.slicerSingleSelectDecorator)) {
-						isSingleSelect = true;
-						isSlicer = true;
-					}
-					if (filter.contains(IDataMart.slicerMultiSelectDecorator)) {
-						isMultiSelect = true;
-						isSlicer = true;
-					}
-					// --- the filter should be UNIQUE for each view ---
-					if (!selectors.containsKey(filter)) {
-						IDatamartSelectable box = null;
-						if (isSingleSelect) {
-							box = new DatamartSingleSelect(isExcept, isSlicer,
-									filter, filters.get(filter));
-							layoutManager.getTopArea().addComponent((Component)box);
-
-						} else if (isMultiSelect) {
-							box = new DatamartMultiSelect(5, false, isSlicer,
-									filter, filters.get(filter));
-							layoutManager.getSideArea().addComponent((Component)box);
-						}
-						if (box != null && filterChangeListener != null) {
-							box.addValueChangeListener(filterChangeListener);
-						}
-						selectors.put(filter, box);
-					}
-				}
-			}
-		}
-		return hasFilters;
-	}
-
-	@Override
-	public void updateFilter(IDataMart datamart, IUser user,
-			ValueChangeListener filterChangeListener) {
-		HashMap<String, ArrayList<IDualData>> filters = datamart
-				.getFilters(user);
-		if ((filters != null) && filters.size() > 0) {
-			for (String filter : filters.keySet()) {
-				if (selectors.containsKey(filter)) {
-					if(filterChangeListener != null) {
-						selectors.get(filter).removeValueChangeListener(
-							filterChangeListener);
-					}
-					selectors.get(filter).update(filters.get(filter));
-					if(filterChangeListener != null) {
-						selectors.get(filter).addValueChangeListener(
-							filterChangeListener);
-					}
-				}
-			}
-		}
-	}
-
-	@Override
-	public Map<String, String> getFilter(boolean isCube) {
-		Map<String, String> filters = new HashMap<String, String>();
-		setCube(isCube);
-		if (idMode) {
-			idMode = false;
-			filters.put(idProperty, id);
-			return filters;
-		}
-		boolean hasSlicer = false;
-		boolean isMultiSelected = false;
-		for (String selector : selectors.keySet()) {
-			if (selectors.get(selector).isSlicer()) {
-				hasSlicer = true;
-			}
-			if (selectors.get(selector).isMultiSelected()) {
-				isMultiSelected = true;
-			}
-		}
-		if (!isCube || !hasSlicer || !isMultiSelected) {
-			for (String selector : selectors.keySet()) {
-				if (selectors.get(selector) instanceof DatamartMultiSelect) {
-					String selection = "";
-					for (IDualData item : selectors.get(selector)
-							.getSelectedItems()) {
-						if (item != null) {
-							if (!selection.isEmpty()) {
-								selection += ",";
+	public void valueChange(ValueChangeEvent event) {
+		if(!concurrentModificationLock) {
+			concurrentEventOccured = false;
+			// compute selections
+			if(getSelections()) {
+				// get the filter that changed
+				DatamartFilter changedFilter = null;
+				if(datamart != null) {
+					ArrayList<DatamartFilter> filters = datamart.getFilters();
+					if (filters != null) {
+						for (DatamartFilter filter : filters) {
+							if(event != null) {
+								if (filter.getType() == DatamartFilter.FilterType.BETWEEN || filter.getType() == DatamartFilter.FilterType.BETWEEN_DATE) {
+									if (!filter.getBetweenInputComponent().getFrom().isEmpty() && filter.getBetweenInputComponent().getUntilInput().equals(event.getProperty())){
+										changedFilter = filter;
+										break;
+									}
+								} else if (filter.getType() != DatamartFilter.FilterType.BY_ID && filter.getSelector().equals(event.getProperty())) {
+									changedFilter = filter;
+									break;
+								}
 							}
-							selection += item.getSelectionValue();
 						}
 					}
-					filters.put(selectors.get(selector).getFilterName(),
-							selection);
-				} else {
-					try {
-						filters.put(
-								selectors.get(selector).getFilterName(),
-								((IDualData) selectors.get(selector).getValue())
-										.getSelectionValue());
-					} catch (NullPointerException npe) {
-						log.error("NPE for "
-								+ selectors.get(selector).getFilterName(), npe);
-					}
+				}
+				// notify the listeners of the changed filter
+				for(FilterChangeListener listener:listeners) {
+					listener.filterChanged(changedFilter);
 				}
 			}
 		} else {
-			String firstFilter = null;
-			List<List<String>> filterGroup = new ArrayList<List<String>>();
-			for (String multiSelect : selectors.keySet()) {
-				if (selectors.get(multiSelect) instanceof DatamartMultiSelect) {
-					if (selectors.get(multiSelect).isSlicer()) {
-						List<String> myList = new ArrayList<String>();
-						for (IDualData item : selectors.get(multiSelect)
-								.getSelectedItems()) {
-							if (item != null) {
-								myList.add(item.getSelectionValue());
-							}
-						}
-						filterGroup.add(myList);
-						if (firstFilter == null) {
-							firstFilter = selectors.get(multiSelect)
-									.getFilterName();
-						} else {
-							filters.put(selectors.get(multiSelect)
-									.getFilterName(), "<empty>");
-						}
-					} else {
-						String selection = "";
-						for (IDualData item : selectors.get(multiSelect)
-								.getSelectedItems()) {
-							if (item != null) {
-								if (!selection.isEmpty()) {
-									selection += ",";
-								}
-								selection += item.getSelectionValue();
-							}
-						}
-						filters.put(selectors.get(multiSelect).getFilterName(),
-								selection);
-					}
-				} else {
-					if (selectors.get(multiSelect).isSlicer()) {
-						List<String> myList = new ArrayList<String>();
-						for (IDualData item : selectors.get(multiSelect)
-								.getSelectedItems()) {
-							if (item != null) {
-								myList.add(item.getSelectionValue());
-							}
-						}
-						filterGroup.add(myList);
-						if (firstFilter == null) {
-							firstFilter = selectors.get(multiSelect)
-									.getFilterName();
-						} else {
-							filters.put(selectors.get(multiSelect)
-									.getFilterName(), "<empty>");
-						}
-					} else if (selectors.get(multiSelect).getValue() != null) {
-						try {
-							filters.put(selectors.get(multiSelect)
-									.getFilterName(), ((IDualData) selectors
-									.get(multiSelect).getValue())
-									.getSelectionValue());
-						} catch (NullPointerException npe) {
-							log.error("NPE for "
-									+ selectors.get(multiSelect)
-											.getFilterName(), npe);
-						}
-					}
-				}
-			}
-			// calculate every permutation of selection as slices must be
-			// created
-			List<List<String>> permutations = new ArrayList<List<String>>();
-			int numEntries = 1;
-			for (List<String> list : filterGroup) {
-				numEntries *= list.size();
-			}
-			for (int i = 0; i < numEntries; i++) {
-				permutations.add(new ArrayList<String>());
-			}
-			for (List<String> itemList : filterGroup) {
-				Iterator<String> iterator = itemList.iterator();
-				if (iterator.hasNext()) {
-					for (List<String> entry : permutations) {
-						entry.add(iterator.next());
-						if (!iterator.hasNext()) {
-							iterator = itemList.iterator();
-						}
-					}
-				}
-			}
-			String set = "";
-			boolean firstSet = true;
-			for (List<String> permutation : permutations) {
-				boolean firstTuple = true;
-				String tuple = "";
-				for (String item : permutation) {
-					if (firstTuple) {
-						firstTuple = false;
-					} else {
-						tuple += ",";
-					}
-					tuple += item;
-				}
-				if (firstSet) {
-					firstSet = false;
-				} else {
-					set += ",";
-				}
-				set += "(" + tuple + ")";
-			}
-			filters.put(firstFilter, "{" + set + "}");
+			concurrentEventOccured = true;
+			concurrentEvent = event;
 		}
-		return filters;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.ui.api.user.IUser.UserLocaleListener#localeChanged(java.util.Locale)
+	 */
 	@Override
-	public void setLocale(Locale locale) {
-		if (dslMetadataService != null) {
-			for (String sel : selectors.keySet()) {
-				if (showCaption) {
-					selectors.get(sel).setCaption(
-							dslMetadataService.translate(
-									locale.toLanguageTag(),
-									getTranslatableKey(selectors.get(sel)
-											.getFilterName())));
+	public void localeChanged(final Locale locale) {
+		if(datamart != null) {
+			ArrayList<DatamartFilter> filters = datamart.getFilters();
+			if (filters != null) {
+				for (DatamartFilter filter : filters) {
+					if(filter.getSelector() != null || filter.getBetweenInputComponent() != null) {
+						if (IDatamartFilterGenerator.SHOW_CAPTION) {
+							if (DatamartFilter.FilterType.BETWEEN == filter.getType() || DatamartFilter.FilterType.BETWEEN_DATE == filter.getType()) {
+								filter.getBetweenInputComponent().setCaption(dslMetadataService.translate(locale.toLanguageTag(), getTranslatableKey(filter.getName())));
+							} else {
+								filter.getSelector().setCaption(dslMetadataService.translate(locale.toLanguageTag(), getTranslatableKey(filter.getName())));
+							}
+						} 
+						if (DatamartFilter.FilterType.BETWEEN == filter.getType() || DatamartFilter.FilterType.BETWEEN_DATE == filter.getType()) {
+							filter.getBetweenInputComponent().setDescription(dslMetadataService.translate(locale.toLanguageTag(), getTranslatableKey(filter.getName())));
+						} else {
+							filter.getSelector().setDescription(dslMetadataService.translate(locale.toLanguageTag(), getTranslatableKey(filter.getName())));
+						}
+					}
 				}
-				selectors.get(sel).setDescription(
-						dslMetadataService.translate(locale.toLanguageTag(),
-								getTranslatableKey(selectors.get(sel)
-										.getFilterName())));
 			}
 		}
 	}
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartMultiSelect.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartMultiSelect.java
index ea1e7cb..e0e0e5d 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartMultiSelect.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartMultiSelect.java
@@ -16,9 +16,9 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.eclipse.osbp.runtime.common.event.IDualData;
 import org.eclipse.osbp.ui.api.datamart.IDatamartSelectable;
-import org.eclipse.osbp.ui.api.datamart.IDualData;
-import org.eclipse.osbp.utils.theme.EnumCssClass;
+import org.eclipse.osbp.ui.api.themes.EnumCssClass;
 
 import com.vaadin.data.Container;
 import com.vaadin.ui.ListSelect;
@@ -27,7 +27,6 @@
 		IDatamartSelectable {
 
 	private static final long serialVersionUID = 7284120542309904692L;
-	private String filterName = null;
 	private boolean slicer = false;
 	private String hierarchy = null;
 	private IDualData firstItem = null;
@@ -40,10 +39,9 @@
 	}
 
 	public DatamartMultiSelect(int rowsLimit, boolean isExcept,
-			boolean isSlicer, String filterName, Collection<IDualData> data) {
+			boolean isSlicer, Collection<IDualData> data) {
 		addStyleName(EnumCssClass.MULTI_SELECTION.styleName());
 		slicer = isSlicer;
-		setFilterName(filterName);
 		setMultiSelect(true);
 		update(data);
 		if (data.size() > rowsLimit) {
@@ -74,15 +72,13 @@
 		firstItem = null;
 		for (IDualData dd : options) {
 			setHierarchy(dd.getHierarchy());
-			// String item = dd.getFormattedValue();
-			String item = dd.getSignificantValue();
+			String item = dd.getSelectionValue();
 			if (item != null) {
 				if (firstItem == null) {
 					firstItem = dd;
 				}
 				addItem(dd);
-				// setItemCaption(dd, dd.getFormattedValue());
-				setItemCaption(dd, dd.getSignificantValue());
+				setItemCaption(dd, dd.getFormattedValue());
 			}
 		}
 		// always select the first option
@@ -99,14 +95,6 @@
 		super.setWidth(width);
 	}
 	
-	public String getFilterName() {
-		return filterName;
-	}
-
-	public void setFilterName(String filterName) {
-		this.filterName = filterName;
-	}
-
 	public List<IDualData> getSelectedItems() {
 		List<IDualData> list = new ArrayList<IDualData>();
 		for (Object item : (Collection<?>) getValue()) {
@@ -132,9 +120,18 @@
 		return super.getContainerDataSource();
 	}
 
+	@SuppressWarnings("unchecked")
 	@Override
 	public void select(Object obj) {
-		super.select(obj);
+		for(Object item:getItemIds()) {
+			for(IDualData sel:(List<IDualData>)obj) {
+				if(sel.equals((IDualData)item)) {
+					super.select(item);
+				} else {
+					super.unselect(item);
+				}
+			}
+		}
 	}
 
 	@Override
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartSingleSelect.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartSingleSelect.java
index a1c37d2..3c6c198 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartSingleSelect.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/DatamartSingleSelect.java
@@ -16,9 +16,9 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.eclipse.osbp.runtime.common.event.IDualData;
 import org.eclipse.osbp.ui.api.datamart.IDatamartSelectable;
-import org.eclipse.osbp.ui.api.datamart.IDualData;
-import org.eclipse.osbp.utils.theme.EnumCssClass;
+import org.eclipse.osbp.ui.api.themes.EnumCssClass;
 
 import com.vaadin.data.Container;
 import com.vaadin.ui.ComboBox;
@@ -27,7 +27,6 @@
 		IDatamartSelectable {
 
 	private static final long serialVersionUID = -5673052113801450589L;
-	private String filterName = null;
 	private String hierarchy = null;
 	private boolean slicer = false;
 	private IDualData firstItem = null;
@@ -41,10 +40,9 @@
 	}
 
 	public DatamartSingleSelect(boolean isExcept, boolean isSlicer,
-			String filterName, Collection<IDualData> data) {
+			Collection<IDualData> data) {
 		addStyleName(EnumCssClass.SINGLE_SELECTION.styleName());
 		slicer = isSlicer;
-		setFilterName(filterName);
 		update(data);
 	}
 
@@ -61,15 +59,13 @@
 		firstItem = null;
 		for (IDualData dd : options) {
 			setHierarchy(dd.getHierarchy());
-			// String item = dd.getFormattedValue();
-			String item = dd.getSignificantValue();
+			String item = dd.getSelectionValue();
 			if (item != null) {
 				if (firstItem == null) {
 					firstItem = dd;
 				}
 				addItem(dd);
-				// setItemCaption(dd, dd.getFormattedValue());
-				setItemCaption(dd, dd.getSignificantValue());
+				setItemCaption(dd, dd.getFormattedValue());
 			}
 		}
 		// always select the first option
@@ -84,14 +80,6 @@
 		super.setWidth(width);
 	}
 	
-	public String getFilterName() {
-		return filterName;
-	}
-
-	public void setFilterName(String filterName) {
-		this.filterName = filterName;
-	}
-
 	public List<IDualData> getSelectedItems() {
 		List<IDualData> items = new ArrayList<IDualData>();
 		items.add((IDualData) getValue());
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/Cell2dTable.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/Cell2dTable.java
index 5916595..16a33a4 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/Cell2dTable.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/Cell2dTable.java
@@ -19,7 +19,6 @@
 import java.util.TreeMap;
 
 import org.eclipse.osbp.dsl.entity.xtext.util.PersistenceNamingUtils;
-import org.eclipse.osbp.ui.api.datamart.DerivedOlapException;
 
 /**
  * Do not mistake {@link Cell2dTable} with {@link DerivedCellSet}!
@@ -34,16 +33,13 @@
 	private final Map<Integer,HeaderMapping> fIndexToHeaderMap;
 	private final Map<String,HeaderMapping> fNameToHeaderMap;
 
-	public Cell2dTable(DerivedCellSet cellSet) throws DerivedOlapException {
+	@SuppressWarnings("restriction")
+	public Cell2dTable(DerivedCellSet cellSet) {
 		fCellSet = cellSet;
 		fIndexToHeaderMap = new TreeMap<Integer,HeaderMapping>();
 		fNameToHeaderMap = new HashMap<String,HeaderMapping>();
 
-		if (cellSet == null) {
-			throw new DerivedOlapException("referenced datamart EmployeeSalary generates no results");
-		} else if (cellSet.getAxes().size() < 2) {
-			throw new DerivedOlapException("at least 2 axes from referenced datamart EmployeeSalary are needed to render EmployeeSalary");
-		} else {
+		if (cellSet != null && cellSet.getAxes().size() > 1) {
 			try {
 				// --- first get the header for all "rows" ---
 				DerivedHierarchy hier = fCellSet.getAxes().get(DerivedAxis.AXIS_ROWS).getPositions().get(0).getMembers().get(0).getHierarchy();
@@ -51,9 +47,8 @@
 					int count = 0;
 					for (DerivedLevel lev : hier.getLevels()) {
 						HeaderMapping headerMap = new HeaderMapping(
-							fIndexToHeaderMap.size(), 
-							// see DatamartDSLJvmInferrer & ReportDSLJvmInferrer 
-							PersistenceNamingUtils.camelCaseToUpperCase(lev.getName()).toLowerCase(), 
+							-hier.getLevels().size() + count, 
+							lev.getName(), 
 							DerivedAxis.AXIS_ROWS, 
 							count);
 						fIndexToHeaderMap.put(headerMap.fHeaderIndex, headerMap);
@@ -62,35 +57,26 @@
 					}
 				}
 			}
-			catch (DerivedOlapException oe) {
-				throw oe;
-			}
 			catch (Exception e) {
 			}
 	
-			try {
-				// --- next get the header for all "columns" ---
-				// Column header
-				// See
-				// http://www.olap4j.org/api/index.html?org/olap4j/Position.html
-				// on how Position works, it helps a lot
-				// Every position will be a column in the header
-				int count = 0;
-				for (DerivedPosition pos : fCellSet.getAxes().get(DerivedAxis.AXIS_COLUMNS).getPositions()) {
-					// --- only use 1st member ---
-					HeaderMapping headerMap = new HeaderMapping(
-						fIndexToHeaderMap.size(),
-						// see DatamartDSLJvmInferrer & ReportDSLJvmInferrer 
-						PersistenceNamingUtils.camelCaseToUpperCase(pos.getMembers().get(0).getCaption()).toLowerCase(),
-						DerivedAxis.AXIS_COLUMNS,
-						count);
-					fIndexToHeaderMap.put(headerMap.fHeaderIndex, headerMap);
-					fNameToHeaderMap.put(headerMap.fHeaderName, headerMap);
-					count++;
-				}
-			}
-			catch (Exception e) {
-				throw new DerivedOlapException(e.getLocalizedMessage());
+			// --- next get the header for all "columns" ---
+			// Column header
+			// See
+			// http://www.olap4j.org/api/index.html?org/olap4j/Position.html
+			// on how Position works, it helps a lot
+			// Every position will be a column in the header
+			int count = 0;
+			for (DerivedPosition pos : fCellSet.getAxes().get(DerivedAxis.AXIS_COLUMNS).getPositions()) {
+				// --- only use 1st member ---
+				HeaderMapping headerMap = new HeaderMapping(
+					count,
+					pos.getMembers().get(0).getCaption(),
+					DerivedAxis.AXIS_COLUMNS,
+					count);
+				fIndexToHeaderMap.put(headerMap.fHeaderIndex, headerMap);
+				fNameToHeaderMap.put(headerMap.fHeaderName, headerMap);
+				count++;
 			}
 		}
 	}
@@ -100,8 +86,13 @@
 	}
 
 	private HeaderMapping header(String name) {
-		// see DatamartDSLJvmInferrer & ReportDSLJvmInferrer 
-		return fNameToHeaderMap.get(PersistenceNamingUtils.camelCaseToUpperCase(name).toLowerCase());
+		// see DatamartDSLJvmInferrer & ReportDSLJvmInferrer
+		for(String col:fNameToHeaderMap.keySet()) {
+			if(col.equalsIgnoreCase(name)) {
+				return fNameToHeaderMap.get(col);
+			}
+		}
+		return null;
 	}
 
 	/**
@@ -113,11 +104,11 @@
 
 	/**
 	 * @param name
-	 * @return the index of the header or -1 if it doesn't exist
+	 * @return the index of the header or -99 if it doesn't exist
 	 */
 	public int getHeaderIndex(String name) {
 		HeaderMapping header = header(name);
-		return header == null ? -1 : header.fHeaderIndex;
+		return header == null ? -99 : header.fHeaderIndex;
 	}
 
 	/**
@@ -182,11 +173,7 @@
 					ArrayList<Integer> list = new ArrayList<Integer>();
 					list.add(header.fIndexOnAxis); // coordinte
 					list.add(rowIndex); // coordinte
-					try {
-						result = fCellSet.getCell(list);
-					} catch (DerivedOlapException e) {
-						e.printStackTrace();
-					}
+					result = fCellSet.getCell(list);
 					break;
 			}
 		}
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/CellSetToD3JsonConverter.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/CellSetToD3JsonConverter.java
index 472ac18..c364950 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/CellSetToD3JsonConverter.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/CellSetToD3JsonConverter.java
@@ -18,8 +18,6 @@
 import java.util.LinkedList;
 import java.util.List;
 
-import org.eclipse.osbp.ui.api.datamart.DerivedOlapException;
-
 import elemental.json.JsonFactory;
 import elemental.json.impl.JreJsonArray;
 import elemental.json.impl.JreJsonFactory;
@@ -32,7 +30,7 @@
 	private static final String KEY_TOOLTIPNAME="tooltipName";
 	private static JsonFactory factory = new JreJsonFactory();
 
-	public static String getD3JsonString(DerivedCellSet cxCellSet) throws DerivedOlapException{
+	public static String getD3JsonString(DerivedCellSet cxCellSet) {
 	    // generate a new result component
 	    if (cxCellSet == null) {
 	    	return "";
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedAxis.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedAxis.java
index b846ace..7c53539 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedAxis.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedAxis.java
@@ -21,7 +21,7 @@
 
 import mondrian.olap.Axis;
 
-import org.jbpm.task.query.TaskSummary;
+import org.eclipse.osbp.bpm.api.BPMTaskSummary;
 import org.olap4j.CellSetAxis;
 
 
@@ -32,7 +32,7 @@
 	
 	private CellSetAxis olapAxis = null;
 	private Axis mondrianAxis = null;
-	private List<TaskSummary> taskAxis = null;
+	private List<BPMTaskSummary> taskAxis = null;
 	private List<DerivedPosition> positionList = new ArrayList<>();
 	private Map<Integer, DerivedPosition> positionsByOrdinal = new HashMap<>();
 	private Map<DerivedPosition, Integer> ordinalsByPosition = new HashMap<>();
@@ -62,7 +62,7 @@
 		}
 	}
 	
-	public DerivedAxis(List<TaskSummary> taskAxis, int axisNo, DerivedCellSet container) {
+	public DerivedAxis(List<BPMTaskSummary> taskAxis, int axisNo, DerivedCellSet container) {
 		super();
 		this.container = container;
 		this.taskAxis = taskAxis;
@@ -114,7 +114,7 @@
 			ordinalsByPosition.put(pos,  ordinal);
 		}
 		if (axisNo == 1) {
-			for (TaskSummary task : taskAxis) {
+			for (BPMTaskSummary task : taskAxis) {
 				DerivedPosition pos = new DerivedPosition("row", ordinal++, container);
 				positionList.add(pos);
 				positionsByOrdinal.put(ordinal, pos);
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedCellSet.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedCellSet.java
index bafa401..9cba6f2 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedCellSet.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedCellSet.java
@@ -19,12 +19,11 @@
 import mondrian.olap.Result;
 
 import org.apache.commons.lang3.ArrayUtils;
-import org.eclipse.osbp.ui.api.datamart.DerivedOlapException;
+import org.eclipse.osbp.bpm.api.BPMTaskSummary;
 import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
 import org.eclipse.osbp.ui.api.user.IUser;
 import org.eclipse.osbp.xtext.datamart.common.sql.OperativeDtoContainer;
 import org.eclipse.osbp.xtext.datamart.common.sql.SqlCellSet;
-import org.jbpm.task.query.TaskSummary;
 import org.olap4j.CellSet;
 import org.olap4j.CellSetAxis;
 import org.slf4j.Logger;
@@ -38,13 +37,13 @@
  * </ul>
  */
 public class DerivedCellSet{
-	private final static Logger cellLog = LoggerFactory.getLogger(DerivedCellSet.class);
+	private static final Logger cellLog = LoggerFactory.getLogger(DerivedCellSet.class);
 	private final ResultSetMetaData resultSetMetaData;
 	
 	private CellSet olapCellset = null;
 	private Result mondrianCellset = null;
-	private List<TaskSummary> taskCellset = null;
-	private List<DerivedAxis> axisList = new ArrayList<DerivedAxis>();
+	private List<BPMTaskSummary> taskCellset = null;
+	private List<DerivedAxis> axisList = new ArrayList<>();
 	private IDSLMetadataService dslMetadataService;
 	private IUser user;
 	
@@ -74,7 +73,7 @@
 		}
 	}
 	
-	public DerivedCellSet(List<TaskSummary> tasks, IDSLMetadataService dslMetadataService, IUser user) {
+	public DerivedCellSet(List<BPMTaskSummary> tasks, IDSLMetadataService dslMetadataService, IUser user) {
 		super();
 		this.dslMetadataService = dslMetadataService;
 		this.user = user;
@@ -121,7 +120,7 @@
 	 * @param rowIndex
 	 * @return
 	 */
-	public DerivedCell getCell(List<Integer> coordinate) throws DerivedOlapException {
+	public DerivedCell getCell(List<Integer> coordinate) {
 		DerivedCell cxCell = null;
 		try {
 			if (olapCellset!=null){
@@ -132,7 +131,7 @@
 				cxCell = new DerivedCell(getTaskCellValue(taskCellset,coordinate), getTaskCellFormattedValue(taskCellset,coordinate));
 			}
 		} catch (Exception e) {
-			cellLog.error(e.getLocalizedMessage());
+			cellLog.error("{}", e);
 		}
 		return cxCell;
 	}
@@ -143,8 +142,8 @@
 		return mondrianCellset.getCell(coordinateArray);
 	}
 
-	private Object getTaskCellValue(List<TaskSummary> taskCellset, List<Integer> coordinate){
-		TaskSummary task = taskCellset.get(coordinate.get(1));
+	private Object getTaskCellValue(List<BPMTaskSummary> taskCellset, List<Integer> coordinate){
+		BPMTaskSummary task = taskCellset.get(coordinate.get(1));
 		switch(coordinate.get(0)) {
 			case 0: return task.getName();
 			case 1: return task.getPriority();
@@ -157,12 +156,14 @@
 			case 8: return task.getActivationTime();
 			case 9: return task.getActualOwner();
 			case 10:return task.getId();
+			default:
+				break;
 		}
 		return null;
 	}
 
-	private String getTaskCellFormattedValue(List<TaskSummary> taskCellset, List<Integer> coordinate){
-		TaskSummary task = taskCellset.get(coordinate.get(1));
+	private String getTaskCellFormattedValue(List<BPMTaskSummary> taskCellset, List<Integer> coordinate){
+		BPMTaskSummary task = taskCellset.get(coordinate.get(1));
 		switch(coordinate.get(0)) {
 			case 0: return task.getName();
 			case 1:
@@ -201,6 +202,8 @@
 					return Long.toString(task.getId());
 				}
 				return null;
+			default:
+				break;
 		}
 		return null;
 	}
@@ -213,8 +216,8 @@
 		return user;
 	}
 
-	public boolean idsMatch(DerivedCellSet other, List<Integer>coordinateSystem, int rowOrdinal) throws DerivedOlapException {
-    	List<Integer> coordinates = new ArrayList<Integer>(coordinateSystem);
+	public boolean idsMatch(DerivedCellSet other, List<Integer>coordinateSystem, int rowOrdinal) {
+    	List<Integer> coordinates = new ArrayList<>(coordinateSystem);
     	coordinates.set(1, rowOrdinal);
     	Object value = null;
     	Object otherValue = null; 
@@ -233,9 +236,6 @@
 		if (value == null && otherValue == null) {
 			return true;	// there are no ids in table
 		}
-		if (value != null && otherValue != null && value.equals(otherValue)) {
-			return true;
-		}
-		return false;
+		return (value != null && otherValue != null && value.equals(otherValue));
 	}
 }
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedHierarchy.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedHierarchy.java
index 9d06d27..03bf48c 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedHierarchy.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedHierarchy.java
@@ -16,12 +16,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.eclipse.osbp.ui.api.datamart.DerivedOlapException;
-
 public class DerivedHierarchy {
 	private org.olap4j.metadata.Hierarchy olapHierarchy;
 	private mondrian.olap.Hierarchy mondrianHierarchy;
-	private DerivedOlapException cxOlapException = new DerivedOlapException("No Hierarchy found!!!!");
 
 	List<DerivedLevel> levelList = new ArrayList<DerivedLevel>();
 	
@@ -39,14 +36,12 @@
 		}
 	}
 
-	public String getName() throws DerivedOlapException{
+	public String getName() {
 		String name = "";
 		if (olapHierarchy!=null){
 			name = olapHierarchy.getName();
 		} else if (mondrianHierarchy!=null){
 			name = mondrianHierarchy.getName();
-		} else {
-			throw cxOlapException;
 		}
 		return name;
 	}
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedMember.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedMember.java
index d71a11e..68ccefe 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedMember.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedMember.java
@@ -13,14 +13,14 @@
  */
 package org.eclipse.osbp.xtext.datamart.common.olap;
 
-import org.eclipse.osbp.ui.api.datamart.DerivedOlapException;
+import mondrian.olap.Member.MemberType;
+import mondrian.olap.type.Type;
 
 public class DerivedMember {
 
 	private org.olap4j.metadata.Member olapMember = null;
 	private mondrian.olap.Member mondrianMember = null;
 	private String taskMember = null;
-	private DerivedOlapException cxOlapException = new DerivedOlapException("No Member found!!!!");
 
 	public DerivedMember(org.olap4j.metadata.Member olapMember) {
 		this.olapMember = olapMember;
@@ -58,7 +58,7 @@
 		return caption;
 	}
 
-	public DerivedHierarchy getHierarchy() throws DerivedOlapException {
+	public DerivedHierarchy getHierarchy() {
 		DerivedHierarchy hierarchy = null;
 		if (olapMember != null) {
 			hierarchy = new DerivedHierarchy(olapMember.getHierarchy());
@@ -81,4 +81,16 @@
 		}
 		return level;
 	}
+	
+	public MemberType getType() {
+		MemberType type = null;
+		if (olapMember != null) {
+			type = MemberType.valueOf(olapMember.getMemberType().name());
+		} else if (mondrianMember != null) {
+			type = mondrianMember.getMemberType();
+		} else {
+			return null;
+		}
+		return type;
+	}
 }
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedPosition.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedPosition.java
index 6107494..de1668b 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedPosition.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/olap/DerivedPosition.java
@@ -18,17 +18,11 @@
 import java.util.ListIterator;
 import java.util.Locale;
 
-import org.eclipse.osbp.ui.api.datamart.DerivedOlapException;
-
 import mondrian.olap.Member;
 
-
-
 public class DerivedPosition {
 	private DerivedCellSet container;
 	private org.olap4j.Position olapPosition = null;
-	private mondrian.olap.Position mondrianPosition = null;
-	private String taskPosition = null;
 	private List<DerivedMember> memberList = new ArrayList<DerivedMember>();
 	private int ordinal;
 	
@@ -44,7 +38,7 @@
 		super();
 		setContainer(container);
 		this.ordinal = ordinal;
-		this.mondrianPosition = mondrianPosition;
+//		this.mondrianPosition = mondrianPosition;
 		for (ListIterator<Member> iterator = mondrianPosition.listIterator();iterator.hasNext();) {
 			mondrian.olap.Member mondrianMember = (mondrian.olap.Member) iterator.next();
 			memberList.add(new DerivedMember(mondrianMember));
@@ -61,7 +55,7 @@
 		super();
 		setContainer(container);
 		this.ordinal = ordinal;
-		this.taskPosition = taskPosition;
+//		this.taskPosition = taskPosition;
 		memberList.add(new DerivedMember(taskPosition));
 	}
 
@@ -104,11 +98,7 @@
 			if (getOrdinal() < 0) {
 				List<String>colHeaders = new ArrayList<String>();
 				DerivedHierarchy hier = null;
-				try {
-					hier = member.getHierarchy();
-				} catch (DerivedOlapException e) {
-					e.printStackTrace();
-				}
+				hier = member.getHierarchy();
 				if (hier != null) {
 		    		for(DerivedLevel lev : hier.getLevels()) {
 	    				if(locale != null) {
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/FillerTextResultSet.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/FillerTextResultSet.java
index daf5bac..9307af0 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/FillerTextResultSet.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/FillerTextResultSet.java
@@ -32,13 +32,11 @@
 import java.sql.Time;
 import java.sql.Timestamp;
 import java.util.Calendar;
-import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 
 import org.eclipse.osbp.xtext.datamart.common.AEntityDatamart;
-
-import org.eclipse.osbp.utils.fillertext.FillerTextProvider;
+import org.eclipse.osbp.xtext.entitymock.common.filler.FillerTextProvider;
 
 public class FillerTextResultSet implements ResultSet {
 
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCell.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCell.java
index 3a6d205..acbc38c 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCell.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCell.java
@@ -84,8 +84,9 @@
 	@Override
 	public Object getValue() {
 		// get rid of the missing bigdecimal implementation of filtertable
+		// changed to int value for mysql as id are type bigdecimal
 		if (fValue instanceof BigDecimal) {
-			return ((BigDecimal)fValue).doubleValue();
+			return ((BigDecimal)fValue).intValue();
 		}
 		return fValue;
 	}
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCellSet.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCellSet.java
index 38bbf38..2fe86d1 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCellSet.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCellSet.java
@@ -15,9 +15,6 @@
 
 import java.io.InputStream;
 import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.net.URL;
 import java.sql.Array;
@@ -36,12 +33,14 @@
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
-import org.jbpm.task.query.TaskSummary;
+import org.eclipse.osbp.bpm.api.BPMTaskSummary;
+import org.eclipse.osbp.dsl.common.datatypes.IDto;
+import org.eclipse.osbp.ui.api.datamart.DatamartPrimary;
+import org.eclipse.osbp.ui.api.datamart.IDataMart.EType;
+import org.eclipse.osbp.xtext.datamart.common.DatamartDtoMapper;
 import org.olap4j.Cell;
 import org.olap4j.CellSet;
 import org.olap4j.CellSetAxis;
@@ -51,26 +50,25 @@
 import org.olap4j.Position;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.commons.lang3.StringUtils;
-import org.eclipse.osbp.dsl.common.datatypes.IDto;
-import org.eclipse.osbp.utils.common.EntityUtils;
-import org.eclipse.osbp.ui.api.datamart.IDataMart.EType;
-import org.eclipse.osbp.xtext.datamart.common.DatamartDtoMapper;
+
+import mondrian.olap.Member;
+import mondrian.olap.Member.MemberType;
+import mondrian.olap.type.Type;
 
 class TaskMetaInfo {
-	String type;
+	MemberType type;
 	Integer ordinal;
 	
-	TaskMetaInfo(String type, Integer ordinal) {
+	TaskMetaInfo(MemberType type, Integer ordinal) {
 		this.type = type;
 		this.ordinal = ordinal;
 	}
 
-	public String getType() {
+	public MemberType getType() {
 		return type;
 	}
 
-	public void setType(String type) {
+	public void setType(MemberType type) {
 		this.type = type;
 	}
 
@@ -90,28 +88,28 @@
 	private final List<CellSetAxis> fAxes;
 	private final List<SqlCellSetAxis> sqlAxes;
 	private final Map<String, TaskMetaInfo> taskMetaData = new HashMap<String, TaskMetaInfo>() {{
-		put("Name", 			new TaskMetaInfo("String", 		0));
-		put("Priority", 		new TaskMetaInfo("Integer", 	1));
-		put("Status", 			new TaskMetaInfo("Integer", 	2));
-		put("Subject", 			new TaskMetaInfo("String", 		3));
-		put("Description", 		new TaskMetaInfo("String", 		4));
-		put("ExpirationTime", 	new TaskMetaInfo("Date", 		5));
-		put("CreatedOn", 		new TaskMetaInfo("Date", 		6));
-		put("CreatedBy", 		new TaskMetaInfo("String", 		7));
-		put("ActivationTime", 	new TaskMetaInfo("Date", 		8));
-		put("ActualOwner", 		new TaskMetaInfo("String", 		9));
-		put("TaskId", 			new TaskMetaInfo("Long", 		10));
-		put("ProcessId",		new TaskMetaInfo("String", 		11));
-		put("ProcessInstanceId",new TaskMetaInfo("Long", 		12));
-		put("ProcessSessionId",	new TaskMetaInfo("Integer",		13));
+		put("Name", 			new TaskMetaInfo(MemberType.REGULAR, 		0));
+		put("Priority", 		new TaskMetaInfo(MemberType.REGULAR, 		1));
+		put("Status", 			new TaskMetaInfo(MemberType.REGULAR, 		2));
+		put("Subject", 			new TaskMetaInfo(MemberType.REGULAR, 		3));
+		put("Description", 		new TaskMetaInfo(MemberType.REGULAR, 		4));
+		put("ExpirationTime", 	new TaskMetaInfo(MemberType.REGULAR, 		5));
+		put("CreatedOn", 		new TaskMetaInfo(MemberType.REGULAR, 		6));
+		put("CreatedBy", 		new TaskMetaInfo(MemberType.REGULAR, 		7));
+		put("ActivationTime", 	new TaskMetaInfo(MemberType.REGULAR, 		8));
+		put("ActualOwner", 		new TaskMetaInfo(MemberType.REGULAR, 		9));
+		put("TaskId", 			new TaskMetaInfo(MemberType.REGULAR, 		10));
+		put("ProcessId",		new TaskMetaInfo(MemberType.REGULAR, 		11));
+		put("ProcessInstanceId",new TaskMetaInfo(MemberType.REGULAR, 		12));
+		put("ProcessSessionId",	new TaskMetaInfo(MemberType.REGULAR,		13));
 	}};
 	
 	private OperativeDtoContainer operativeDtoContainer = null;
 	
-	public SqlCellSet(List<TaskSummary> tasks, HashMap<Integer,ArrayList<String>> axisMap) {
-		fCells = new ArrayList<Cell[]>();
-		fAxes = new ArrayList<CellSetAxis>();
-		sqlAxes = new ArrayList<SqlCellSetAxis>();
+	public SqlCellSet(List<BPMTaskSummary> tasks, HashMap<Integer,ArrayList<String>> axisMap) {
+		fCells = new ArrayList<>();
+		fAxes = new ArrayList<>();
+		sqlAxes = new ArrayList<>();
 		int numColumns = taskMetaData.keySet().size();
 		if (!axisMap.keySet().isEmpty()) {
 			for (int axisNumber : axisMap.keySet()) {
@@ -142,7 +140,7 @@
 		
 		if	(numColumns > 0) {
 			int rowNo = 0;
-			for(TaskSummary task : tasks) {
+			for(BPMTaskSummary task : tasks) {
 				Cell[] row = null;
     			if (!axisMap.keySet().isEmpty()) {
     				int numCols = axisMap.get(0).size();
@@ -160,7 +158,7 @@
 				    		formattedValue = getFormattedValue(task, columnLabel);
 				    		value = getValue(task, columnLabel);
 		    				if (axisMap.keySet().size() > 1 && axisMap.get(1).contains(columnLabel)) {
-		    					sqlAxes.get(1).addPosition(1, rowNo, columnLabel, formattedValue, formattedValue);
+		    					sqlAxes.get(1).addPosition(1, rowNo, taskMetaData.get(columnLabel).getType(), formattedValue, formattedValue);
 		    				}
 		    				else {
 					    		row[ordinal] = new SqlCell(this, rowNo, ordinal, value, formattedValue, false, null);
@@ -179,7 +177,7 @@
 			    	}
     			}
 				if (axisMap.keySet().size() < 2) {
-					sqlAxes.get(1).addPosition(0, rowNo, "", "", "");
+					sqlAxes.get(1).addPosition(0, rowNo, MemberType.NULL, "", "");
 				}
 		    	fCells.add(row);
 		    	rowNo++;
@@ -190,7 +188,7 @@
 		}
 	}
 	
-	private Object getValue(TaskSummary task, String column){
+	private Object getValue(BPMTaskSummary task, String column){
 		switch(column) {
 			case "Name": return task.getName()!=null ?task.getName():"";
 			case "Priority": return task.getPriority();
@@ -199,9 +197,9 @@
 			case "Description": return task.getDescription()!=null?task.getDescription():"";
 			case "ExpirationTime": return task.getExpirationTime();
 			case "CreatedOn": return task.getCreatedOn();
-			case "CreatedBy": return task.getCreatedBy()!=null ? task.getCreatedBy().getId() : "";
+			case "CreatedBy": return task.getCreatedBy()!=null ? task.getCreatedBy() : "";
 			case "ActivationTime": return task.getActivationTime();
-			case "ActualOwner": return task.getActualOwner()!= null ? task.getActualOwner().getId() : "";
+			case "ActualOwner": return task.getActualOwner()!= null ? task.getActualOwner() : "";
 			case "TaskId": return task.getId();
 			case "ProcessId": return task.getProcessId();
 			case "ProcessInstanceId": return task.getProcessInstanceId();
@@ -210,7 +208,7 @@
 		}
 	}
 
-	private String getFormattedValue(TaskSummary task, String column){
+	private String getFormattedValue(BPMTaskSummary task, String column){
 		switch(column) {
 			case "Name": return task.getName();
 			case "Priority":
@@ -231,7 +229,7 @@
 				return null;
 			case "CreatedBy": 
 				if (task.getCreatedBy() != null) {
-					return task.getCreatedBy().toString();
+					return task.getCreatedBy();
 				}
 				return null;
 			case "ActivationTime": 
@@ -241,7 +239,7 @@
 				return null;
 			case "ActualOwner": 
 				if (task.getActualOwner() != null) {
-					return task.getActualOwner().toString();
+					return task.getActualOwner();
 				}
 				return null;
 			case "TaskId": 
@@ -270,11 +268,16 @@
 	}
 
 	
-	public SqlCellSet(ResultSet rs, HashMap<Integer,ArrayList<String>> axisMap, HashMap<String, EType> idMap, DatamartDtoMapper datamartDtoMapper, Class<?> operativeDtoClass, List<IDto> operativeDtos) {
+	public SqlCellSet(ResultSet rs, HashMap<Integer,ArrayList<String>> axisMap, HashMap<String, EType> idMap, DatamartDtoMapper datamartDtoMapper, Class<?> operativeDtoClass, List<IDto> operativeDtos, List<DatamartPrimary<?>> primaryKeys) {
 		operativeDtoContainer = null;
 		fCells = new ArrayList<>();
 		fAxes = new ArrayList<>();
-		sqlAxes = new ArrayList<SqlCellSetAxis>();
+		sqlAxes = new ArrayList<>();
+		Map<String, DatamartPrimary> primaryMap = new HashMap<>();
+		for(DatamartPrimary<?> pr : primaryKeys) {
+			pr.clear();
+			primaryMap.put(pr.getAlias(), pr);
+		}
 		int numColumns = 0;
 		SqlCellSetAxis sqlCellSetAxis = null;
 		try {
@@ -292,7 +295,7 @@
 						for (String columnLabel : axisMap.get(0)) {
 							try {
 								int columnIdx = rs.findColumn(columnLabel);
-								sqlCellSetAxis.addPosition(axisNumber, ordinal, rs.getMetaData().getColumnClassName(columnIdx), rs.getMetaData().getColumnName(columnIdx), rs.getMetaData().getColumnLabel(columnIdx));
+								sqlCellSetAxis.addPosition(axisNumber, ordinal, convertToMemberType(rs, columnIdx), rs.getMetaData().getColumnName(columnIdx), rs.getMetaData().getColumnLabel(columnIdx));
 								ordinal ++;
 							} catch (SQLException e) {}
 						}
@@ -303,7 +306,7 @@
 			else {
 				sqlCellSetAxis = new SqlCellSetAxis(this, 0);
 				for (int idx=1; idx<=numColumns; idx++) {
-					sqlCellSetAxis.addPosition(0, idx-1, rs.getMetaData().getColumnClassName(idx), rs.getMetaData().getColumnName(idx), rs.getMetaData().getColumnLabel(idx));
+					sqlCellSetAxis.addPosition(0, idx-1, convertToMemberType(rs, idx), rs.getMetaData().getColumnName(idx), rs.getMetaData().getColumnLabel(idx));
 				}
 				sqlAxes.add(sqlCellSetAxis);
 			}
@@ -328,7 +331,7 @@
 					boolean displayRow = true;
 					if	(operativeDtoContainer.getOperativeDtoIdColumn() != null) {
 						int columnIdx = rs.findColumn(operativeDtoContainer.getOperativeDtoIdColumn());
-			    		Object value = rs.getObject(columnIdx);
+			    		Object value = getCastedValue(rs, columnIdx);
 			    		displayRow = (operativeDtoContainer.getOperativeDtoForId(value) != null);
 					}
 					if	(displayRow) {
@@ -356,9 +359,12 @@
 									try {
 										int columnIdx = rs.findColumn(columnLabel);
 							    		formattedValue = getFormattedValue(rs, columnIdx);
-							    		value = rs.getObject(columnIdx);
+							    		value = getCastedValue(rs, columnIdx);
+										if(primaryMap.containsKey(columnLabel)) {
+											primaryMap.get(columnLabel).add(value);
+										}
 					    				if (axisMap.keySet().size() > 1 && axisMap.get(1).contains(columnLabel)) {
-					    					sqlAxes.get(1).addPosition(1, targetRowNo, columnLabel, formattedValue, formattedValue);
+					    					sqlAxes.get(1).addPosition(1, targetRowNo, convertToMemberType(rs, columnIdx), formattedValue, columnLabel);
 					    				}
 					    				else {
 								    		row[ordinal] = new SqlCell(this, targetRowNo, ordinal, value, formattedValue, isId(columnLabel, idMap), getType(columnLabel, idMap));
@@ -372,13 +378,16 @@
 					    	for (int idx=1; idx<=numColumns; idx++) {
 					    		String columnLabel = rs.getMetaData().getColumnLabel(idx);
 					    		formattedValue = getFormattedValue(rs, idx);
-					    		value = rs.getObject(idx);
+					    		value = getCastedValue(rs, idx);
+								if(primaryMap.containsKey(columnLabel)) {
+									primaryMap.get(columnLabel).add(value);
+								}
 					    		row[colNo] = new SqlCell(this, targetRowNo, colNo, value, formattedValue, isId(columnLabel, idMap), getType(columnLabel, idMap));
 					    		colNo ++;
 					    	}
 		    			}
 						if (axisMap.keySet().size() < 2) {
-							sqlAxes.get(1).addPosition(0, targetRowNo, "", "", "");
+							sqlAxes.get(1).addPosition(0, targetRowNo, MemberType.NULL, "", "");
 						}
 				    	fCells.add(row);
 				    	targetRowNo++;
@@ -394,9 +403,105 @@
 		}
 	}
 	
+	private MemberType convertToMemberType(ResultSet rs, int idx) {
+		int type;
+		int scale;
+		try {
+			type = rs.getMetaData().getColumnType(idx);
+			scale = rs.getMetaData().getScale(idx);
+		} catch (SQLException e) {
+			return null;
+		}
+		
+		switch (type) {
+		case java.sql.Types.DATE:
+		case java.sql.Types.TIME:
+		case java.sql.Types.TIMESTAMP:
+			return Member.MemberType.REGULAR;
+		case java.sql.Types.TINYINT:
+		case java.sql.Types.SMALLINT:
+		case java.sql.Types.BIGINT:
+		case java.sql.Types.INTEGER:
+		case java.sql.Types.BOOLEAN:
+		case java.sql.Types.BIT:
+			return Member.MemberType.UNKNOWN;
+		case java.sql.Types.NUMERIC:
+			if(scale == 0) {
+				return Member.MemberType.UNKNOWN;
+			}
+			return Member.MemberType.MEASURE;
+		case java.sql.Types.DECIMAL:
+		case java.sql.Types.DOUBLE:
+		case java.sql.Types.FLOAT:
+		case java.sql.Types.REAL:
+			return Member.MemberType.MEASURE;
+		case java.sql.Types.CHAR:
+		case java.sql.Types.NCHAR:
+		case java.sql.Types.NVARCHAR:
+		case java.sql.Types.VARCHAR:
+		case java.sql.Types.LONGVARCHAR: 
+			return Member.MemberType.REGULAR;
+		default:
+			return Member.MemberType.UNKNOWN;
+		}
+	}
+
 	public OperativeDtoContainer getOperativeDtoContainer() {
 		return operativeDtoContainer;
 	}
+
+	private Object getCastedValue(ResultSet rs, int idx) throws SQLException {
+		int type = rs.getMetaData().getColumnType(idx);
+		int scale = rs.getMetaData().getScale(idx);
+		
+		switch (type) {
+		case java.sql.Types.DATE:
+			return rs.getDate(idx);
+		case java.sql.Types.TIME:
+			return rs.getTime(idx);
+		case java.sql.Types.TIMESTAMP:
+			return rs.getTimestamp(idx);
+		case java.sql.Types.TINYINT:
+		case java.sql.Types.SMALLINT:
+			return rs.getShort(idx);
+		case java.sql.Types.BIGINT:
+			return rs.getBigDecimal(idx);
+		case java.sql.Types.INTEGER:
+		case java.sql.Types.BOOLEAN:
+		case java.sql.Types.BIT:
+			return (int) rs.getInt(idx);
+		case java.sql.Types.NUMERIC:
+			if(scale == 0) {
+				return rs.getInt(idx);
+			}
+			return rs.getDouble(idx);
+		case java.sql.Types.DECIMAL:
+		case java.sql.Types.DOUBLE:
+		case java.sql.Types.REAL:
+			return rs.getDouble(idx);
+		case java.sql.Types.FLOAT:
+			return (double) rs.getFloat(idx);
+		case java.sql.Types.CHAR:
+		case java.sql.Types.NCHAR:
+		case java.sql.Types.NVARCHAR:
+		case java.sql.Types.VARCHAR:
+		case java.sql.Types.LONGVARCHAR: 
+			return rs.getString(idx);
+		case java.sql.Types.BLOB:
+			return rs.getBlob(idx);
+		case java.sql.Types.CLOB:
+			return rs.getClob(idx);
+		case java.sql.Types.NCLOB:
+			return rs.getNClob(idx);
+		case java.sql.Types.DATALINK:
+			return rs.getCharacterStream(idx);
+		case java.sql.Types.SQLXML:
+			return rs.getSQLXML(idx);
+		case java.sql.Types.ROWID:
+			return rs.getRowId(idx);
+		}
+		return null;
+	}
 	
 	private String getFormattedValue(ResultSet rs, int idx) throws SQLException {
 		int type = rs.getMetaData().getColumnType(idx);
@@ -414,11 +519,13 @@
     		case java.sql.Types.INTEGER:
     		case java.sql.Types.BIGINT:
     		case java.sql.Types.BOOLEAN:
+    		case java.sql.Types.BIT:
+    		case java.sql.Types.NUMERIC:
    				formattedValue = Integer.toString(rs.getInt(idx));
     			break;
     		case java.sql.Types.DECIMAL:
-    		case java.sql.Types.NUMERIC:
     		case java.sql.Types.DOUBLE:
+    		case java.sql.Types.REAL:
     			formattedValue = Double.toString(rs.getDouble(idx));
     			break;
     		case java.sql.Types.FLOAT:
@@ -428,6 +535,7 @@
     		case java.sql.Types.NCHAR:
     		case java.sql.Types.NVARCHAR:
     		case java.sql.Types.VARCHAR:
+    		case java.sql.Types.LONGVARCHAR: 
     			formattedValue = rs.getString(idx);
     			break;
     		case java.sql.Types.BLOB:
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCellSetAxis.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCellSetAxis.java
index 0ed030c..1bbba24 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCellSetAxis.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlCellSetAxis.java
@@ -24,6 +24,8 @@
 import org.olap4j.Position;
 import org.olap4j.metadata.Hierarchy;
 
+import mondrian.olap.Member.MemberType;
+
 public class SqlCellSetAxis implements CellSetAxis {
 
 	private final CellSet fCellSet;
@@ -42,20 +44,21 @@
 		fHierarchy = null;
 	}
 	
-	public SqlCellSetAxis(CellSet cellSet, int axisOrdinal, String type, String name, String label) {
+	public SqlCellSetAxis(CellSet cellSet, int axisOrdinal, MemberType type, String name, String label) {
 		this(cellSet, axisOrdinal);
 		addPosition(axisOrdinal, 0, type, name, label);
 	}
 
-	public void addPosition(int axis, int ordinal, String type, String name, String label) {
+	public void addPosition(int axis, int ordinal, MemberType type, String name, String label) {
 		for (Position pos : fPositions){
 			if (pos.getOrdinal() == ordinal) {
 				if (axis == 1) { // the row values must be qualified for later decomposition
-					if (pos.getMembers().size() == 0) {
-						pos.getMembers().add(new SqlMember(type, "["+name+"]", label, fHierarchy));
+					if (pos.getMembers().isEmpty()) {
+						pos.getMembers().add(new SqlMember(type, name, label, fHierarchy));
 					}
 					else {
-						((SqlMember)pos.getMembers().get(0)).appendLevel(type, name);
+
+						((SqlMember)pos.getMembers().get(0)).appendLevel(type, name, label);
 					}
 				}
 				else {
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlLevel.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlLevel.java
index 8549c93..ff41891 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlLevel.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlLevel.java
@@ -36,14 +36,12 @@
 
 	@Override
 	public String getCaption() {
-		// TODO Auto-generated method stub
-		return null;
+		return fName;
 	}
 
 	@Override
 	public String getDescription() {
-		// TODO Auto-generated method stub
-		return null;
+		return fName;
 	}
 
 	@Override
@@ -53,8 +51,7 @@
 
 	@Override
 	public String getUniqueName() {
-		// TODO Auto-generated method stub
-		return null;
+		return fName;
 	}
 
 	@Override
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlMember.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlMember.java
index 66e0ee2..babe940 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlMember.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlMember.java
@@ -24,44 +24,46 @@
 import org.olap4j.metadata.NamedList;
 import org.olap4j.metadata.Property;
 
+import mondrian.olap.Member.MemberType;
+
 public class SqlMember implements Member {
 
-	private String fType;
+	private MemberType fType;
 	private String fName;
 	private final String fCaption;
 	private Hierarchy fHierarchy;
 
-	public SqlMember(String type, String name, String label, Hierarchy hierarchy) {
+	public SqlMember(MemberType type, String name, String label, Hierarchy hierarchy) {
 		fType = type;
-		fName = name;
+		fName = "[" + name + "]";
 		fCaption = label;
 		fHierarchy = hierarchy;
 		for (Level level : fHierarchy.getLevels()) {
-			if (level.getName().equals(type)) {
+			if (level.getName().equals(label)) {
 				return;
 			}
 		}
 		// if (fHierarchy.getLevels().size() == 0) {
 		// fHierarchy.getLevels().add(new SqlLevel("(All)"));
 		// }
-		fHierarchy.getLevels().add(new SqlLevel(type));
+		fHierarchy.getLevels().add(new SqlLevel(label));
 	}
 
-	public void appendLevel(String type, String name) {
+	public void appendLevel(MemberType type, String name, String label) {
 		fName += ".[" + name + "]";
 		for (Level level : fHierarchy.getLevels()) {
-			if (level.getName().equals(type)) {
+			if (level.getName().equals(label)) {
 				return;
 			}
 		}
-		fHierarchy.getLevels().add(new SqlLevel(type));
+		fHierarchy.getLevels().add(new SqlLevel(label));
 	}
 
 	public void setName(String name) {
-		fName = name;
+		fName = "[" + name + "]";
 	}
 
-	public void setType(String type) {
+	public void setType(MemberType type) {
 		fType = type;
 	}
 
@@ -147,8 +149,7 @@
 
 	@Override
 	public Type getMemberType() {
-		// TODO Auto-generated method stub
-		return null;
+		return Type.valueOf(fType.name());
 	}
 
 	@Override
diff --git a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlPosition.java b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlPosition.java
index 8e385a4..e142155 100644
--- a/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlPosition.java
+++ b/org.eclipse.osbp.xtext.datamart.common/src/org/eclipse/osbp/xtext/datamart/common/sql/SqlPosition.java
@@ -20,18 +20,20 @@
 import org.olap4j.metadata.Hierarchy;
 import org.olap4j.metadata.Member;
 
+import mondrian.olap.Member.MemberType;
+
 public class SqlPosition implements Position {
 
 	private final int fOrdinal;
 	private final List<Member> fMembers;
 	private Hierarchy fHierarchy;
 	
-	protected SqlPosition(int ordinal, String type, String name, String label, Hierarchy hierarchy) {
+	protected SqlPosition(int ordinal, MemberType type, String name, String label, Hierarchy hierarchy) {
 		fOrdinal = ordinal;
 		fMembers = new ArrayList<>();
 		fHierarchy = hierarchy;
-		if (type.length()>0) {
-			fMembers.add(new SqlMember(type, "["+name+"]", label, fHierarchy));
+		if(!name.isEmpty()) {
+			fMembers.add(new SqlMember(type, name, label, fHierarchy));
 		}
 	}