diff --git a/org.eclipse.osbp.preferences.feature/.project b/org.eclipse.osbp.preferences.feature/.project
index 40209d6..90ed8d8 100644
--- a/org.eclipse.osbp.preferences.feature/.project
+++ b/org.eclipse.osbp.preferences.feature/.project
@@ -16,12 +16,12 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<name>org.sonarlint.eclipse.core.sonarlintBuilder</name>
 			<arguments>
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.sonarlint.eclipse.core.sonarlintBuilder</name>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
 		</buildCommand>
diff --git a/org.eclipse.osbp.preferences.feature/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.preferences.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
index 0933f8c..19e3115 100644
--- a/org.eclipse.osbp.preferences.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
+++ b/org.eclipse.osbp.preferences.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -1,4 +1,5 @@
 //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
diff --git a/org.eclipse.osbp.preferences.ui.page/src/org/eclipse/osbp/preferences/ui/data/ProductConfigurationStore.java b/org.eclipse.osbp.preferences.ui.page/src/org/eclipse/osbp/preferences/ui/data/ProductConfigurationStore.java
index 29808fa..f005248 100644
--- a/org.eclipse.osbp.preferences.ui.page/src/org/eclipse/osbp/preferences/ui/data/ProductConfigurationStore.java
+++ b/org.eclipse.osbp.preferences.ui.page/src/org/eclipse/osbp/preferences/ui/data/ProductConfigurationStore.java
@@ -75,7 +75,7 @@
 		for	(IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
 			if	(project.isOpen()) {
 				IResource resource = ProductConfigurationPrefs.getPrefsFile(project);
-				if	((resource != null) && resource.exists()) {
+				if	(resource != null) {
 					availableProductProjects.put(project.getName(), project);
 				}
 			}
@@ -181,7 +181,7 @@
 	}
 	
 	public String[][] getDataSourcesSelectItems() {
-		String[] dataSourceNames = new TreeSet<String>(prefs.getDataSourceNames()).toArray(new String[0]);
+		String[] dataSourceNames = new TreeSet<>(prefs.getDataSourceNames()).toArray(new String[0]);
 		String[][] namesValues = new String[dataSourceNames.length][2];
 		for	(int i = 0; i < dataSourceNames.length; i++) {
 			namesValues[i][0] = dataSourceNames[i];
@@ -369,7 +369,6 @@
 			case EXCHANGE_RATES_EURO_BASED_PREVIOUS: return prefsUsed.getEuroXRefRatesURLPrevious();
 			case JAVA_POS_CONFIGURATION: return prefsUsed.getJavaPosConfiguration();
 			case DATAINTERCHANGE_CONFIGURATION: return prefsUsed.getDatainterchangeConfiguration();
-			case SIGNAL_CONFIGURATION: return prefsUsed.getSignalConfiguration();
 			case FILE_CONTENT: return getFileContent();
 			case LOCALIZATION_SUPPORTED_LANGUAGES: return getSupportedLanguages(prefsUsed);
 			case DATASOURCES: return DataSourceConfiguration.serialize(prefsUsed.getDataSources());
@@ -437,7 +436,6 @@
 			case EXCHANGE_RATES_EURO_BASED_PREVIOUS: prefs.setEuroForeignExchangeReferenceRatesURLPrevious(value); return;
 			case JAVA_POS_CONFIGURATION: prefs.setJavaPosConfiguration(value); return;
 			case DATAINTERCHANGE_CONFIGURATION: prefs.setDatainterchangeConfiguration(value); return;
-			case SIGNAL_CONFIGURATION: prefs.setSignalConfiguration(value); return;
 			case FILE_CONTENT: return;
 			case FILE_LOCATION: return;
 			case FILE_NAME: return;
diff --git a/org.eclipse.osbp.preferences.ui.page/src/org/eclipse/osbp/preferences/ui/page/PreferencePageDemo.java b/org.eclipse.osbp.preferences.ui.page/src/org/eclipse/osbp/preferences/ui/page/PreferencePageDemo.java
index 416f4b2..38558af 100644
--- a/org.eclipse.osbp.preferences.ui.page/src/org/eclipse/osbp/preferences/ui/page/PreferencePageDemo.java
+++ b/org.eclipse.osbp.preferences.ui.page/src/org/eclipse/osbp/preferences/ui/page/PreferencePageDemo.java
@@ -33,9 +33,9 @@
 		return new Item[] {
 			new Item(Type.TEXT, Preference.SHOW_PRODUCT_CONFIGURATION, "Product Configuration", false),
 			new Item(""),
-//			new Item(Type.BOOLEAN, Preference.DEMO_TOOLS_THEME, "Enable theme selection"),
+			new Item(Type.BOOLEAN, Preference.DEMO_TOOLS_THEME, "Enable theme selection", false),
 //			new Item(Type.BOOLEAN, Preference.DEMO_TOOLS_STRATEGY, "Enable layout-strategy selection"),
-//			new Item(Type.BOOLEAN, Preference.DEMO_TOOLS_LANGUAGE, "Enable language/country selection"),
+			new Item(Type.BOOLEAN, Preference.DEMO_TOOLS_LANGUAGE, "Enable language/country selection", false),
 			new Item(Type.BOOLEAN, Preference.DEMO_TOOLS_PRINTSERVICE, "Enable print service selection"),
 		};
 	}
diff --git a/org.eclipse.osbp.preferences.ui.page/src/org/eclipse/osbp/preferences/ui/page/PreferencePageExternalDataSources.java b/org.eclipse.osbp.preferences.ui.page/src/org/eclipse/osbp/preferences/ui/page/PreferencePageExternalDataSources.java
index 8394f4d..be98230 100644
--- a/org.eclipse.osbp.preferences.ui.page/src/org/eclipse/osbp/preferences/ui/page/PreferencePageExternalDataSources.java
+++ b/org.eclipse.osbp.preferences.ui.page/src/org/eclipse/osbp/preferences/ui/page/PreferencePageExternalDataSources.java
@@ -17,7 +17,6 @@
 import java.util.regex.Pattern;
 
 import org.eclipse.jface.preference.FieldEditor;
-
 import org.eclipse.osbp.preferences.Preference;
 import org.eclipse.osbp.preferences.ui.component.APreferencePage;
 import org.eclipse.osbp.preferences.ui.component.Item;
@@ -47,8 +46,6 @@
 			new Item("DataInterchange Settings"),
 			new Item(Type.TEXT, Preference.DATAINTERCHANGE_CONFIGURATION, "Configuration file"),
 			new Item(""),
-			new Item("Signal Settings"),
-			new Item(Type.TEXT, Preference.SIGNAL_CONFIGURATION, "Configuration file"),
 		};
 	}
 
diff --git a/org.eclipse.osbp.preferences/META-INF/MANIFEST.MF b/org.eclipse.osbp.preferences/META-INF/MANIFEST.MF
index d9575b6..f9bffb7 100644
--- a/org.eclipse.osbp.preferences/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.preferences/META-INF/MANIFEST.MF
@@ -5,7 +5,8 @@
 Bundle-Version: 0.9.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Export-Package: org.eclipse.osbp.preferences;version="0.9.0"
-Import-Package: javax.transaction,
+Import-Package: javax.annotation,
+ javax.transaction,
  org.apache.commons.io,
  org.apache.commons.lang3;version="3.1.0",
  org.apache.log4j,
@@ -13,9 +14,9 @@
  org.eclipse.core.resources,
  org.eclipse.persistence.config;version="2.6.0",
  org.eclipse.persistence.sessions;version="2.6.1",
+ org.joda.time;version="2.7.0",
  org.osgi.framework;version="1.6.0",
- org.osgi.service.jdbc,
- javax.annotation
+ org.osgi.service.jdbc
 Require-Bundle: org.slf4j.api;bundle-version="1.7.2",
  org.eclipse.equinox.preferences,
  javax.inject;bundle-version="1.0.0",
diff --git a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/AItemDescribed.java b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/AItemDescribed.java
index 46b4434..5b61814 100644
--- a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/AItemDescribed.java
+++ b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/AItemDescribed.java
@@ -41,8 +41,8 @@
 	}
 	
 //	private final ItemDescription fDescription; // NOSONAR
