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 b18683d..57f9e3f 100644
--- a/org.eclipse.osbp.xtext.datamart.common/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.xtext.datamart.common/META-INF/MANIFEST.MF
@@ -5,7 +5,7 @@
 Bundle-Vendor: Eclipse OSBP
 Bundle-Version: 0.9.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Require-Bundle: mondrian.osgi;bundle-version="[3.5.0,3.5.1)",
+Require-Bundle: mondrian.osgi;bundle-version="[3.5.0,4.0.0)",
  olap4j.osgi;bundle-version="[1.1.0,1.3.0)",
  org.jsoup;bundle-version="1.8.1",
  org.eclipse.core.runtime,
@@ -32,6 +32,7 @@
  org.eclipse.osbp.preferences;version="0.9.0",
  org.eclipse.osbp.runtime.common.i18n;version="0.9.0",
  org.eclipse.osbp.ui.api.datamart;version="0.9.0",
+ org.eclipse.osbp.ui.api.date;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",
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 e980d3d..d8fe54a 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
@@ -26,7 +26,7 @@
 @SuppressWarnings("all")
 public abstract class ACubeDatamart extends ADatamart<RolapConnection> {
 
-	public abstract DerivedCellSet getResults(final Class operativeDtoClass, final List<IDto> operativeDtos);
+	public abstract DerivedCellSet getResults();
 	@Override
 	public final Map<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 71db7f4..86a91f9 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
@@ -27,6 +27,7 @@
 import org.eclipse.osbp.ui.api.datamart.DatamartFilter;
 import org.eclipse.osbp.ui.api.datamart.DatamartFilter.FilterType;
 import org.eclipse.osbp.ui.api.datamart.IDataMart;
+import org.eclipse.osbp.ui.api.datamart.IDatamartBetweenInput;
 
 /**
  * The Class ADatamart.
@@ -123,6 +124,16 @@
     	return filter.getSql();
     }
     
+     /**
+     * Calls the vendor specific 'to date' sql method.
+     *
+     * @param date the date
+     * @return the vendor 'to date' sql method prefix
+     */
+    protected String vendorConvertToDateSQL( java.util.Date date ) {
+    	return vendorConvertToDateSQL(new Date(date.getTime()));
+    }
+    
     /**
      * Calls the vendor specific 'to date' sql method.
      *
@@ -135,7 +146,7 @@
     	}
     	return "to_date('"+date.toString().replace(".0","")+"','YYYY-MM-DD HH24:MI:SS')";
     }
-
+    
     /**
      * Gets the vendor specific 'to date' sql method prefix.
      *
@@ -232,7 +243,15 @@
 				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() + "'");
+								
+							if (filter.getBetweenInputComponent() instanceof DatamartBetweenDate) {
+								String betweenFrom = vendorConvertToDateSQL(((DatamartBetweenDate)filter.getBetweenInputComponent()).getFromInput().getValue());
+								String betweenUntil = vendorConvertToDateSQL(((DatamartBetweenDate)filter.getBetweenInputComponent()).getUntilInput().getValue());
+								filter.setCondition(filter.getName() + " BETWEEN " + betweenFrom + " AND " + betweenUntil);
+							} else {
+								filter.setCondition(filter.getName() + " BETWEEN '" + filter.getBetweenInputComponent().getFrom() + "' AND '" + filter.getBetweenInputComponent().getUntil() + "'");
+							}
+							
 						} else {
 							filter.setCondition("1=1");
 						}
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 4c90dbc..d6da6e0 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
@@ -25,5 +25,6 @@
 
 @SuppressWarnings("all")
 public abstract class AEntityDatamart extends ADatamart<Connection> {
-	public abstract DerivedCellSet getResults(Class operativeDtoClass, List<IDto> operativeDtos);
+	public abstract DerivedCellSet getResults();
+	public abstract DerivedCellSet getResults(boolean limited, Class operativeDtoClass, List<IDto> operativeDtos);
 }
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 631494f..8a741bc 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
@@ -112,7 +112,9 @@
 	 */
 	@Override
 	public void addFilterChangeListener(FilterChangeListener listener) {
-		listeners.add(listener);
+		if(!listeners.contains(listener)) {
+			listeners.add(listener);
+		}
 	}
 	
 	/* (non-Javadoc)
@@ -120,7 +122,9 @@
 	 */
 	@Override
 	public void removeFilterChangeListener(FilterChangeListener listener) {
-		listeners.remove(listener);
+		if(listeners.contains(listener)) {
+			listeners.remove(listener);
+		}
 	}
 
 	/* (non-Javadoc)
@@ -157,18 +161,16 @@
 			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(event.getTopic().endsWith(filter.getShortName())) {
 						if(id instanceof Integer) {
 							filter.setSql(((Integer)id).toString());
 						} else if (id instanceof String) {
 							filter.setSql("'"+(String)id+"'");
+						} else {
+							filter.setSql("");
 						}
-						
-					} else {
-						filter.setSql("");
+						mustRefresh = true;
 					}
-					mustRefresh = true;
 				}
 				break;
 			case SINGLE:
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 4ac74f6..4b1f134 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
@@ -26,6 +26,7 @@
 import java.sql.NClob;
 import java.sql.Ref;
 import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
 import java.sql.RowId;
 import java.sql.SQLException;
 import java.sql.SQLWarning;
@@ -47,6 +48,8 @@
 import org.eclipse.osbp.ui.api.datamart.IDataMart;
 import org.eclipse.osbp.ui.api.datamart.IDataMart.AttributeVisibility;
 import org.eclipse.osbp.ui.api.datamart.IDataMart.EType;
+import org.eclipse.osbp.ui.api.date.SimpleDateFormatter;
+import org.eclipse.osbp.ui.api.user.IUser;
 import org.eclipse.osbp.ui.api.useraccess.AbstractAuthorization.Action;
 import org.eclipse.osbp.ui.api.useraccess.AbstractAuthorization.Group;
 import org.eclipse.osbp.ui.api.useraccess.IUserAccessService;
@@ -115,7 +118,7 @@
 	
 	private OperativeDtoContainer operativeDtoContainer = null;
 	private IUserAccessService userAccessService;
-
+	private long numRowsFetched = 0L;
 	private Map<String, Boolean> columnIsVisible = new HashMap<>();
 	
 	public SqlCellSet(List<BPMTaskSummary> tasks, Map<Integer,ArrayList<String>> axisMap) {
@@ -149,7 +152,7 @@
 			SqlCellSetAxis sqlCellSetAxis = new SqlCellSetAxis(this, 1);
 			sqlAxes.add(sqlCellSetAxis);
 		}
-		
+		numRowsFetched = 0;
 		if	(numColumns > 0) {
 			int rowNo = 0;
 			for(BPMTaskSummary task : tasks) {
@@ -193,6 +196,7 @@
 				}
 		    	fCells.add(row);
 		    	rowNo++;
+		    	numRowsFetched ++;
 			}
 			for(SqlCellSetAxis axis : sqlAxes) {
 				fAxes.add(axis);
@@ -279,7 +283,7 @@
 		return null;
 	}
 
-	public SqlCellSet(ResultSet rs, Map<Integer,ArrayList<String>> axisMap, Map<String, EType> idMap,  Map<String, String> aliasMap,  Map<String, IDataMart.AttributeVisibility> hiddenMap, DatamartDtoMapper datamartDtoMapper, Class<?> operativeDtoClass, List<IDto> operativeDtos, List<DatamartPrimary<?>> primaryKeys, IUserAccessService pUserAccessService) { //NOSONAR
+	public SqlCellSet(ResultSet rs, ResultSetMetaData metaData, IUser user, Map<String, String> resultAttributes, Map<Integer,ArrayList<String>> axisMap, Map<String, EType> idMap,  Map<String, String> aliasMap,  Map<String, IDataMart.AttributeVisibility> hiddenMap, DatamartDtoMapper datamartDtoMapper, Class<?> operativeDtoClass, List<IDto> operativeDtos, List<DatamartPrimary<?>> primaryKeys, IUserAccessService pUserAccessService) { //NOSONAR
 		fCells = new ArrayList<>();
 		fAxes = new ArrayList<>();
 		sqlAxes = new ArrayList<>();
@@ -294,7 +298,7 @@
 		SqlCellSetAxis sqlCellSetAxis = null;
 		try {
 			if(!rs.isClosed()) {
-				numColumns = rs.getMetaData().getColumnCount();
+				numColumns = metaData.getColumnCount();
 			}
 		} catch (SQLException e) {
 			LOGGER.error(e.getLocalizedMessage());
@@ -310,7 +314,7 @@
 							for (String columnLabel : axisMap.get(0)) {
 								try {
 									int columnIdx = rs.findColumn(columnLabel);
-									sqlCellSetAxis.addPosition(axisNumber, ordinal, convertToMemberType(rs, columnIdx), rs.getMetaData().getColumnName(columnIdx), rs.getMetaData().getColumnLabel(columnIdx));
+									sqlCellSetAxis.addPosition(axisNumber, ordinal, convertToMemberType(rs, metaData, columnIdx), metaData.getColumnName(columnIdx), metaData.getColumnLabel(columnIdx));
 									ordinal ++;
 								} catch (SQLException e) {}
 							}
@@ -321,7 +325,7 @@
 				else {
 					sqlCellSetAxis = new SqlCellSetAxis(this, 0);
 					for (int idx=1; idx<=numColumns; idx++) {
-						sqlCellSetAxis.addPosition(0, idx-1, convertToMemberType(rs, idx), rs.getMetaData().getColumnName(idx), rs.getMetaData().getColumnLabel(idx));
+						sqlCellSetAxis.addPosition(0, idx-1, convertToMemberType(rs, metaData, idx), metaData.getColumnName(idx), metaData.getColumnLabel(idx));
 					}
 					sqlAxes.add(sqlCellSetAxis);
 				}
@@ -335,19 +339,22 @@
 			sqlCellSetAxis = new SqlCellSetAxis(this, 1);
 			sqlAxes.add(sqlCellSetAxis);
 		}
-		
+		numRowsFetched = 0;
 		if	(numColumns > 0) {
 			try {
 				if(!rs.isClosed()) {
 					int targetRowNo = 0;
 					while (rs.next()) {
+						if(resultAttributes.isEmpty()) {
+							registerFirstLine(rs, metaData, user, resultAttributes);
+						}
 						if	(operativeDtoContainer == null) {
 							operativeDtoContainer = new OperativeDtoContainer(datamartDtoMapper, operativeDtoClass, operativeDtos);
 						}
 						boolean displayRow = true;
 						if	(operativeDtoContainer.getOperativeDtoIdColumn() != null) {
 							int columnIdx = rs.findColumn(operativeDtoContainer.getOperativeDtoIdColumn());
-				    		Object value = getCastedValue(rs, columnIdx);
+				    		Object value = getCastedValue(rs, metaData, columnIdx);
 				    		displayRow = (operativeDtoContainer.getOperativeDtoForId(value) != null);
 						}
 						if	(displayRow) {
@@ -355,7 +362,7 @@
 			    			if (axisMap.keySet().size() > 1) {
 			    				int numCols = 0;
 						    	for (int idx=1; idx<=numColumns; idx++) {
-						    		String columnName = rs.getMetaData().getColumnName(idx).toLowerCase();
+						    		String columnName = metaData.getColumnName(idx).toLowerCase();
 						    		if (!axisMap.get(1).contains(columnName)) {
 						    			numCols ++;
 						    		}
@@ -377,15 +384,15 @@
 											formattedValue = "";
 											value = null;
 											if (isColumnVisible(aliasMap, hiddenMap, columnLabel )) {
-												formattedValue = getFormattedValue(rs, columnIdx);
-												value = getCastedValue(rs, columnIdx);
+												formattedValue = getFormattedValue(rs, metaData, columnIdx);
+												value = getCastedValue(rs, metaData, 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, convertToMemberType(rs, columnIdx), formattedValue, columnLabel);
+						    					sqlAxes.get(1).addPosition(1, targetRowNo, convertToMemberType(rs, metaData, columnIdx), formattedValue, columnLabel);
 						    				}
 						    				else {
 									    		row[ordinal] = new SqlCell(this, targetRowNo, ordinal, value, formattedValue, isId(columnLabel, idMap), getType(idMap));
@@ -397,13 +404,13 @@
 			    			}
 							else {
 						    	for (int columnIdx=1; columnIdx<=numColumns; columnIdx++) {
-						    		String columnLabel = rs.getMetaData().getColumnLabel(columnIdx);
+						    		String columnLabel = metaData.getColumnLabel(columnIdx);
 									formattedValue = "";
 									value = null;
 									if (isColumnVisible(aliasMap, hiddenMap, columnLabel)){
 										
-										formattedValue = getFormattedValue(rs, columnIdx);
-										value = getCastedValue(rs, columnIdx);
+										formattedValue = getFormattedValue(rs, metaData, columnIdx);
+										value = getCastedValue(rs, metaData, columnIdx);
 									}
 									if(primaryMap.containsKey(columnLabel)) {
 										primaryMap.get(columnLabel).add(value);
@@ -417,6 +424,7 @@
 							}
 					    	fCells.add(row);
 					    	targetRowNo++;
+					    	numRowsFetched ++;
 						}
 					}
 				}
@@ -457,12 +465,12 @@
 		return retColumnIsVisible;
 	}
 
-	private MemberType convertToMemberType(ResultSet rs, int idx) {
+	private MemberType convertToMemberType(ResultSet rs, ResultSetMetaData metaData, int idx) {
 		int type;
 		int scale;
 		try {
-			type = rs.getMetaData().getColumnType(idx);
-			scale = rs.getMetaData().getScale(idx);
+			type = metaData.getColumnType(idx);
+			scale = metaData.getScale(idx);
 		} catch (SQLException e) {
 			return null;
 		}
@@ -505,9 +513,9 @@
 		return operativeDtoContainer;
 	}
 
-	private Object getCastedValue(ResultSet rs, int idx) throws SQLException {
-		int type = rs.getMetaData().getColumnType(idx);
-		int scale = rs.getMetaData().getScale(idx);
+	private Object getCastedValue(ResultSet rs, ResultSetMetaData metaData, int idx) throws SQLException {
+		int type = metaData.getColumnType(idx);
+		int scale = metaData.getScale(idx);
 		
 		switch (type) {
 		case java.sql.Types.DATE:
@@ -560,8 +568,8 @@
 		return null;
 	}
 	
-	private String getFormattedValue(ResultSet rs, int idx) throws SQLException {
-		int type = rs.getMetaData().getColumnType(idx);
+	private String getFormattedValue(ResultSet rs, ResultSetMetaData metaData, int idx) throws SQLException {
+		int type = metaData.getColumnType(idx);
 		String formattedValue = "";
 		switch (type) {
     		case java.sql.Types.DATE:
@@ -1899,4 +1907,56 @@
 		return null;
 	}
 
+	public void registerFirstLine(ResultSet rs, ResultSetMetaData metaData, IUser user, Map<String, String> resultAttributes) throws SQLException {
+		for (int column = 1; column <= metaData.getColumnCount(); column++) {
+			int type = metaData.getColumnType(column);
+			switch (type) {
+			case java.sql.Types.DATE:
+				if (rs.getDate(column) != null) {
+					if (user == null) {
+						resultAttributes.put(metaData.getColumnName(column), rs.getDate(column).toString());
+					} else {
+						resultAttributes.put(metaData.getColumnName(column), SimpleDateFormatter
+								.getFormat("LONGDATE", user.getLocale()).format(rs.getDate(column)));
+					}
+				}
+				break;
+			case java.sql.Types.TIMESTAMP:
+				if (rs.getTimestamp(column) != null) {
+					if (user == null) {
+						resultAttributes.put(metaData.getColumnName(column),
+								rs.getTimestamp(column).toString());
+					} else {
+						resultAttributes.put(metaData.getColumnName(column), SimpleDateFormatter
+								.getFormat("LONGDATE", user.getLocale()).format(rs.getTimestamp(column)));
+					}
+				}
+				break;
+			case java.sql.Types.DECIMAL:
+				if (rs.getBigDecimal(column) != null) {
+					resultAttributes.put(metaData.getColumnName(column),
+							rs.getBigDecimal(column).toPlainString());
+				}
+				break;
+			case java.sql.Types.NUMERIC:
+			case java.sql.Types.DOUBLE:
+				resultAttributes.put(metaData.getColumnName(column), Double.toString(rs.getDouble(column)));
+				break;
+			case java.sql.Types.FLOAT:
+				resultAttributes.put(metaData.getColumnName(column), Float.toString(rs.getFloat(column)));
+				break;
+			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:
+				resultAttributes.put(metaData.getColumnName(column), rs.getString(column));
+				break;
+			}
+		}
+	}
+	
+	public long getFetchedRows() {
+		return numRowsFetched;
+	}
 }