-	protected static final String VALUE_SEPARATOR = ":";
-	protected static final String ITEM_SEPARATOR = ";";
+	protected static final String VALUE_SEPARATOR = "##";
+	protected static final String ITEM_SEPARATOR = "!!";
 	
 	public AItemDescribed(ItemDescription description) {
 //		fDescription = description; // NOSONAR
diff --git a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/DataSourceConfiguration.java b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/DataSourceConfiguration.java
index 4020f83..412ea3a 100644
--- a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/DataSourceConfiguration.java
+++ b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/DataSourceConfiguration.java
@@ -1,56 +1,86 @@
-/**
- *                                                                            
- * 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 2.0        
- * which accompanies this distribution, and is available at                  
- * https://www.eclipse.org/legal/epl-2.0/                                 
- *                                 
- * SPDX-License-Identifier: EPL-2.0                                 
- *                                                                            
- * Contributors:   
- * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
- */
+/******************************************************************************
+ *                                                                            *
+ *  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                                 *
+ *                                                                            *
+ *============================================================================*
+ * Initial contribution:                                                      *
+ *     Loetz GmbH & Co. KG,  Loetz GmbH & Co KG                               *
+ ******************************************************************************/
 package org.eclipse.osbp.preferences;
 
+import java.time.ZoneId;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Properties;
 import java.util.TreeMap;
 
+import org.joda.time.DateTimeZone;
 import org.osgi.service.jdbc.DataSourceFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
 
+// TODO: Auto-generated Javadoc
 /**
- * Helper class containing DataSource configuration data needed for JPA and JDBC
+ * Helper class containing DataSource configuration data needed for JPA and
+ * JDBC.
  */
 public class DataSourceConfiguration extends AItemDescribed {
 	
+	/** The Constant LOGGER. */
 	private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceConfiguration.class);
 	
+	/**
+	 * The Class DataSourceItemDescription.
+	 */
 	public static final class DataSourceItemDescription extends ItemDescription {
 		
+		/** The Constant INSTANCE. */
 		public static final DataSourceItemDescription INSTANCE = new DataSourceItemDescription();
 		
+		/** The Constant ROW_NAME. */
 		private static final  String ROW_NAME = "JNDI Data Source";
+		
+		/** The Constant DATABASE_TYPE. */
 		public static final String DATABASE_TYPE = "Database Type";
+		
+		/** The Constant DRIVER_CLASS. */
 		public static final String DRIVER_CLASS = "Driver Class";
+		
+		/** The Constant SERVER_NAME. */
 		public static final String SERVER_NAME = "Server Name";
+		
+		/** The Constant SERVER_PORT. */
 		public static final String SERVER_PORT = "Server Port";
+		
+		/** The Constant SERVER_TIMEZONE. */
+		public static final String SERVER_TIMEZONE = "Server Timezone";
+		
+		/** The Constant DATABASE_NAME. */
 		public static final String DATABASE_NAME = "Database Name";
+		
+		/** The Constant DATABASE_USER. */
 		public static final String DATABASE_USER = "Database User";
+		
+		/** The Constant DATABASE_PASSWORD. */
 		public static final String DATABASE_PASSWORD = "Database Password"; // NOSONAR
 
+		/**
+		 * Instantiates a new data source item description.
+		 */
 		protected DataSourceItemDescription() {
 			super(ROW_NAME,
 					DATABASE_TYPE, Type.DatabaseType,
 					DRIVER_CLASS, Type.String,
 					SERVER_NAME, Type.String,
 					SERVER_PORT, Type.Integer,
+					SERVER_TIMEZONE, Type.String,
 					DATABASE_NAME, Type.String,
 					DATABASE_USER, Type.String,
 					DATABASE_PASSWORD, Type.String
@@ -58,20 +88,49 @@
 		}
 	}
 	
+	/** The name. */
 	private String fName;
+	
+	/** The data base vendor. */
 	private EnumDatabaseVendor fDataBaseVendor;
+	
+	/** The driver vendor. */
 	private String fDriverVendor;
+	
+	/** The driver type. */
 	private String fDriverType;
+	
+	/** The driver class. */
 	private String fDriverClass;
+	
+	/** The server name. */
 	private String fServerName;
+	
+	/** The server port. */
 	private int fServerPort;
+	
+	/** The server timezone. */
+	private String fServerTimezone;
+	
+	/** The database name. */
 	private String fDatabaseName;
+	
+	/** The database user. */
 	private String fDatabaseUser;
+	
+	/** The database pass. */
 	private String fDatabasePass;
+	
+	/** The jdbc url format. */
 	private String fJdbcUrlFormat;
+	
 
+	/** The Constant WORKER. */
 	private static final DataSourceConfiguration WORKER = new DataSourceConfiguration();
 	
+	/**
+	 * Instantiates a new data source configuration.
+	 */
 	private DataSourceConfiguration() {
 		super(DataSourceItemDescription.INSTANCE);
 		fName = null;
@@ -81,12 +140,31 @@
 		fDriverClass = null;
 		fServerName = null;
 		fServerPort = 0;
+		fServerTimezone = null;
 		fDatabaseName = null;
 		fDatabaseUser = null;
 		fDatabasePass = null;
 		fJdbcUrlFormat = null;
 	}
 	
+	/**
+	 * Instantiates a new data source configuration.
+	 *
+	 * @param name
+	 *            the name
+	 * @param dataBaseVendor
+	 *            the data base vendor
+	 * @param serverName
+	 *            the server name
+	 * @param serverPort
+	 *            the server port
+	 * @param databaseName
+	 *            the database name
+	 * @param databaseUser
+	 *            the database user
+	 * @param databasePass
+	 *            the database pass
+	 */
 	public DataSourceConfiguration(
 		String name,
 		EnumDatabaseVendor dataBaseVendor,
@@ -104,14 +182,39 @@
 		);
 	}
 
+	/**
+	 * Instantiates a new data source configuration.
+	 *
+	 * @param name
+	 *            the name
+	 * @param dataBaseVendor
+	 *            the data base vendor
+	 * @param driverVendor
+	 *            the driver vendor
+	 * @param driverType
+	 *            the driver type
+	 * @param driverClass
+	 *            the driver class
+	 * @param serverName
+	 *            the server name
+	 * @param serverPort
+	 *            the server port
+	 * @param databaseName
+	 *            the database name
+	 * @param databaseUser
+	 *            the database user
+	 * @param databasePass
+	 *            the database pass
+	 * @param jdbcUrlFormat
+	 *            the jdbc url format
+	 */
 	protected DataSourceConfiguration( // NOSONAR
 		String name,
 		EnumDatabaseVendor dataBaseVendor,
 		String driverVendor, String driverType, String driverClass,
 		String serverName, int serverPort,
 		String databaseName, String databaseUser, String databasePass,
-		String jdbcUrlFormat) {
-		super(DataSourceItemDescription.INSTANCE);
+		String jdbcUrlFormat) {		super(DataSourceItemDescription.INSTANCE);
 		fName = name;
 		fDataBaseVendor = dataBaseVendor;
 		fDriverVendor = (driverVendor == null || driverVendor.isEmpty()) ? dataBaseVendor.getDriverVendor() : driverVendor;
@@ -119,22 +222,82 @@
 		fDriverClass = (driverClass == null || driverClass.isEmpty()) ? dataBaseVendor.getDriverClass() : driverClass;
 		fServerName = (serverName == null ? "" : serverName);
 		fServerPort = (serverPort < 0 ? 0 : serverPort);
+		fServerTimezone = DateTimeZone.forID( ZoneId.systemDefault().normalized().toString()).getNameKey(0) ;
 		fDatabaseName = databaseName;
 		fDatabaseUser = databaseUser;
 		fDatabasePass = databasePass;
 		fJdbcUrlFormat = jdbcUrlFormat;
 	}
 
+	/**
+	 * Instantiates a new data source configuration.
+	 *
+	 * @param name
+	 *            the name
+	 * @param dataBaseVendor
+	 *            the data base vendor
+	 * @param driverVendor
+	 *            the driver vendor
+	 * @param driverType
+	 *            the driver type
+	 * @param driverClass
+	 *            the driver class
+	 * @param serverName
+	 *            the server name
+	 * @param serverPort
+	 *            the server port
+	 * @param databaseName
+	 *            the database name
+	 * @param databaseUser
+	 *            the database user
+	 * @param databasePass
+	 *            the database pass
+	 * @param jdbcUrlFormat
+	 *            the jdbc url format
+	 * @param serverTimeZone
+	 *            the server time zone
+	 */
+	protected DataSourceConfiguration( // NOSONAR
+			String name,
+			EnumDatabaseVendor dataBaseVendor,
+			String driverVendor, String driverType, String driverClass,
+			String serverName, int serverPort,
+			String databaseName, String databaseUser, String databasePass,
+			String jdbcUrlFormat,
+			String serverTimeZone) {		super(DataSourceItemDescription.INSTANCE);
+			fName = name;
+			fDataBaseVendor = dataBaseVendor;
+			fDriverVendor = (driverVendor == null || driverVendor.isEmpty()) ? dataBaseVendor.getDriverVendor() : driverVendor;
+			fDriverType = (driverType == null || driverType.isEmpty()) ? dataBaseVendor.getDriverType() : driverType;
+			fDriverClass = (driverClass == null || driverClass.isEmpty()) ? dataBaseVendor.getDriverClass() : driverClass;
+			fServerName = (serverName == null ? "" : serverName);
+			fServerPort = (serverPort < 0 ? 0 : serverPort);
+			fServerTimezone = serverTimeZone;
+			fDatabaseName = databaseName;
+			fDatabaseUser = databaseUser;
+			fDatabasePass = databasePass;
+			fJdbcUrlFormat = jdbcUrlFormat;
+		}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.preferences.IItemDescribed#getName()
+	 */
 	@Override
 	public String getName() {
 		return fName;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.preferences.IItemDescribed#setName(java.lang.String)
+	 */
 	@Override
 	public void setName(String name) {
 		fName = name;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.preferences.IItemDescribed#getValue(java.lang.String)
+	 */
 	@Override
 	public String getValue(String attribute) { // NOSONAR
 		switch (attribute) { // NOSONAR
@@ -142,6 +305,7 @@
 			case DataSourceItemDescription.DRIVER_CLASS: return fDriverClass;
 			case DataSourceItemDescription.SERVER_NAME: return fServerName;
 			case DataSourceItemDescription.SERVER_PORT: return ((Integer)fServerPort).toString();
+			case DataSourceItemDescription.SERVER_TIMEZONE: return fServerTimezone;
 			case DataSourceItemDescription.DATABASE_NAME: return fDatabaseName;
 			case DataSourceItemDescription.DATABASE_USER: return fDatabaseUser;
 			case DataSourceItemDescription.DATABASE_PASSWORD: return fDatabasePass;
@@ -149,6 +313,9 @@
 		return null;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.preferences.IItemDescribed#setValue(java.lang.String, java.lang.String)
+	 */
 	@Override
 	public void setValue(String attribute, String value) {
 		switch (attribute) { // NOSONAR
@@ -171,6 +338,10 @@
 				fServerPort = ItemDescription.parseInt(value, fServerPort); 
 				break;
 			}
+			case DataSourceItemDescription.SERVER_TIMEZONE: {  // NOSONAR
+				fServerTimezone = value; 
+				break;
+			}
 			case DataSourceItemDescription.DATABASE_NAME: { // NOSONAR
 				fDatabaseName = value; 
 				break;
@@ -187,44 +358,110 @@
 	}
 
 	/**
-	 * @return	the name of the jdbc driver class
+	 * Gets the driver class.
+	 *
+	 * @return the name of the jdbc driver class
 	 */
 	public String getDriverClass() {
 		return fDriverClass;
 	}
 
+	/**
+	 * Gets the driver vendor.
+	 *
+	 * @return the driver vendor
+	 */
 	public String getDriverVendor() {
 		return fDriverVendor;
 	}
 
+	/**
+	 * Gets the driver type.
+	 *
+	 * @return the driver type
+	 */
 	public String getDriverType() {
 		return fDriverType;
 	}
 
+	/**
+	 * Gets the server name.
+	 *
+	 * @return the server name
+	 */
 	public String getServerName() {
 		return fServerName;
 	}
 
+	/**
+	 * Gets the server port.
+	 *
+	 * @return the server port
+	 */
 	public int getServerPort() {
 		return fServerPort;
 	}
 
+	/**
+	 * Gets the server timezone.
+	 *
+	 * @return the server timezone
+	 */
+	public String getServerTimezone() {
+		return fServerTimezone;
+	}
+
+
+	/**
+	 * Gets the database name.
+	 *
+	 * @return the database name
+	 */
 	public String getDatabaseName() {
 		return fDatabaseName;
 	}
 
+	/**
+	 * Gets the database user.
+	 *
+	 * @return the database user
+	 */
 	public String getDatabaseUser() {
 		return fDatabaseUser;
 	}
 
+	/**
+	 * Gets the database password.
+	 *
+	 * @return the database password
+	 */
 	public String getDatabasePass() {
 		return fDatabasePass; // NOSONAR
 	}
+	
+	/**
+	 * Gets the jdbc URL.
+	 *
+	 * @return the jdbc URL
+	 */
+	public String getJdbcURL() {
+		return fDataBaseVendor.jdbcUrl(fDriverVendor, fDriverType, fServerName, fServerPort, fDatabaseName, fJdbcUrlFormat,fServerTimezone, fDatabaseUser, fDatabasePass); // NOSONAR
+	}
 
+	/**
+	 * Gets the database vendor.
+	 *
+	 * @return the database vendor
+	 */
 	public EnumDatabaseVendor getDatabaseVendor() {
 		return fDataBaseVendor;
 	}
 
+	/**
+	 * Gets the default batch writing.
+	 *
+	 * @return the default batch writing
+	 */
 	public String getDefaultBatchWriting() {
 		if  (fDataBaseVendor != null) {
 			return fDataBaseVendor.getPersistenceBatchWriting();
@@ -232,14 +469,23 @@
 		return null;
 	}
 
+	/**
+	 * Gets the default schema name.
+	 *
+	 * @return the default schema name
+	 */
 	public String getDefaultSchemaName() {
 		switch (fDataBaseVendor) { // NOSONAR
 			case H2_IN_MEMORY:
 				return "h2memory";
 			case H2_LOCAL_FILE:
 				return "h2localfile";
+			case MSSQL:
+				return "dbo";
 			case MYSQL:
 				return getDatabaseName();
+			case MYSQL8:
+				return getDatabaseName();
 			case ORACLE:
 				return getDatabaseUser();
 			case DERBY_IN_MEMORY:
@@ -253,7 +499,9 @@
 	}
 	
 	/**
-	 * @return	the properties needed to define a DataSource
+	 * Gets the data source properties.
+	 *
+	 * @return the properties needed to define a DataSource
 	 */
 	protected Properties getDataSourceProperties() {
 		Properties properties = new Properties();
@@ -265,10 +513,32 @@
 		setDataSourceProperty(properties, DataSourceFactory.JDBC_DATABASE_NAME, fDatabaseName);
 		setDataSourceProperty(properties, DataSourceFactory.JDBC_USER, fDatabaseUser);
 		setDataSourceProperty(properties, DataSourceFactory.JDBC_PASSWORD, fDatabasePass);
-		setDataSourceProperty(properties, DataSourceFactory.JDBC_URL, fDataBaseVendor.jdbcUrl(fDriverVendor, fDriverType, fServerName, fServerPort, fDatabaseName, fJdbcUrlFormat));
+		setDataSourceProperty(properties, DataSourceFactory.JDBC_URL, getJdbcURL());
+		if (LOGGER.isDebugEnabled() ) {
+			
+			LOGGER.debug("DataBaseVendor:     {}", fDataBaseVendor );
+			if (fDriverType != null && fDriverType.length() > 0) {
+				LOGGER.debug("drivertype:         {}", fDriverType);
+			}
+			LOGGER.debug("JDBC_SERVER_NAME:   {}", fServerName);
+			LOGGER.debug("JDBC_PORT_NUMBER:   {}", fServerPort);
+			LOGGER.debug("JDBC_DATABASE_NAME: {}", fDatabaseName);
+			LOGGER.debug("JDBC_USER:          {}", fDatabaseUser);
+			LOGGER.debug("JDBC_URL:           {}", getJdbcURL());
+		}
 		return properties;
 	}
 
+	/**
+	 * Sets the data source property.
+	 *
+	 * @param properties
+	 *            the properties
+	 * @param key
+	 *            the key
+	 * @param value
+	 *            the value
+	 */
 	private void setDataSourceProperty(Properties properties, String key, String value) {
 		if	(fDataBaseVendor.supportsPropertyKey(key)) {
 			properties.put(key, value);
@@ -279,17 +549,22 @@
 	}
 	
 	/**
-	 * @return	the properties needed to define a JPA connection
+	 * Gets the jpa properties.
+	 *
+	 * @return the properties needed to define a JPA connection
 	 */
 	protected Properties getJpaProperties() {
 		Properties properties = new Properties();
 	    properties.put("javax.persistence.jdbc.driver"	, getDriverClass());
-	    properties.put("javax.persistence.jdbc.url"		, fDataBaseVendor.jdbcUrl(fDriverVendor, fDriverType, fServerName, fServerPort, fDatabaseName, fJdbcUrlFormat));
+	    properties.put("javax.persistence.jdbc.url"		, getJdbcURL());
 	    properties.put("javax.persistence.jdbc.user"	, fDatabaseUser);
 	    properties.put("javax.persistence.jdbc.password", fDatabasePass);
 	    return properties;
 	}
 	
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.preferences.AItemDescribed#_serialize()
+	 */
 	@Override
 	protected String _serialize() {
 		return fName
@@ -306,6 +581,9 @@
 			;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.preferences.AItemDescribed#_deserialize(java.lang.String)
+	 */
 	@Override
 	protected AItemDescribed _deserialize(String serialized) {
 		String[] tokens = serialized.split(VALUE_SEPARATOR);
@@ -327,6 +605,13 @@
 		);
 	}
 
+	/**
+	 * Serialize.
+	 *
+	 * @param dataSources
+	 *            the data sources
+	 * @return the string
+	 */
 	public static String serialize(Collection<DataSourceConfiguration> dataSources) {
 		String retcode = null;
 		for	(DataSourceConfiguration datasource : dataSources) {
@@ -340,6 +625,13 @@
 		return retcode;
 	}
 
+	/**
+	 * Deserialize.
+	 *
+	 * @param value
+	 *            the value
+	 * @return the map
+	 */
 	public static Map<String, DataSourceConfiguration> deserialize(String value) {
 		Map<String, DataSourceConfiguration> dataSources = new TreeMap<>();
 		String[] datasourceItems = value.split(ITEM_SEPARATOR);
@@ -350,16 +642,25 @@
 		return dataSources;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.preferences.AItemDescribed#getSubItems()
+	 */
 	@Override
 	public SubItem[] getSubItems() {
 		return null;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.preferences.AItemDescribed#getIconName()
+	 */
 	@Override
 	public String getIconName() {
 		return null;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.preferences.AItemDescribed#getRowName()
+	 */
 	@Override
 	public String getRowName() {
 		return null;
diff --git a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/EnumDatabaseVendor.java b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/EnumDatabaseVendor.java
index 2d97189..fea1ae9 100644
--- a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/EnumDatabaseVendor.java
+++ b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/EnumDatabaseVendor.java
@@ -1,38 +1,45 @@
-/**
- *                                                                            
- * 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 2.0        
- * which accompanies this distribution, and is available at                  
- * https://www.eclipse.org/legal/epl-2.0/                                 
- *                                 
- * SPDX-License-Identifier: EPL-2.0                                 
- *                                                                            
- * Contributors:   
- * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
- */
+/******************************************************************************
+ *                                                                            *
+ *  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                                 *
+ *                                                                            *
+ *============================================================================*
+ * Initial contribution:                                                      *
+ *     Loetz GmbH & Co. KG,  Loetz GmbH & Co KG                               *
+ ******************************************************************************/
 package org.eclipse.osbp.preferences;
 
+import java.sql.Date;
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
-import org.eclipse.core.runtime.IBundleGroup;
-import org.eclipse.core.runtime.IBundleGroupProvider;
-import org.eclipse.core.runtime.Platform;
-import org.osgi.framework.Bundle;
-
+// TODO: Auto-generated Javadoc
 class VARIABLE { // NOSONAR
 	protected static final String VENDOR = "%%VENDOR%%";
 	protected static final String TYPE = "%%TYPE%%";
 	protected static final String SERVER = "%%SERVER%%";
+	protected static final String SERVERINSTANCE = "%%INSTANCE%%";
 	protected static final String PORT = "%%PORT%%";
 	protected static final String DATABASE = "%%DATABASE%%";
+	protected static final String DATABASESCHEMA = "%%DATABASESCHEMA%%";
 	protected static final String USERHOME = "%%USERHOME%%";
+	protected static final String TIMEZONE = "%%TIMEZONE%%";
+	protected static final String USERNAME = "%%USERNAME%%";
+	protected static final String PASSWORD = "%%PASSWORD%%";
 }
 
+/**
+ * The Enum EnumDatabaseVendor.
+ */
 public enum EnumDatabaseVendor {
+	
+	/** The derby in memory. */
 	/*
 	 * ... // http://hsqldb.org/doc/src/org/hsqldb/jdbc/JDBCDriver.html //
 	 * http://hsqldb.org/doc/guide/dbproperties-chapt.html HSQLDB_IN_MEMORY
@@ -81,9 +88,10 @@
 		}
 	},
 	// https://db.apache.org/derby/papers/DerbyTut/embedded_intro.html
+	/** The derby local file. */
 	// https://db.apache.org/derby/integrate/plugin_help/derby_app.html
 	DERBY_LOCAL_FILE(false, "derby", "", "org.apache.derby.jdbc.EmbeddedDriver",
-			"jdbc:derby:directory:" + VARIABLE.USERHOME + "/" + VARIABLE.DATABASE
+			"jdbc:derby:directory:" + VARIABLE.DATABASE
 			// https://db.apache.org/derby/docs/10.8/devguide/cdevdvlp17453.html
 			// https://db.apache.org/derby/docs/10.8/devguide/cdevdvlpinmemdb.html
 			// https://db.apache.org/derby/docs/10.8/devguide/cdevdvlp40653.html
@@ -99,6 +107,7 @@
 		}
 	},
 	// https://karussell.wordpress.com/2009/06/09/hibernate-cfg-xml-settings-for-derby-oracle-and-h2/
+	/** The derby client. */
 	// https://db.apache.org/derby/integrate/plugin_help/derby_app.html
 	DERBY_CLIENT(false, "derby", "", "org.apache.derby.jdbc.ClientDriver",
 			"jdbc:derby://" + VARIABLE.SERVER + ":" + VARIABLE.PORT + "/" + VARIABLE.DATABASE + ";create=true", "JDBC",
@@ -112,6 +121,8 @@
 			return sqlStatement.replace(ONE_ROW_ONE_COLUMN_TABLE, ONE_ROW_ONE_COLUMN_TABLE_DERBY);
 		}
 	},
+	
+	/** The h2 in memory. */
 	// http://www.h2database.com/html/features.html#in_memory_databases
 	H2_IN_MEMORY(true, "h2", "", "org.h2.Driver", "jdbc:h2:mem:" + VARIABLE.DATABASE
 	// http://h2database.com/html/features.html#execute_sql_on_connection
@@ -152,16 +163,18 @@
 		}
 		
 	},
+	
+	/** The h2 local file. */
 	// http://www.h2database.com/html/features.html#database_url
-	H2_LOCAL_FILE(false, "h2", "", "org.h2.Driver", "jdbc:h2:file:" + VARIABLE.USERHOME + "/" + VARIABLE.DATABASE
+	H2_LOCAL_FILE(false, "h2", "", "org.h2.Driver", "jdbc:h2:file:" + VARIABLE.DATABASE
 	// http://h2database.com/html/features.html#execute_sql_on_connection
 			+ ";LOCK_MODE=0" + ";INIT="
 			// create schema on initial startup
-			+ "CREATE SCHEMA IF NOT EXISTS " + VARIABLE.DATABASE
+			+ "CREATE SCHEMA IF NOT EXISTS " + VARIABLE.DATABASESCHEMA
 			// SEPARATOR between multipe SQL commandos
 			+ "\\;"
 			// use this schema as default
-			+ "SET SCHEMA " + VARIABLE.DATABASE
+			+ "SET SCHEMA " + VARIABLE.DATABASESCHEMA
 			// SEPARATOR between multipe SQL commandos
 			+ "\\;"
 			// ??? set autocommit to false due to own implemented commit
@@ -189,18 +202,82 @@
 			return "APP";
 		}
 	},
+	
+	//jdbc:sqlserver://<server>:<port>;databaseName=<databasename>	
+	
+	/** The mssql. */
+	MSSQL(false, "sqlserver", "thin", "com.microsoft.sqlserver.jdbc.SQLServerDriver",
+			"jdbc:sqlserver://" + VARIABLE.SERVER + ":" + VARIABLE.PORT + ";databaseName=" + VARIABLE.DATABASE +";instanceName=" + VARIABLE.SERVERINSTANCE + ";trustServerCertificate=true;Integrated Security=false;", "JDBC",
+			"URL, databaseName, authentication, instanceName, serverName, trustServerCertificate, url, user, password",
+			"org.hibernate.dialect.SQLServerDialect",
+			"      <plugin id=\"org.eclipse.gemini.dbaccess.mssql\" autoStart=\"true\" startLevel=\"2\" />",
+			"      <feature id=\"org.osbee.technologystack.mssql.feature\"/>\n", 
+			"id int",
+			"uuid String") {
+		@Override
+		public String applySqlSpecifications(String sqlStatement) {
+			return sqlStatement.replace(ONE_ROW_ONE_COLUMN_TABLE, ONE_ROW_ONE_COLUMN_TABLE_MYSQL);
+		}
+
+		
+		@Override
+		public String convertToDateSQL(Date date) {
+			return "cast('"+date.toString().replace(".0","")+"' as datetime)";
+		}
+
+		@Override
+		public String convertToTimestampSQL(Timestamp date) {
+			return "cast('"+date.toString().replace(".0","")+"' as datetime2)";
+		}
+		
+	},
 	// see samples
 	// -
 	// http://dev.mysql.com/doc/connector-j/en/connector-j-usagenotes-connect-drivermanager.html
 	// -
 	// http://www.mkyong.com/jdbc/how-to-connect-to-mysql-with-jdbc-driver-java/
+	/** The mysql. */
 	// - http://www.vogella.com/tutorials/MySQLJava/article.html
 	MYSQL(false, "mysql", "thin", "com.mysql.jdbc.Driver",
-			"jdbc:" + VARIABLE.VENDOR + "://" + VARIABLE.SERVER + ":" + VARIABLE.PORT + "/" + VARIABLE.DATABASE, "JDBC",
-			"URL, allowLoadLocalInfile, allowMasterDownConnections, allowMultiQueries, allowNanAndInf, allowUrlInLocalInfile, alwaysSendSetIsolation, authenticationPlugins, autoClosePStmtStreams, autoDeserialize, autoGenerateTestcaseScript, autoReconnect, autoReconnectForConnectionPools, autoReconnectForPools, autoSlowLog, blobsAreStrings, cacheCallableStatements, cacheCallableStmts, cachePrepStmts, cachePreparedStatements, cacheResultSetMetadata, cacheServerConfiguration, callableStatementCacheSize, callableStmtCacheSize, capitalizeDBMDTypes, capitalizeTypeNames, characterEncoding, characterSetResults, clientCertificateKeyStorePassword, clientCertificateKeyStoreType, clientCertificateKeyStoreUrl, clientInfoProvider, clobCharacterEncoding, clobberStreamingResults, compensateOnDuplicateKeyUpdateCounts, connectTimeout, connectionAttributes, connectionCollation, connectionLifecycleInterceptors, continueBatchOnError, createDatabaseIfNotExist, databaseName, defaultAuthenticationPlugin, defaultFetchSize, detectCustomCollations, detectServerPreparedStmts, disabledAuthenticationPlugins, disconnectOnExpiredPasswords, dontTrackOpenResources, dumpMetadataOnColumnNotFound, dumpQueriesOnException, dynamicCalendars, elideSetAutoCommits, emptyStringsConvertToZero, emulateLocators, emulateUnsupportedPstmts, enablePacketDebug, enableQueryTimeouts, encoding, exceptionInterceptors, explainSlowQueries, failOverReadOnly, functionsNeverReturnBlobs, gatherPerfMetrics, gatherPerformanceMetrics, generateSimpleParameterMetadata, getProceduresReturnsFunctions, holdResultsOpenOverStatementClose, ignoreNonTxTables, includeInnodbStatusInDeadlockExceptions, includeThreadDumpInDeadlockExceptions, includeThreadNamesAsStatementComment, initialTimeout, interactiveClient, isInteractiveClient, jdbcCompliantTruncation, jdbcCompliantTruncationForReads, largeRowSizeThreshold, loadBalanceAutoCommitStatementRegex, loadBalanceAutoCommitStatementThreshold, loadBalanceBlacklistTimeout, loadBalanceConnectionGroup, loadBalanceEnableJMX, loadBalanceExceptionChecker, loadBalancePingTimeout, loadBalanceSQLExceptionSubclassFailover, loadBalanceSQLStateFailover, loadBalanceStrategy, loadBalanceValidateConnectionOnSwapServer, localSocketAddress, logSlowQueries, logWriter, logXaCommands, logger, loggerClassName, loginTimeout, maintainTimeStats, maxAllowedPacket, maxQuerySizeToLog, maxReconnects, maxRows, metadataCacheSize, netTimeoutForStreamingResults, noAccessToProcedureBodies, noDatetimeStringSync, noTimezoneConversionForTimeType, nullCatalogMeansCurrent, nullNamePatternMatchesAll, overrideSupportsIntegrityEnhancementFacility, packetDebugBufferSize, padCharsWithSpace, paranoid, parseInfoCacheFactory, password, passwordCharacterEncoding, pedantic, pinGlobalTxToPhysicalConnection, populateInsertRowWithDefaultValues, port, portNumber, prepStmtCacheSize, prepStmtCacheSqlLimit, preparedStatementCacheSize, preparedStatementCacheSqlLimit, processEscapeCodesForPrepStmts, profileSQL, profileSql, profilerEventHandler, propertiesTransform, propertiesViaRef, queriesBeforeRetryMaster, queryTimeoutKillsConnection, reconnectAtTxEnd, relaxAutoCommit, replicationEnableJMX, reportMetricsIntervalMillis, requireSSL, resourceId, resultSetSizeThreshold, retainStatementAfterResultSetClose, retriesAllDown, rewriteBatchedStatements, rollbackOnPooledClose, roundRobinLoadBalance, runningCTS13, secondsBeforeRetryMaster, selfDestructOnPingMaxOperations, selfDestructOnPingSecondsLifetime, serverConfigCacheFactory, serverName, serverTimezone, sessionVariables, slowQueryThresholdMillis, slowQueryThresholdNanos, socketFactory, socketFactoryClassName, socketTimeout, statementInterceptors, strictFloatingPoint, strictUpdates, tcpKeepAlive, tcpNoDelay, tcpRcvBuf, tcpSndBuf, tcpTrafficClass, tinyInt1isBit, traceProtocol, transformedBitIsBoolean, treatUtilDateAsTimestamp, trustCertificateKeyStorePassword, trustCertificateKeyStoreType, trustCertificateKeyStoreUrl, ultraDevHack, url, useAffectedRows, useBlobToStoreUTF8OutsideBMP, useColumnNamesInFindColumn, useCompression, useConfigs, useCursorFetch, useDirectRowUnpack, useDynamicCharsetInfo, useFastDateParsing, useFastIntParsing, useGmtMillisForDatetimes, useHostsInPrivileges, useInformationSchema, useJDBCCompliantTimezoneShift, useJvmCharsetConverters, useLegacyDatetimeCode, useLocalSessionState, useLocalTransactionState, useNanosForElapsedTime, useOldAliasMetadataBehavior, useOldUTF8Behavior, useOnlyServerErrorMessages, useReadAheadInput, useSSL, useSSPSCompatibleTimezoneShift, useServerPrepStmts, useServerPreparedStmts, useSqlStateCodes, useStreamLengthsInPrepStmts, useTimezone, useUltraDevWorkAround, useUnbufferedInput, useUnicode, useUsageAdvisor, user, utf8OutsideBmpExcludedColumnNamePattern, utf8OutsideBmpIncludedColumnNamePattern, verifyServerCertificate, yearIsDateType, zeroDateTimeBehavior",
+			"jdbc:mysql://" + VARIABLE.SERVER + ":" + VARIABLE.PORT + "/" + VARIABLE.DATABASE + "?useSSL=false&useLegacyDatetimeCode=false&serverTimezone=" + VARIABLE.TIMEZONE, "JDBC",
+			"URL, allowLoadLocalInfile, allowMasterDownConnections, allowMultiQueries, allowNanAndInf, allowUrlInLocalInfile, alwaysSendSetIsolation," + 
+			" authenticationPlugins, autoClosePStmtStreams, autoDeserialize, autoGenerateTestcaseScript, autoReconnect, autoReconnectForConnectionPools," + 
+			" autoReconnectForPools, autoSlowLog, blobsAreStrings, cacheCallableStatements, cacheCallableStmts, cachePrepStmts, cachePreparedStatements," +
+			" cacheResultSetMetadata, cacheServerConfiguration, callableStatementCacheSize, callableStmtCacheSize, capitalizeDBMDTypes, capitalizeTypeNames," +
+			" characterEncoding, characterSetResults, clientCertificateKeyStorePassword, clientCertificateKeyStoreType, clientCertificateKeyStoreUrl," + 
+			" clientInfoProvider, clobCharacterEncoding, clobberStreamingResults, compensateOnDuplicateKeyUpdateCounts, connectTimeout, connectionAttributes," +
+			" connectionCollation, connectionLifecycleInterceptors, continueBatchOnError, createDatabaseIfNotExist, databaseName, defaultAuthenticationPlugin," + 
+			" defaultFetchSize, detectCustomCollations, detectServerPreparedStmts, disabledAuthenticationPlugins, disconnectOnExpiredPasswords, dontTrackOpenResources," + 
+			" dumpMetadataOnColumnNotFound, dumpQueriesOnException, dynamicCalendars, elideSetAutoCommits, emptyStringsConvertToZero, emulateLocators," + 
+			" emulateUnsupportedPstmts, enablePacketDebug, enableQueryTimeouts, encoding, exceptionInterceptors, explainSlowQueries, failOverReadOnly," + 
+			" functionsNeverReturnBlobs, gatherPerfMetrics, gatherPerformanceMetrics, generateSimpleParameterMetadata, getProceduresReturnsFunctions," + 
+			" holdResultsOpenOverStatementClose, ignoreNonTxTables, includeInnodbStatusInDeadlockExceptions, includeThreadDumpInDeadlockExceptions," + 
+			" includeThreadNamesAsStatementComment, initialTimeout, interactiveClient, isInteractiveClient, jdbcCompliantTruncation, jdbcCompliantTruncationForReads," + 
+			" largeRowSizeThreshold, loadBalanceAutoCommitStatementRegex, loadBalanceAutoCommitStatementThreshold, loadBalanceBlacklistTimeout, " + 
+			" loadBalanceConnectionGroup, loadBalanceEnableJMX, loadBalanceExceptionChecker, loadBalancePingTimeout, loadBalanceSQLExceptionSubclassFailover," + 
+			" loadBalanceSQLStateFailover, loadBalanceStrategy, loadBalanceValidateConnectionOnSwapServer, localSocketAddress, logSlowQueries, logWriter," + 
+			" logXaCommands, logger, loggerClassName, loginTimeout, maintainTimeStats, maxAllowedPacket, maxQuerySizeToLog, maxReconnects, maxRows," + 
+			" metadataCacheSize, netTimeoutForStreamingResults, noAccessToProcedureBodies, noDatetimeStringSync, noTimezoneConversionForTimeType," + 
+			" nullCatalogMeansCurrent, nullNamePatternMatchesAll, overrideSupportsIntegrityEnhancementFacility, packetDebugBufferSize, padCharsWithSpace," + 
+			" paranoid, parseInfoCacheFactory, password, passwordCharacterEncoding, pedantic, pinGlobalTxToPhysicalConnection, populateInsertRowWithDefaultValues," + 
+			" port, portNumber, prepStmtCacheSize, prepStmtCacheSqlLimit, preparedStatementCacheSize, preparedStatementCacheSqlLimit, processEscapeCodesForPrepStmts," + 
+			" profileSQL, profileSql, profilerEventHandler, propertiesTransform, propertiesViaRef, queriesBeforeRetryMaster, queryTimeoutKillsConnection," + 
+			" reconnectAtTxEnd, relaxAutoCommit, replicationEnableJMX, reportMetricsIntervalMillis, requireSSL, resourceId, resultSetSizeThreshold," + 
+			" retainStatementAfterResultSetClose, retriesAllDown, rewriteBatchedStatements, rollbackOnPooledClose, roundRobinLoadBalance, runningCTS13," + 
+			" secondsBeforeRetryMaster, selfDestructOnPingMaxOperations, selfDestructOnPingSecondsLifetime, serverConfigCacheFactory, serverName," + 
+			" serverTimezone, sessionVariables, slowQueryThresholdMillis, slowQueryThresholdNanos, socketFactory, socketFactoryClassName, socketTimeout," + 
+			" statementInterceptors, strictFloatingPoint, strictUpdates, tcpKeepAlive, tcpNoDelay, tcpRcvBuf, tcpSndBuf, tcpTrafficClass, tinyInt1isBit," + 
+			" traceProtocol, transformedBitIsBoolean, treatUtilDateAsTimestamp, trustCertificateKeyStorePassword, trustCertificateKeyStoreType," + 
+			" trustCertificateKeyStoreUrl, ultraDevHack, url, useAffectedRows, useBlobToStoreUTF8OutsideBMP, useColumnNamesInFindColumn, useCompression," + 
+			" useConfigs, useCursorFetch, useDirectRowUnpack, useDynamicCharsetInfo, useFastDateParsing, useFastIntParsing, useGmtMillisForDatetimes," + 
+			" useHostsInPrivileges, useInformationSchema, useJDBCCompliantTimezoneShift, useJvmCharsetConverters, useLegacyDatetimeCode, useLocalSessionState," + 
+			" useLocalTransactionState, useNanosForElapsedTime, useOldAliasMetadataBehavior, useOldUTF8Behavior, useOnlyServerErrorMessages, useReadAheadInput," + 
+			" useSSL, useSSPSCompatibleTimezoneShift, useServerPrepStmts, useServerPreparedStmts, useSqlStateCodes, useStreamLengthsInPrepStmts, useTimezone," + 
+			" useUltraDevWorkAround, useUnbufferedInput, useUnicode, useUsageAdvisor, user, utf8OutsideBmpExcludedColumnNamePattern," + 
+			" utf8OutsideBmpIncludedColumnNamePattern, verifyServerCertificate, yearIsDateType, zeroDateTimeBehavior",
 			"org.hibernate.dialect.MySQLDialect",
 			"      <plugin id=\"org.eclipse.gemini.dbaccess.mysql\" autoStart=\"true\" startLevel=\"2\" />",
-			"      <feature id=\"org.osbee.dependencies.feature.mysql\"/>\n", 
+			"      <feature id=\"org.osbee.technologystack.mysql.feature\"/>\n", 
 			"id int",
 			"uuid String") {
 		@Override
@@ -218,7 +295,62 @@
 		public String getToTimestampSQLMethod() {
 			return "str_to_date";
 		}
+
+		@Override
+		public String convertToDateSQL(Date date) {
+			return "str_to_date('"+date.toString().replace(".0","")+"','%Y-%m-%d')";
+		}
+
+		@Override
+		public String convertToTimestampSQL(Timestamp date) {
+			return "str_to_date('"+date.toString().replace(".0","")+"','%Y-%m-%d %H:%i:%s')";
+		}
+		
 	},
+	// see samples
+	// -
+	// http://dev.mysql.com/doc/connector-j/en/connector-j-usagenotes-connect-drivermanager.html
+	// -
+	// http://www.mkyong.com/jdbc/how-to-connect-to-mysql-with-jdbc-driver-java/
+	/** The mysql8. */
+	// - http://www.vogella.com/tutorials/MySQLJava/article.html
+	MYSQL8(false, "mysql8", "thin", "com.mysql.cj.jdbc.Driver",
+			"jdbc:mysql://" + VARIABLE.SERVER + ":" + VARIABLE.PORT + "/" + VARIABLE.DATABASE + "?useSSL=false&AllowPublicKeyRetrieval=true&useLegacyDatetimeCode=false&serverTimezone=" + VARIABLE.TIMEZONE, "JDBC",
+			"URL, allowLoadLocalInfile, allowMasterDownConnections, allowMultiQueries, allowNanAndInf, allowPublicKeyRetrieval, allowUrlInLocalInfile, alwaysSendSetIsolation, authenticationPlugins, autoClosePStmtStreams, autoDeserialize, autoGenerateTestcaseScript, autoReconnect, autoReconnectForConnectionPools, autoReconnectForPools, autoSlowLog, blobsAreStrings, cacheCallableStatements, cacheCallableStmts, cachePrepStmts, cachePreparedStatements, cacheResultSetMetadata, cacheServerConfiguration, callableStatementCacheSize, callableStmtCacheSize, capitalizeDBMDTypes, capitalizeTypeNames, characterEncoding, characterSetResults, clientCertificateKeyStorePassword, clientCertificateKeyStoreType, clientCertificateKeyStoreUrl, clientInfoProvider, clobCharacterEncoding, clobberStreamingResults, compensateOnDuplicateKeyUpdateCounts, connectTimeout, connectionAttributes, connectionCollation, connectionLifecycleInterceptors, continueBatchOnError, createDatabaseIfNotExist, databaseName, defaultAuthenticationPlugin, defaultFetchSize, detectCustomCollations, detectServerPreparedStmts, disabledAuthenticationPlugins, disconnectOnExpiredPasswords, dontTrackOpenResources, dumpMetadataOnColumnNotFound, dumpQueriesOnException, dynamicCalendars, elideSetAutoCommits, emptyStringsConvertToZero, emulateLocators, emulateUnsupportedPstmts, enablePacketDebug, enableQueryTimeouts, encoding, exceptionInterceptors, explainSlowQueries, failOverReadOnly, functionsNeverReturnBlobs, gatherPerfMetrics, gatherPerformanceMetrics, generateSimpleParameterMetadata, getProceduresReturnsFunctions, holdResultsOpenOverStatementClose, ignoreNonTxTables, includeInnodbStatusInDeadlockExceptions, includeThreadDumpInDeadlockExceptions, includeThreadNamesAsStatementComment, initialTimeout, interactiveClient, isInteractiveClient, jdbcCompliantTruncation, jdbcCompliantTruncationForReads, largeRowSizeThreshold, loadBalanceAutoCommitStatementRegex, loadBalanceAutoCommitStatementThreshold, loadBalanceBlacklistTimeout, loadBalanceConnectionGroup, loadBalanceEnableJMX, loadBalanceExceptionChecker, loadBalancePingTimeout, loadBalanceSQLExceptionSubclassFailover, loadBalanceSQLStateFailover, loadBalanceStrategy, loadBalanceValidateConnectionOnSwapServer, localSocketAddress, logSlowQueries, logWriter, logXaCommands, logger, loggerClassName, loginTimeout, maintainTimeStats, maxAllowedPacket, maxQuerySizeToLog, maxReconnects, maxRows, metadataCacheSize, netTimeoutForStreamingResults, noAccessToProcedureBodies, noDatetimeStringSync, noTimezoneConversionForTimeType, nullCatalogMeansCurrent, nullNamePatternMatchesAll, overrideSupportsIntegrityEnhancementFacility, packetDebugBufferSize, padCharsWithSpace, paranoid, parseInfoCacheFactory, password, passwordCharacterEncoding, pedantic, pinGlobalTxToPhysicalConnection, populateInsertRowWithDefaultValues, port, portNumber, prepStmtCacheSize, prepStmtCacheSqlLimit, preparedStatementCacheSize, preparedStatementCacheSqlLimit, processEscapeCodesForPrepStmts, profileSQL, profileSql, profilerEventHandler, propertiesTransform, propertiesViaRef, queriesBeforeRetryMaster, queryTimeoutKillsConnection, reconnectAtTxEnd, relaxAutoCommit, replicationEnableJMX, reportMetricsIntervalMillis, requireSSL, resourceId, resultSetSizeThreshold, retainStatementAfterResultSetClose, retriesAllDown, rewriteBatchedStatements, rollbackOnPooledClose, roundRobinLoadBalance, runningCTS13, secondsBeforeRetryMaster, selfDestructOnPingMaxOperations, selfDestructOnPingSecondsLifetime, serverConfigCacheFactory, serverName, serverTimezone, sessionVariables, slowQueryThresholdMillis, slowQueryThresholdNanos, socketFactory, socketFactoryClassName, socketTimeout, statementInterceptors, strictFloatingPoint, strictUpdates, tcpKeepAlive, tcpNoDelay, tcpRcvBuf, tcpSndBuf, tcpTrafficClass, tinyInt1isBit, traceProtocol, transformedBitIsBoolean, treatUtilDateAsTimestamp, trustCertificateKeyStorePassword, trustCertificateKeyStoreType, trustCertificateKeyStoreUrl, ultraDevHack, url, useAffectedRows, useBlobToStoreUTF8OutsideBMP, useColumnNamesInFindColumn, useCompression, useConfigs, useCursorFetch, useDirectRowUnpack, useDynamicCharsetInfo, useFastDateParsing, useFastIntParsing, useGmtMillisForDatetimes, useHostsInPrivileges, useInformationSchema, useJDBCCompliantTimezoneShift, useJvmCharsetConverters, useLegacyDatetimeCode, useLocalSessionState, useLocalTransactionState, useNanosForElapsedTime, useOldAliasMetadataBehavior, useOldUTF8Behavior, useOnlyServerErrorMessages, useReadAheadInput, useSSL, useSSPSCompatibleTimezoneShift, useServerPrepStmts, useServerPreparedStmts, useSqlStateCodes, useStreamLengthsInPrepStmts, useTimezone, useUltraDevWorkAround, useUnbufferedInput, useUnicode, useUsageAdvisor, user, utf8OutsideBmpExcludedColumnNamePattern, utf8OutsideBmpIncludedColumnNamePattern, verifyServerCertificate, yearIsDateType, zeroDateTimeBehavior",
+			"org.hibernate.dialect.MySQLDialect",
+			"      <plugin id=\"org.eclipse.gemini.dbaccess.mysql8\" autoStart=\"true\" startLevel=\"2\" />",
+			"      <feature id=\"org.osbee.technologystack.mysql8.feature\"/>\n", 
+			"id int",
+			"uuid String") {
+		@Override
+		public String applySqlSpecifications(String sqlStatement) {
+			return sqlStatement.replace(ONE_ROW_ONE_COLUMN_TABLE, ONE_ROW_ONE_COLUMN_TABLE_MYSQL);
+		}
+
+		@Override
+		public String getToDateSQLMethod() {
+			return "str_to_date";
+
+		}
+
+		@Override
+		public String getToTimestampSQLMethod() {
+			return "str_to_date";
+		}
+
+		@Override
+		public String convertToDateSQL(Date date) {
+			return "str_to_date('"+date.toString().replace(".0","")+"','%Y-%m-%d')";
+		}
+
+		@Override
+		public String convertToTimestampSQL(Timestamp date) {
+			return "str_to_date('"+date.toString().replace(".0","")+"','%Y-%m-%d %H:%i:%s')";
+		}
+		
+	},
+	
+	/** The oracle. */
 	ORACLE(false, "oracle", "thin", "oracle.jdbc.OracleDriver",
 			"jdbc:" + VARIABLE.VENDOR + ":" + VARIABLE.TYPE + ":@" + VARIABLE.SERVER + ":" + VARIABLE.PORT + ":"
 					+ VARIABLE.DATABASE,
@@ -237,21 +369,78 @@
 		public String getToTimestampSQLMethod() {
 			return "to_timestamp";
 		}
+
+		@Override
+		public String convertToTimestampSQL(Timestamp date) {
+			return "to_timestamp('"+date.toString().replace(".0","")+"','YYYY-MM-DD HH24:MI:SS')";
+		}
+		
 	};
 
+	/** The is in memory. */
 	private final boolean fIsInMemory;
+	
+	/** The driver vendor. */
 	private final String fDriverVendor;
+	
+	/** The driver type. */
 	private final String fDriverType;
+	
+	/** The driver class. */
 	private final String fDriverClass;
+	
+	/** The jdbc url format. */
 	private final String fJdbcUrlFormat;
+	
+	/** The persistence batch writing. */
 	private final String fPersistenceBatchWriting;
+	
+	/** The hibernate dialect. */
 	private final String fHibernateDialect;
+	
+	/** The product features. */
 	private final String fProductFeatures;
+	
+	/** The product configurations. */
 	private final String fProductConfigurations;
+	
+	/** The entity property base ID. */
 	private final String fEntityPropertyBaseID;
+	
+	/** The entity property base UUID. */
 	private final String fEntityPropertyBaseUUID;
+	
+	/** The property keys. */
 	private final List<String> fPropertyKeys;
 
+	/**
+	 * Instantiates a new enum database vendor.
+	 *
+	 * @param isInMemory
+	 *            the is in memory
+	 * @param driverVendor
+	 *            the driver vendor
+	 * @param driverType
+	 *            the driver type
+	 * @param driverClass
+	 *            the driver class
+	 * @param jdbcUrlFormat
+	 *            the jdbc url format
+	 * @param persistenceBatchWriting
+	 *            the persistence batch writing
+	 * @param propertyKeys
+	 *            the property keys
+	 * @param hibernateDialect
+	 *            the hibernate dialect
+	 * @param productConfigurations
+	 *            the product configurations
+	 * @param productFeatures
+	 *            the product features
+	 * @param entityPropertyBaseID
+	 *            the entity property base ID
+	 * @param entityPropertyBaseUUID
+	 *            the entity property base UUID
+	 */
 	private EnumDatabaseVendor(boolean isInMemory, String driverVendor, String driverType, String driverClass,
 			String jdbcUrlFormat, String persistenceBatchWriting, String propertyKeys, String hibernateDialect,
 			String productConfigurations, String productFeatures, String entityPropertyBaseID,
@@ -275,30 +464,60 @@
 		fEntityPropertyBaseUUID = entityPropertyBaseUUID;
 	}
 
+	/**
+	 * Equals ignore case.
+	 *
+	 * @param s1
+	 *            the s 1
+	 * @param s2
+	 *            the s 2
+	 * @return true, if successful
+	 */
 	private static boolean equalsIgnoreCase(String s1, String s2) {
 		s1 = s1.replaceAll("_IN_", "").replaceAll("_", ""); // NOSONAR
 		s2 = s2.replaceAll("_IN_", "").replaceAll("_", ""); // NOSONAR
 		return s1.equalsIgnoreCase(s2);
 	}
 
+	/**
+	 * Gets the database features.
+	 *
+	 * @param vendors
+	 *            the vendors
+	 * @return the database features
+	 */
 	public static String getDatabaseFeatures(Set<EnumDatabaseVendor> vendors) {
-		ArrayList<String> result = new ArrayList<String>();
+		ArrayList<String> result = new ArrayList<>();
 		for (EnumDatabaseVendor vendor : vendors) {
 			result.add(vendor.getProductFeatures());
 		}
 		return String.join("\n", result);
 	}
 
+	/**
+	 * Gets the necessary configurations.
+	 *
+	 * @param vendors
+	 *            the vendors
+	 * @return the necessary configurations
+	 */
 	public static String getNecessaryConfigurations(Set<EnumDatabaseVendor> vendors) {
-		ArrayList<String> result = new ArrayList<String>();
+		ArrayList<String> result = new ArrayList<>();
 		for (EnumDatabaseVendor vendor : vendors) {
 			result.add(vendor.getProductConfigurations());
 		}
 		return String.join("\n", result);
 	}
 
+	/**
+	 * Gets the unnecessary configurations.
+	 *
+	 * @param vendors
+	 *            the vendors
+	 * @return the unnecessary configurations
+	 */
 	public static String getUnnecessaryConfigurations(Set<EnumDatabaseVendor> vendors) {
-		ArrayList<String> result = new ArrayList<String>();
+		ArrayList<String> result = new ArrayList<>();
 		for (EnumDatabaseVendor vendor : values()) {
 			if (!vendors.contains(vendor)) {
 				result.add(vendor.getProductConfigurations());
@@ -307,10 +526,28 @@
 		return String.join("\n", result);
 	}
 
+	/**
+	 * By name.
+	 *
+	 * @param vendorName
+	 *            the vendor name
+	 * @return the enum database vendor
+	 */
 	public static EnumDatabaseVendor byName(String vendorName) { // NOSONAR
 		return byName(vendorName, vendorName, vendorName);
 	}
 
+	/**
+	 * By name.
+	 *
+	 * @param vendorName
+	 *            the vendor name
+	 * @param driverVendor
+	 *            the driver vendor
+	 * @param dataBaseName
+	 *            the data base name
+	 * @return the enum database vendor
+	 */
 	public static EnumDatabaseVendor byName(String vendorName, String driverVendor, String dataBaseName) { // NOSONAR
 		for (EnumDatabaseVendor step : values()) {
 			if (equalsIgnoreCase(step.name(), vendorName) || equalsIgnoreCase(step.fDriverVendor, vendorName)) {
@@ -328,80 +565,199 @@
 		return ORACLE;
 	}
 
+	/** The Constant ONE_ROW_ONE_COLUMN_TABLE. */
 	public static final String ONE_ROW_ONE_COLUMN_TABLE = "{{ONE_ROW_ONE_COLUMN_TABLE}}";
+	
+	/** The Constant ONE_ROW_ONE_COLUMN_TABLE_DERBY. */
 	public static final String ONE_ROW_ONE_COLUMN_TABLE_DERBY = "SYSIBM.SYSDUMMY1";
+	
+	/** The Constant ONE_ROW_ONE_COLUMN_TABLE_H2. */
 	public static final String ONE_ROW_ONE_COLUMN_TABLE_H2 = "DUAL";
+	
+	/** The Constant ONE_ROW_ONE_COLUMN_TABLE_MYSQL. */
 	public static final String ONE_ROW_ONE_COLUMN_TABLE_MYSQL = "DUAL";
+	
+	/** The Constant ONE_ROW_ONE_COLUMN_TABLE_ORACLE. */
 	public static final String ONE_ROW_ONE_COLUMN_TABLE_ORACLE = "DUAL";
 
 	/**
+	 * Apply sql specifications.
+	 *
 	 * @param sqlStatement
+	 *            the sql statement
 	 * @return applied vendor specific SQL statement
 	 */
 	abstract public String applySqlSpecifications(String sqlStatement);
 
 	/**
-	 * @param sqlStatement
+	 * Gets the to date SQL method.
+	 *
 	 * @return applied vendor specific 'to date' SQL statement prefix
 	 */
+	@Deprecated
 	public String getToDateSQLMethod() {
 		return "to_date";
 	}
 	
 	/**
-	 * @param sqlStatement
+	 * Gets the to timestamp SQL method.
+	 *
 	 * @return applied vendor specific 'to timestamp' SQL statement prefix
 	 */
+	@Deprecated
 	public String getToTimestampSQLMethod() {
 		return "to_timestamp";
 	}
 	
+	
+	/**
+	 * Convert to date SQL.
+	 *
+	 * @param date
+	 *            the date
+	 * @return applied vendor specific 'to date' SQL statement part
+	 */
+	public String convertToDateSQL(Date date) {
+		return "to_date('"+date.toString().replace(".0","")+"','YYYY-MM-DD HH24:MI:SS')";
+	}
+
+	/**
+	 * Convert to timestamp SQL.
+	 *
+	 * @param date
+	 *            the date
+	 * @return applied vendor specific 'to date' SQL statement part
+	 */
+	public String convertToTimestampSQL(Timestamp date) {
+		return "to_timestamp('"+date.toString().replace(".0","")+"','YYYY-MM-DD HH24:MI:SS')";
+	}
+
+	/**
+	 * Apply schema name specifications.
+	 *
+	 * @param schemaName
+	 *            the schema name
+	 * @return the string
+	 */
 	public String applySchemaNameSpecifications(String schemaName) {
 		return schemaName;
 	}
 
+	/**
+	 * Checks if is in memory.
+	 *
+	 * @return true, if is in memory
+	 */
 	public boolean isInMemory() {
 		return fIsInMemory;
 	}
 
+	/**
+	 * Gets the driver vendor.
+	 *
+	 * @return the driver vendor
+	 */
 	public String getDriverVendor() {
 		return fDriverVendor;
 	}
 
+	/**
+	 * Gets the driver type.
+	 *
+	 * @return the driver type
+	 */
 	public String getDriverType() {
 		return fDriverType;
 	}
 
+	/**
+	 * Gets the driver class.
+	 *
+	 * @return the driver class
+	 */
 	public String getDriverClass() {
 		return fDriverClass;
 	}
 
+	/**
+	 * Gets the hibernate dialect.
+	 *
+	 * @return the hibernate dialect
+	 */
 	public String getHibernateDialect() {
 		return fHibernateDialect;
 	}
 
+	/**
+	 * Gets the product features.
+	 *
+	 * @return the product features
+	 */
 	public String getProductFeatures() {
 		return fProductFeatures;
 	}
 
+	/**
+	 * Gets the product configurations.
+	 *
+	 * @return the product configurations
+	 */
 	public String getProductConfigurations() {
 		return fProductConfigurations;
 	}
 
+	/**
+	 * Gets the entity property base ID.
+	 *
+	 * @return the entity property base ID
+	 */
 	public String getEntityPropertyBaseID() {
 		return fEntityPropertyBaseID;
 	}
 
+	/**
+	 * Gets the entity property base UUID.
+	 *
+	 * @return the entity property base UUID
+	 */
 	public String getEntityPropertyBaseUUID() {
 		return fEntityPropertyBaseUUID;
 	}
 
+	/**
+	 * Gets the persistence batch writing.
+	 *
+	 * @return the persistence batch writing
+	 */
 	public String getPersistenceBatchWriting() {
 		return fPersistenceBatchWriting;
 	}
 
+	/**
+	 * Jdbc url.
+	 *
+	 * @param driverVendor
+	 *            the driver vendor
+	 * @param driverType
+	 *            the driver type
+	 * @param serverName
+	 *            the server name
+	 * @param serverPort
+	 *            the server port
+	 * @param databaseName
+	 *            the database name
+	 * @param jdbUrlFormat
+	 *            the jdb url format
+	 * @param timezone
+	 *            the timezone
+	 * @param username
+	 *            the username
+	 * @param password
+	 *            the password
+	 * @return the string
+	 */
 	public String jdbcUrl(String driverVendor, String driverType, String serverName, int serverPort,
-			String databaseName, String jdbUrlFormat) {
+			String databaseName, String jdbUrlFormat, String timezone, String username, String password) {
 		if ((driverVendor == null) || driverVendor.trim().isEmpty()) {
 			driverVendor = fDriverVendor; // NOSONAR
 		}
@@ -411,18 +767,45 @@
 		if (serverName == null) {
 			serverName = "???"; // NOSONAR
 		}
+		// for sqlserver ....
+		String serverInstance = "";
+		int idx=serverName.indexOf('\\');
+		if ( idx >= 0 ) {
+			serverInstance=serverName.substring(idx+1);
+			serverName=serverName.substring(0,idx);
+		}
+		
 		if (serverPort == 0) {
 			serverPort = -1; // NOSONAR
 		}
+		
+		String databaseSchema=databaseName;
+		if ( databaseSchema.contains("/") ) {
+			databaseSchema = databaseSchema.replaceAll(".*/", ""); 
+		}
+		
 		String format = ((jdbUrlFormat != null) && !jdbUrlFormat.isEmpty()) ? jdbUrlFormat : fJdbcUrlFormat;
 		String retcode = format // NOSONAR
 				.replaceAll(VARIABLE.VENDOR, driverVendor).replaceAll(VARIABLE.TYPE, driverType)
 				.replaceAll(VARIABLE.SERVER, serverName).replaceAll(VARIABLE.PORT, ((Integer) serverPort).toString())
 				.replaceAll(VARIABLE.DATABASE, databaseName)
-				.replaceAll(VARIABLE.USERHOME, System.getProperty("user.home").replace(java.io.File.separator, "/"));
+				.replaceAll(VARIABLE.DATABASESCHEMA, databaseSchema)
+				.replaceAll(VARIABLE.SERVERINSTANCE, serverInstance)
+				.replaceAll(VARIABLE.USERHOME, System.getProperty("user.home").replace(java.io.File.separator, "/")+"/")
+				.replaceAll(VARIABLE.TIMEZONE, timezone)
+				.replaceAll(VARIABLE.USERNAME, username)
+				.replaceAll(VARIABLE.PASSWORD, password);
+		
 		return retcode;
 	}
 
+	/**
+	 * Supports property key.
+	 *
+	 * @param key
+	 *            the key
+	 * @return true, if successful
+	 */
 	public boolean supportsPropertyKey(String key) {
 		if (fPropertyKeys.isEmpty()) {
 			return true;
diff --git a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/IProductConfigurationPrefs.java b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/IProductConfigurationPrefs.java
index 41ab9ee..47e5224 100644
--- a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/IProductConfigurationPrefs.java
+++ b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/IProductConfigurationPrefs.java
@@ -140,8 +140,6 @@
 
 	public abstract String getDatainterchangeConfiguration();
 	
-	public abstract String getSignalConfiguration();
-	
 	public abstract boolean isMavenActivated();
 
 	public abstract String getReportPrinter(String reportName);
diff --git a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/Preference.java b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/Preference.java
index b2ddc85..8141edf 100644
--- a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/Preference.java
+++ b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/Preference.java
@@ -58,7 +58,6 @@
 	HYBRID_REFRESH_PERSPECTIVE_INACTIVE,
 	JAVA_POS_CONFIGURATION,
 	DATAINTERCHANGE_CONFIGURATION,
-	SIGNAL_CONFIGURATION,
 	LDAP_CONTEXT_FACTORY_URL,
 	LDAP_REALM_PORTAL_ID,
 	LDAP_USER_DN_TEMPLATE,
diff --git a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductConfiguration.java b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductConfiguration.java
index a79c6b0..ace2ec4 100644
--- a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductConfiguration.java
+++ b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductConfiguration.java
@@ -407,12 +407,4 @@
 	public static String getDatainterchangeConfiguration() {
 		return prefs().getDatainterchangeConfiguration();
 	}
-	
-	public static String getSignalConfiguration() {
-		return prefs().getSignalConfiguration();
-	}
-	
-	public static void setSignalConfiguration(String value) {
-		prefs().setSignalConfiguration(value);
-	}
 }
diff --git a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductConfigurationDefaultPrefs.java b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductConfigurationDefaultPrefs.java
index f4abb5f..c7af50b 100644
--- a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductConfigurationDefaultPrefs.java
+++ b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductConfigurationDefaultPrefs.java
@@ -31,18 +31,23 @@
  */
 public class ProductConfigurationDefaultPrefs implements IProductConfigurationPrefs {
 
+	public static final String MSSQL = "sqlserver";
 	public static final String MYSQL = "mysql";
+	public static final String MYSQL8 = "mysql8";
 	public static final String ORACLE = "oracle";
 	public static final String PASSWORD_HINT = "<password>";		// NOSONAR
 	public static final String USERNAME_HINT = "<username>";
 	public static final String DATABASE_HINT = "<database>";
 	public static final String H2MEMORY = "H2MEMORY";
 	public static final String DERBYLOCALFILE = "DERBYLOCALFILE";
+	public static final String DERBYLOCALFILEFILE = "%%USERHOME%%/derbylocaldb";
 	public static final String H2LOCALFILE = "H2LOCALFILE";
+	public static final String H2LOCALFILEFILE = "%%USERHOME%%/h2localdb";
 	public static final String DERBYMEMORY = "DERBYMEMORY";
 	public static final String IP_OR_HOST = "<ip-or-host>";
 	public static final String BPM_ENGINE_PERSISTENCE_UNIT = "bpm";
 	
+	@Override
 	public String getBusinessBundleClassNameReadOnly() {
 		return "";
 	}
@@ -54,20 +59,26 @@
 		initializeIfNotExists (ORACLE, ORACLE,
 			EnumDatabaseVendor.ORACLE, IP_OR_HOST, 1521, DATABASE_HINT, USERNAME_HINT, PASSWORD_HINT);
 		/* === datasource using a MySQL database === */
+		initializeIfNotExists (MSSQL, null,
+			EnumDatabaseVendor.MSSQL, IP_OR_HOST, 1433, DATABASE_HINT, USERNAME_HINT, "");
+		/* === datasource using a MySQL database === */
 		initializeIfNotExists (MYSQL, null,
 			EnumDatabaseVendor.MYSQL, IP_OR_HOST, 3306, DATABASE_HINT, USERNAME_HINT, "");
+		/* === datasource using a MySQL database === */
+		initializeIfNotExists (MYSQL8, null,
+			EnumDatabaseVendor.MYSQL8, IP_OR_HOST, 3306, DATABASE_HINT, USERNAME_HINT, "");
 		/* === datasource using a H2 in-Memory database === */
 		initializeIfNotExists (ProductConfigurationPrefs.DEFAULT_H2MEMORY_DATASOURCE, null,
 			EnumDatabaseVendor.H2_IN_MEMORY, null, -1, H2MEMORY, H2MEMORY, H2MEMORY); // NOSONAR
 		/* === datasource using a H2 local-file database === */
 		initializeIfNotExists (ProductConfigurationPrefs.DEFAULT_H2LOCALFILE_DATASOURCE, null,
-			EnumDatabaseVendor.H2_LOCAL_FILE, null, -1, H2LOCALFILE, H2LOCALFILE, H2LOCALFILE);
+			EnumDatabaseVendor.H2_LOCAL_FILE, null, -1, H2LOCALFILEFILE, H2LOCALFILE, H2LOCALFILE);
 		/* === datasource using a Derby in-Memory database === */
 		initializeIfNotExists (ProductConfigurationPrefs.DEFAULT_DERBYMEMORY_DATASOURCE, null,
 			EnumDatabaseVendor.DERBY_IN_MEMORY, null, -1, DERBYMEMORY, DERBYMEMORY, DERBYMEMORY);
 		/* === datasource using a Derby local-file database === */
 		initializeIfNotExists (ProductConfigurationPrefs.DEFAULT_DERBYLOCALFILE_DATASOURCE, null,
-			EnumDatabaseVendor.DERBY_LOCAL_FILE, null, -1, DERBYLOCALFILE, DERBYLOCALFILE, DERBYLOCALFILE);
+			EnumDatabaseVendor.DERBY_LOCAL_FILE, null, -1, DERBYLOCALFILEFILE, DERBYLOCALFILE, DERBYLOCALFILE);
 		/* === datasource using a Derby database === */
 		initializeIfNotExists (ProductConfigurationPrefs.DEFAULT_DERBYSERVER_DATASOURCE, null,
 			EnumDatabaseVendor.DERBY_CLIENT, IP_OR_HOST, 1527, DATABASE_HINT, USERNAME_HINT, PASSWORD_HINT);
@@ -210,6 +221,7 @@
 		return 10000;
 	}
 
+	@Override
 	public final String getAuthenticationOrganizationId() {
 		return "FoodMart";
 	}
@@ -329,9 +341,7 @@
 		Locale[] supported = new Locale[] {
 				Locale.GERMAN,
 				Locale.ENGLISH,
-				Locale.FRENCH,
-				new Locale("de", "AT"),
-				Locale.US
+				Locale.FRENCH
 		};
 		for	(Locale locale : supported) {
 			languages.put(locale.toString(), locale);
@@ -466,11 +476,6 @@
 	}
 
 	@Override
-	public String getSignalConfiguration() {
-		return "";
-	}
-
-	@Override
 	public boolean isMavenActivated() {
 		return false;
 	}
diff --git a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductConfigurationPrefs.java b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductConfigurationPrefs.java
index 28a4a27..328bb02 100644
--- a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductConfigurationPrefs.java
+++ b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductConfigurationPrefs.java
@@ -19,6 +19,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.text.SimpleDateFormat;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
@@ -40,6 +41,7 @@
 import org.eclipse.core.internal.preferences.EclipsePreferences;
 import org.eclipse.core.internal.preferences.InstancePreferences;
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IWorkspace;
@@ -55,6 +57,7 @@
 import org.eclipse.core.runtime.preferences.IScopeContext;
 import org.eclipse.core.variables.VariablesPlugin;
 import org.eclipse.persistence.config.PersistenceUnitProperties;
+import org.joda.time.DateTimeZone;
 import org.osgi.service.prefs.BackingStoreException;
 import org.osgi.service.prefs.Preferences;
 import org.slf4j.Logger;
@@ -140,7 +143,6 @@
 	private Boolean emailUseSslOnConnect;
 	private String javaPosConfiguration;
 	private String datainterchangeConfiguration;
-	private String signalConfiguration;
 
 	public static final String BUSINESS_BUNDLE_CLASS_NAME = "BUSINESS_BUNDLE_CLASS_NAME_read_only";
 	
@@ -182,11 +184,6 @@
 	private static final String DATAINTERCHANGE_NODE = "datainterchange";
 	private static final String DATAINTERCHANGE_CONFIGURATION = "datainterchangeConfiguration";
 	
-	/* ========================= Signal initializer =========================== */
-	
-	private static final String SIGNAL_NODE = "signal";
-	private static final String SIGNAL_CONFIGURATION = "signalConfiguration";
-	
 	/* ========================= authentication initializer =========================== */
 	
 	public static final String AUTHENTICATION_NODE = "authentication";
@@ -258,6 +255,7 @@
 	private static final String DATASOURCE_DRIVER_CLASS = "driver.class";
 	private static final String DATASOURCE_SERVER_NAME = "server.name";
 	private static final String DATASOURCE_SERVER_PORT = "server.port";
+	private static final String DATASOURCE_SERVER_TIMEZONE = "server.timezone";
 	private static final String DATASOURCE_DATABASE_NAME = "database.name";
 	private static final String DATASOURCE_DATABASE_USER = "database.user";
 	private static final String DATASOURCE_DATABASE_PASS = "database.pass";
@@ -345,7 +343,7 @@
 	}
 
 	public Set<EnumDatabaseVendor> getDataBaseVendors() {
-		TreeSet<EnumDatabaseVendor> result = new TreeSet<EnumDatabaseVendor>();
+		TreeSet<EnumDatabaseVendor> result = new TreeSet<>();
 		for	(String pu : getPersistenceUnitNames()) {
 			addDataBaseVendor(result, getPersistenceUnitJndiName(pu));
 		}
@@ -353,7 +351,7 @@
 	}
 
 	public Set<EnumDatabaseVendor> getDataBaseVendors(String... jndiNames) {
-		TreeSet<EnumDatabaseVendor> result = new TreeSet<EnumDatabaseVendor>();
+		TreeSet<EnumDatabaseVendor> result = new TreeSet<>();
 		for	(String jndiName : jndiNames) {
 			addDataBaseVendor(result, jndiName);
 		}
@@ -398,6 +396,7 @@
 		this(name, scopeContext, false, null);
 	}
 
+	@Override
 	public IProject getProject() {
 		if	(project instanceof IProject) {
 			return project;
@@ -448,46 +447,65 @@
 		}
 	}
 	
-	public static IResource getPrefsFile(IProject project) {
-		IResource prefsFile = null;
+	public static IResource getPrefsFile(IResource project) {
+		if( (project instanceof IProject ) && ! ((IProject)project).isOpen() )
+			return null;
 		try {
-			for (IResource resource : project.members()) {
-				if	((resource instanceof IFile) && "product".equals(resource.getFileExtension())) {
-					try {
-						String[] tokens = IOUtils.toString(((IFile)resource).getContents()).split("-DproductConfigurationFile=");
-						if	(tokens.length > 1) {
-							String filePath = tokens[1].replace('\r', ' ').replace('\n', ' ').replace('\t', ' ').split(" ")[0].replace("DEFAULTFILE", PREFERENCES_FULL_PATH);
-							// The following line is required to perform a string substitution. 
-							// In case of having a file path with placeholders this will replace them with the defined string in the eclipse string substitution preferences:
-							// Reference > Preferences > Run/Debug > String Substitution
-							filePath = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(filePath);
-							File handle = new File(filePath); 
-							if	(handle.exists()) {
-							    String fileName = handle.getAbsolutePath();
-							    IWorkspace space = ResourcesPlugin.getWorkspace();
-							    IWorkspaceRoot root=space.getRoot();
-							    try { // NOSONAR
-							    	IFile[] resources = root.findFilesForLocationURI(new File(fileName).toURI());
-							    	if	(resources != null) {
-							    		prefsFile = resources[0];
-							    		break;
-							    	}
-							    }
-							    catch (Exception e) { // NOSONAR
-							    	e.printStackTrace();
-							    } // NOSONAR
-							}
+			
+			IResource[] rl=null;
+
+			if (project instanceof IProject )	rl=((IProject)project).members();
+			if (project instanceof IFolder )	rl=((IFolder)project).members();
+			
+			for (IResource resource : rl) {
+				if ( resource.exists() ) {
+					if ( (resource instanceof IFolder ) ) {
+						IResource f = getPrefsFile( resource);
+						if ( f != null ) {
+							return f;
 						}
-					} catch (IOException e) {
-						e.printStackTrace(); // NOSONAR
-					}
-				} // NOSONAR
+					} else if ((resource instanceof IFile) && "product".equals(resource.getFileExtension())) {
+						try {
+							String[] tokens = IOUtils.toString(((IFile)resource).getContents()).split("-DproductConfigurationFile=");
+							if	(tokens.length > 1) {
+								String filePath = tokens[1].replace('\r', ' ').replace('\n', ' ').replace('\t', ' ').split(" ")[0].replace("DEFAULTFILE", PREFERENCES_FULL_PATH);
+								// The following line is required to perform a string substitution. 
+								// In case of having a file path with placeholders this will replace them with the defined string in the eclipse string substitution preferences:
+								// Reference > Preferences > Run/Debug > String Substitution
+								filePath = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(filePath);
+								File handle = new File(filePath); 
+								if	(handle.exists()) {
+								    String fileName = handle.getAbsolutePath();
+								    IWorkspace space = ResourcesPlugin.getWorkspace();
+								    IWorkspaceRoot root=space.getRoot();
+								    try { // NOSONAR
+								    	IFile[] resources = root.findFilesForLocationURI(new File(fileName).toURI());
+								    	if	(resources != null) {
+								    		for ( IFile f : resources ) {
+								    			if ( f.exists() ) {
+								    				return f;
+								    			}
+								    		}
+								    	}
+								    	LOGGER.error("Preferences file not found: {}",fileName);
+								    }
+								    catch (Exception e) { // NOSONAR
+								    	e.printStackTrace();
+								    } // NOSONAR
+								}
+						    	LOGGER.error("Preferences file not found: {}",filePath);
+							}
+						} catch (IOException e) {
+							e.printStackTrace(); // NOSONAR
+						}
+					} // NOSONAR
+				}
 			}
 		}
 		catch (CoreException e) { // NOSONAR
 			e.printStackTrace();  // NOSONAR
 		} 
-		return prefsFile;
+		return null;
 	}
 
 
@@ -503,6 +521,7 @@
 	 * @return URL to server with the daily Euro Foreign Exchange Reference
 	 *         Rates
 	 */
+	@Override
 	public String getEuroXRefRatesURLDaily() {
 		initialize();
 		return euroForeignExchangeReferenceRatesURLDaily;
@@ -513,6 +532,7 @@
 	 * @return URL to server with the previous Euro Foreign Exchange Reference
 	 *         Rates
 	 */
+	@Override
 	public String getEuroXRefRatesURLPrevious() {
 		initialize();
 		return euroForeignExchangeReferenceRatesURLPrevious;
@@ -521,6 +541,7 @@
 	/**
 	 * @return name of the server running the ActiveMQ Broker Service
 	 */
+	@Override
 	public String getActiveMqBrokerServerName() {
 		initialize();
 		return activeMqBrokerServerName;
@@ -529,6 +550,7 @@
 	/**
 	 * @return port of the server running the ActiveMQ Broker Service
 	 */
+	@Override
 	public int getActiveMqBrokerServerPort() {
 		initialize();
 		return activeMqBrokerServerPort;
@@ -537,6 +559,7 @@
 	/**
 	 * @return milliseconds for refresher in an active hybrid ccng view
 	 */
+	@Override
 	public int getHybridRefresherMilliSecsActive() {
 		initialize();
 		return hybridRefresherMilliSecsActive;
@@ -545,6 +568,7 @@
 	/**
 	 * @return milliseconds for refresher in an inactive hybrid ccng view
 	 */
+	@Override
 	public int getHybridRefresherMilliSecsInactive() {
 		initialize();
 		return hybridRefresherMilliSecsInactive;
@@ -553,6 +577,7 @@
 	/**
 	 * @return list of name of all defined DataSources
 	 */
+	@Override
 	public Collection<DataSourceConfiguration> getDataSources() {
 		initialize();
 		return dataSources.values();
@@ -654,12 +679,27 @@
 	/**
 	 * @return list of name of all defined DataSources
 	 */
+	@Override
 	public Collection<PersistenceUnitConfiguration> getPersistenceUnits() {
 		initialize();
 		return persistenceUnits.values();
 	}
 
 	/**
+	 * @return JNDI name for the given persistence unit
+	 */
+	public PersistenceUnitConfiguration getPersistenceUnit(String persistenceUnitName) {
+		initialize();
+		PersistenceUnitConfiguration puConfig = persistenceUnits.get(persistenceUnitName);
+		if (puConfig!=null){
+			return puConfig;
+		} else {
+			LOGGER.error("No persistence unit named '{}' found. Check the defined persistence unit of your entity.",persistenceUnitName);
+			return null;
+		}
+	}
+	
+	/**
 	 * @return list of name of all defined DataSources
 	 */
 	public Set<String> getPersistenceUnitNames() {
@@ -671,12 +711,10 @@
 	 * @return JNDI name for the given persistence unit
 	 */
 	public String getPersistenceUnitJndiName(String persistenceUnitName) {
-		initialize();
-		PersistenceUnitConfiguration puConfig = persistenceUnits.get(persistenceUnitName);
+		PersistenceUnitConfiguration puConfig = getPersistenceUnit(persistenceUnitName);
 		if (puConfig!=null){
 			return puConfig.getJndiName();
 		} else {
-			LOGGER.error("No persistence unit named '" + persistenceUnitName + "' found. Check the defined persistence unit of your entity.");
 			return null;
 		}
 	}
@@ -698,7 +736,12 @@
 	 * @return the ddl generation flag
 	 */
 	public String getPersistenceUnitParameterizedEclipseLinkDdlGeneration(String persistenceUnitName) {
-		return persistenceUnits.get(persistenceUnitName).getDdlGeneration();
+		PersistenceUnitConfiguration puConfig = getPersistenceUnit(persistenceUnitName);
+		if (puConfig!=null){
+			return puConfig.getDdlGeneration();
+		} else {
+			return null;
+		}
 	}
 
 	/**
@@ -729,12 +772,12 @@
 	 */
 	public Properties getPersistenceUnitProperties(
 			String persistenceUnitName, CommonDataSource dataSource, ClassLoader classLoader) {
-		initialize();
-		if (persistenceUnits.containsKey(persistenceUnitName)) {
-			return persistenceUnits.get(persistenceUnitName)
-					.getPersistenceUnitProperties(dataSource, classLoader);
+		PersistenceUnitConfiguration puConfig = getPersistenceUnit(persistenceUnitName);
+		if (puConfig!=null){
+			return puConfig.getPersistenceUnitProperties(dataSource, classLoader);
+		} else {
+			return null;
 		}
-		return null;
 	}
 
 	@Override
@@ -747,6 +790,7 @@
 	 * @return port of the RESTful authentication API, needed by the hybrid
 	 *         WebClient cxauth
 	 */
+	@Override
 	public final int getAuthRESTfulPort() {
 		initialize();
 		return authRESTfulApiPort;
@@ -755,6 +799,7 @@
 	/**
 	 * @return decide remember-me function performs an auto-login or not
 	 */
+	@Override
 	public final boolean hasAutoLogin() {
 		initialize();
 		return autoLogin;
@@ -763,11 +808,13 @@
 	/**
 	 * @return hide remember-me function if true
 	 */
+	@Override
 	public final boolean hasNoRememberMe() {
 		initialize();
 		return noRememberMe;
 	}
 	
+	@Override
 	public final int getDtoRealmPortalId() {
 		initialize();
 		try {
@@ -780,6 +827,7 @@
 		return 1;
 	}
 	
+	@Override
 	public final int getLdapRealmPortalId() {
 		initialize();
 		try {
@@ -792,6 +840,7 @@
 		return 1;
 	}
 	
+	@Override
 	public final String getLdapContextFactoryUrl() {
 		initialize();
 		try {
@@ -806,6 +855,7 @@
 		return "ldap://<ldapserver>:389";
 	}
 	
+	@Override
 	public final String getLdapUserDnTemplate() {
 		initialize();
 		try {
@@ -841,21 +891,25 @@
 	/**
 	 * @return maximum failed login attempts
 	 */
+	@Override
 	public final int getMaxLoginAttempts() {
 		initialize();
 		return maxLoginAttempts;
 	}
 
+	@Override
 	public final String getProtocolDatasource() {
 		initialize();
 		return protocolDatasource;
 	}
 
+	@Override
 	public final String getProtocolUnit() {
 		initialize();
 		return protocolUnit;
 	}
 
+	@Override
 	public final boolean getIdentifyByUsername() {
 		initialize();
 		return identifyByUsername;
@@ -914,26 +968,31 @@
 		}
 	}
 
+	@Override
 	public Map<String, Locale> getLanguages() {
 		initialize();
 		return languages;
 	}
 
+	@Override
 	public boolean isLanguagesAutotranslate() {
 		initialize();
 		return languagesAutotranslate;
 	}
 
+	@Override
 	public boolean willLanguagesAutocreate() {
 		initialize();
 		return languagesAutocreate;
 	}
 
+	@Override
 	public boolean isUomoMetricUnit() {
 		initialize();
 		return uomoMetricUnit;
 	}
 	
+	@Override
 	public boolean showLanguageSelectInRespectiveLocale() {
 		initialize();
 		return showLanguageSelectInRespectiveLocale;
@@ -942,6 +1001,7 @@
 	/**
 	 * @return show theme tool control if true
 	 */
+	@Override
 	public final boolean hasDemoToolsTheme() {
 		initialize();
 		return demoToolsTheme;
@@ -950,6 +1010,7 @@
 	/**
 	 * @return show langauge tool control if true
 	 */
+	@Override
 	public final boolean hasDemoToolsLanguage() {
 		initialize();
 		return demoToolsLanguage;
@@ -958,6 +1019,7 @@
 	/**
 	 * @return show print service tool control if true
 	 */
+	@Override
 	public final boolean hasToolsPrintService() {
 		initialize();
 		return demoToolsPrintService;
@@ -966,6 +1028,7 @@
 	/**
 	 * @return use absolute location for project wizard if true
 	 */
+	@Override
 	public final boolean projectWizardUsesAbsoluteLocation() {
 		initialize();
 		return projectWizardAbsoluteLocation;
@@ -1117,6 +1180,7 @@
 				put(dataSource, DATASOURCE_DRIVER_CLASS,  dsc.getDriverClass());
 				put(dataSource, DATASOURCE_SERVER_NAME,   dsc.getServerName());
 				put(dataSource, DATASOURCE_SERVER_PORT,   dsc.getServerPort());
+				put(dataSource, DATASOURCE_SERVER_TIMEZONE,   dsc.getServerTimezone());
 				put(dataSource, DATASOURCE_DATABASE_NAME, dsc.getDatabaseName());
 				put(dataSource, DATASOURCE_DATABASE_USER, dsc.getDatabaseUser());
 				put(dataSource, DATASOURCE_DATABASE_PASS, dsc.getDatabasePass());
@@ -1207,21 +1271,25 @@
 				showLanguageSelectInRespectiveLocale);
 	}
 
+	@Override
 	public String getBusinessBundleClassNameReadOnly() {
 		initialize();
 		return businessBundleClassNameReadOnly;
 	}
 
+	@Override
 	public String getBpmServerIp() {
 		initialize();
 		return bpmServerIp;
 	}
 
+	@Override
 	public int getBpmServerPort() {
 		initialize();
 		return bpmServerPort;
 	}
 
+	@Override
 	public int getBpmResponseTimeout() {
 		initialize();
 		return bpmResponseTimeout;
@@ -1312,7 +1380,7 @@
 //			Preferences myInstanceNode = root.node(project.getName()).node(InstanceScope.SCOPE).node(PRODUCT_PREFERENCES);
 //			return (IEclipsePreferences) myInstanceNode;
 //???			return applyCustomizedPreferenceDirectory((IEclipsePreferences) scopeContext.getNode(InstanceScope.SCOPE).node(PRODUCT_PREFERENCES));
-			return applyCustomizedPreferenceDirectory((IEclipsePreferences) scopeContext.getNode(PRODUCT_PREFERENCES));
+			return applyCustomizedPreferenceDirectory(scopeContext.getNode(PRODUCT_PREFERENCES));
 		}
 		else {
 			return scopeContext.getNode(PRODUCT_PREFERENCES);
@@ -1553,11 +1621,6 @@
 				exceptions.add(e);
 			}
 			try {
-				initializeSignal();
-			} catch (Exception e) {
-				exceptions.add(e);
-			}
-			try {
 				initializeLanguages();
 			} catch (Exception e) {
 				exceptions.add(e);
@@ -1665,12 +1728,6 @@
 		datainterchangeConfiguration = datainterchange.get(DATAINTERCHANGE_CONFIGURATION, defaultPrefs.getDatainterchangeConfiguration());
 	}
 	
-	private void initializeSignal() throws Exception {
-		Preferences signal = getProductPreferencesNode(SIGNAL_NODE);
-		// --- read all preferences ---
-		signalConfiguration = signal.get(SIGNAL_CONFIGURATION, defaultPrefs.getSignalConfiguration());
-	}
-	
 	private void initializeReadOnly() throws Exception {
 		Preferences readOnly = getProductPreferences();
 		businessBundleClassNameReadOnly = readOnly.get(BUSINESS_BUNDLE_CLASS_NAME, "");
@@ -1768,6 +1825,8 @@
 			if	(serverPort >= 0) {
 				put(dataSourcePref, DATASOURCE_SERVER_PORT, serverPort);
 			}
+			
+			put(dataSourcePref, DATASOURCE_SERVER_TIMEZONE, DateTimeZone.forID( ZoneId.systemDefault().normalized().toString()).getNameKey(0) );
 			put(dataSourcePref, DATASOURCE_DATABASE_NAME, database);
 			put(dataSourcePref, DATASOURCE_DATABASE_USER, username);
 			put(dataSourcePref, DATASOURCE_DATABASE_PASS, password);
@@ -1783,9 +1842,15 @@
 		/* === datasource using a Oracle database === */
 		initializeIfNotExists (root, dataSourcesPrefs, ProductConfigurationDefaultPrefs.ORACLE, ProductConfigurationDefaultPrefs.ORACLE, 
 			EnumDatabaseVendor.ORACLE, ProductConfigurationDefaultPrefs.IP_OR_HOST, 1521, ProductConfigurationDefaultPrefs.DATABASE_HINT, ProductConfigurationDefaultPrefs.USERNAME_HINT, ProductConfigurationDefaultPrefs.PASSWORD_HINT);
+		/* === datasource using a Microsoft SQLserver database === */
+		initializeIfNotExists (root, dataSourcesPrefs, ProductConfigurationDefaultPrefs.MSSQL, null,
+			EnumDatabaseVendor.MSSQL, "localhost", 1433, ProductConfigurationDefaultPrefs.DATABASE_HINT, ProductConfigurationDefaultPrefs.USERNAME_HINT, "");
 		/* === datasource using a MySQL database === */
 		initializeIfNotExists (root, dataSourcesPrefs, ProductConfigurationDefaultPrefs.MYSQL, null,
-			EnumDatabaseVendor.MYSQL, "<ip-or-host>", 3306, ProductConfigurationDefaultPrefs.DATABASE_HINT, ProductConfigurationDefaultPrefs.USERNAME_HINT, "");
+			EnumDatabaseVendor.MYSQL, "localhost", 3306, ProductConfigurationDefaultPrefs.DATABASE_HINT, ProductConfigurationDefaultPrefs.USERNAME_HINT, "");
+		/* === datasource using a MySQL8 database === */
+		initializeIfNotExists (root, dataSourcesPrefs, ProductConfigurationDefaultPrefs.MYSQL8, null,
+			EnumDatabaseVendor.MYSQL8, "localhost", 3306, ProductConfigurationDefaultPrefs.DATABASE_HINT, ProductConfigurationDefaultPrefs.USERNAME_HINT, "");
 		/* === datasource using a H2 in-Memory database === */
 		initializeIfNotExists (root, dataSourcesPrefs, DEFAULT_H2MEMORY_DATASOURCE, null,
 			EnumDatabaseVendor.H2_IN_MEMORY, null, -1, ProductConfigurationDefaultPrefs.H2MEMORY, ProductConfigurationDefaultPrefs.H2MEMORY, ProductConfigurationDefaultPrefs.H2MEMORY); // NOSONAR
@@ -1811,6 +1876,7 @@
 			String driverClass = dataSource.get(DATASOURCE_DRIVER_CLASS, "");
 			String serverName = dataSource.get(DATASOURCE_SERVER_NAME, "");
 			int serverPort = dataSource.getInt(DATASOURCE_SERVER_PORT, 0);
+			String serverTimezone = dataSource.get(DATASOURCE_SERVER_TIMEZONE, DateTimeZone.forID( ZoneId.systemDefault().normalized().toString()).getNameKey(0));
 			String databaseUser = dataSource.get(DATASOURCE_DATABASE_USER, "");
 			String databasePass = dataSource.get(DATASOURCE_DATABASE_PASS, "");
 			String jdbcUrlFormat = dataSource.get(DATASOURCE_JDBC_URL_FORMAT, null);
@@ -1821,7 +1887,7 @@
 						vendor,
 						driverVendor, driverType, driverClass, serverName,
 						serverPort, databaseName, databaseUser, databasePass,
-						jdbcUrlFormat);
+						jdbcUrlFormat, serverTimezone);
 				dataSources.put(dataSourceName, configuration);
 			}
 		}
@@ -2045,15 +2111,6 @@
 	public String getDatainterchangeConfiguration() {
 		return datainterchangeConfiguration;
 	}
-
-	@Override
-	public String getSignalConfiguration() {
-		return signalConfiguration;
-	}
-	
-	public void setSignalConfiguration(String value) {
-		this.signalConfiguration = put(SIGNAL_NODE, SIGNAL_CONFIGURATION, value);
-	}
 	
 	@Override
 	public boolean isMavenActivated() {
diff --git a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductFileConfigurations.xtend b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductFileConfigurations.xtend
index 057a8fb..ee4776c 100644
--- a/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductFileConfigurations.xtend
+++ b/org.eclipse.osbp.preferences/src/org/eclipse/osbp/preferences/ProductFileConfigurations.xtend
@@ -42,6 +42,8 @@
 		prepareSerialized(
 		'''
       ${{NECESSARY_DATA_BASE_VENDOR_CONFIGURATIONS}}
+      <plugin id="org.apache.aries.spifly.dynamic.bundle" autoStart="true" startLevel="2" />
+      <plugin id="org.apache.aries.util" autoStart="true" startLevel="2" />
       <plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="0" />
       <plugin id="org.eclipse.e4.ui.services" autoStart="false" startLevel="1" />
       <plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
@@ -60,7 +62,8 @@
       <plugin id="org.eclipse.osbp.runtime.typeprovider.bundlespace" autoStart="true" startLevel="0" />
       <plugin id="org.eclipse.osbp.utils.entitymock.dbfill.ui" autoStart="true" startLevel="0" />
       <plugin id="org.eclipse.osgi" autoStart="true" startLevel="-1" />
-		''')
+      <plugin id="org.objectweb.asm.commons" autoStart="true" startLevel="2" />		
+      ''')
 	}
 
 	override getRecommendedAsString() {
diff --git a/org.eclipse.osbp.preferences/xtend-gen/org/eclipse/osbp/preferences/ProductFileConfigurations.java b/org.eclipse.osbp.preferences/xtend-gen/org/eclipse/osbp/preferences/ProductFileConfigurations.java
index 0cf299b..558bdd5 100644
--- a/org.eclipse.osbp.preferences/xtend-gen/org/eclipse/osbp/preferences/ProductFileConfigurations.java
+++ b/org.eclipse.osbp.preferences/xtend-gen/org/eclipse/osbp/preferences/ProductFileConfigurations.java
@@ -2,10 +2,10 @@
  * 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 2.0 
+ * are made available under the terms of the Eclipse Public License 2.0
  * which accompanies this distribution, and is available at
  * https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  * SPDX-License-Identifier: EPL-2.0
  * 
  * Contributors:
@@ -56,6 +56,10 @@
     StringConcatenation _builder = new StringConcatenation();
     _builder.append("${{NECESSARY_DATA_BASE_VENDOR_CONFIGURATIONS}}");
     _builder.newLine();
+    _builder.append("<plugin id=\"org.apache.aries.spifly.dynamic.bundle\" autoStart=\"true\" startLevel=\"2\" />");
+    _builder.newLine();
+    _builder.append("<plugin id=\"org.apache.aries.util\" autoStart=\"true\" startLevel=\"2\" />");
+    _builder.newLine();
     _builder.append("<plugin id=\"org.eclipse.core.runtime\" autoStart=\"true\" startLevel=\"0\" />");
     _builder.newLine();
     _builder.append("<plugin id=\"org.eclipse.e4.ui.services\" autoStart=\"false\" startLevel=\"1\" />");
@@ -92,6 +96,8 @@
     _builder.newLine();
     _builder.append("<plugin id=\"org.eclipse.osgi\" autoStart=\"true\" startLevel=\"-1\" />");
     _builder.newLine();
+    _builder.append("<plugin id=\"org.objectweb.asm.commons\" autoStart=\"true\" startLevel=\"2\" />\t\t");
+    _builder.newLine();
     return this.prepareSerialized(_builder.toString());
   }
   
diff --git a/org.eclipse.osbp.preferences/xtend-gen/org/eclipse/osbp/preferences/ProductFileFeatures.java b/org.eclipse.osbp.preferences/xtend-gen/org/eclipse/osbp/preferences/ProductFileFeatures.java
index 9fc521f..570efc9 100644
--- a/org.eclipse.osbp.preferences/xtend-gen/org/eclipse/osbp/preferences/ProductFileFeatures.java
+++ b/org.eclipse.osbp.preferences/xtend-gen/org/eclipse/osbp/preferences/ProductFileFeatures.java
@@ -2,10 +2,10 @@
  * 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 2.0 
+ * are made available under the terms of the Eclipse Public License 2.0
  * which accompanies this distribution, and is available at
  * https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  * SPDX-License-Identifier: EPL-2.0
  * 
  * Contributors:
