diff --git a/jenkins.build.config.xml b/jenkins.build.config.xml
index b5a47f4..9c87d0e 100644
--- a/jenkins.build.config.xml
+++ b/jenkins.build.config.xml
@@ -17,9 +17,15 @@
 <jenkins>
 	<!-- DO NOT EDIT BELOW THIS LINE -->
         <jenkins.build.dependencies>
+                <jenkins.build.dependency>org.eclipse.osbp.blob</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.core.api</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.dsl</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.ecview.addons</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.ecview.core</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.jpa.services</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.mondrian.api</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.preferences</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.runtime</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.ui.api</jenkins.build.dependency>
         </jenkins.build.dependencies>
 </jenkins>
diff --git a/org.eclipse.osbp.persistence/META-INF/MANIFEST.MF b/org.eclipse.osbp.persistence/META-INF/MANIFEST.MF
index 0a41230..d966c37 100644
--- a/org.eclipse.osbp.persistence/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.persistence/META-INF/MANIFEST.MF
@@ -18,7 +18,7 @@
  commons-vfs-osgi;bundle-version="[1.0.0,1.0.1)",
  jackrabbit-jcr-commons-osgi;bundle-version="[2.1.0,2.1.1)",
  jackrabbit-webdav-osgi;bundle-version="[2.3.3,2.3.4)",
- mondrian.osgi;bundle-version="[3.5.0,3.5.1)",
+ mondrian.osgi;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.persistence.jpa;bundle-version="2.6.0",
  org.eclipse.persistence.asm;bundle-version="3.3.1",
  org.eclipse.persistence.antlr;bundle-version="3.2.0",
@@ -27,14 +27,37 @@
  org.eclipse.osbp.gitinfo;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.runtime.common;bundle-version="[0.9.0,0.10.0)",
  org.apache.felix.gogo.runtime,
- javax.validation.api
+ javax.validation.api,
+ org.h2;bundle-version="1.3.168",
+ joda-time;bundle-version="2.7.0",
+ org.eclipse.e4.core.contexts;bundle-version="1.5.1",
+ org.eclipse.e4.ui.di;bundle-version="1.1.100",
+ org.eclipse.emf.ecore;bundle-version="2.12.0",
+ org.eclipse.emf.mwe.core;bundle-version="1.3.20",
+ org.eclipse.equinox.ds;bundle-version="1.4.400",
+ org.eclipse.osbp.blob;bundle-version="0.9.0",
+ org.eclipse.osbp.dsl.datatype.lib;bundle-version="0.9.0",
+ org.eclipse.osbp.dsl.dto.lib;bundle-version="0.9.0",
+ org.eclipse.osbp.ecview.core.common;bundle-version="0.9.0",
+ org.eclipse.osbp.ecview.dsl.lib;bundle-version="0.9.0",
+ org.eclipse.osbp.jpa.services;bundle-version="0.9.0",
+ org.eclipse.persistence.jpa.jpql;bundle-version="2.6.1",
+ org.joda.money;bundle-version="0.10.0",
+ org.eclipse.uomo.core;bundle-version="0.6.0",
+ org.eclipse.uomo.units;bundle-version="0.6.0",
+ org.eclipse.xtext.xbase.lib;bundle-version="2.11.0",
+ org.jsoup;bundle-version="1.8.3",
+ org.junit;bundle-version="4.12.0",
+ osgi.enterprise;bundle-version="4.2.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Eclipse OSBP
 Import-Package: org.eclipse.osbp.core.api.persistence;version="0.9.0",
  org.eclipse.osbp.mondrian.api;version="0.9.0",
+ org.eclipse.osbp.ui.api.metadata;version="0.9.0",
  org.osgi.service.component;version="1.2.0",
  org.osgi.service.jdbc;version="1.0.0"
 Export-Package: org.eclipse.osbp.persistence
 Service-Component: OSGI-INF/*.xml
 Bundle-Activator: org.eclipse.osbp.persistence.Activator
 Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: .
diff --git a/org.eclipse.osbp.persistence/OSGI-INF/org.eclipse.osbp.persistence.PersistenceService.xml b/org.eclipse.osbp.persistence/OSGI-INF/org.eclipse.osbp.persistence.PersistenceService.xml
index a00f709..8dbfcd8 100644
--- a/org.eclipse.osbp.persistence/OSGI-INF/org.eclipse.osbp.persistence.PersistenceService.xml
+++ b/org.eclipse.osbp.persistence/OSGI-INF/org.eclipse.osbp.persistence.PersistenceService.xml
@@ -3,6 +3,7 @@
    <service>
       <provide interface="org.eclipse.osbp.core.api.persistence.IPersistenceService"/>
    </service>
+   <reference bind="bindDSLMetadataService" cardinality="1..1" interface="org.eclipse.osbp.ui.api.metadata.IDSLMetadataService" name="DSLMetadataService" policy="static" unbind="unbindDSLMetadataService"/>
    <reference bind="bindMondrianProvider" cardinality="1..1" interface="org.eclipse.osbp.mondrian.api.IMondrianManager" name="MondrianProvider" policy="dynamic" unbind="unbindMondrianProvider"/>
    <reference bind="bindValidationFactory" cardinality="1..1" interface="javax.validation.ValidatorFactory" name="ValidationFactory" policy="dynamic" unbind="unbindValidationFactory"/>
    <implementation class="org.eclipse.osbp.persistence.PersistenceService"/>
diff --git a/org.eclipse.osbp.persistence/build.properties b/org.eclipse.osbp.persistence/build.properties
index 5776bd7..02889b3 100644
--- a/org.eclipse.osbp.persistence/build.properties
+++ b/org.eclipse.osbp.persistence/build.properties
@@ -1,5 +1,9 @@
 output.. = target/classes/
-bin.includes = about.properties,  about.mappings,  about.ini,  about.html,  META-INF/,\
+bin.includes = about.properties,\
+               about.mappings,\
+               about.ini,\
+               about.html,\
+               META-INF/,\
                OSGI-INF/,\
                .settings/,\
                .,\
diff --git a/org.eclipse.osbp.persistence/src/org/eclipse/osbp/persistence/CustomPersistenceProvider.java b/org.eclipse.osbp.persistence/src/org/eclipse/osbp/persistence/CustomPersistenceProvider.java
new file mode 100644
index 0000000..2df0129
--- /dev/null
+++ b/org.eclipse.osbp.persistence/src/org/eclipse/osbp/persistence/CustomPersistenceProvider.java
@@ -0,0 +1,28 @@
+package org.eclipse.osbp.persistence;
+
+import java.util.Properties;
+
+import javax.persistence.EntityManagerFactory;
+
+import org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl;
+import org.eclipse.persistence.internal.jpa.deployment.SEPersistenceUnitInfo;
+import org.eclipse.persistence.jpa.PersistenceProvider;
+import org.eclipse.persistence.tools.schemaframework.TableCreator;
+
+public class CustomPersistenceProvider extends PersistenceProvider {
+
+	public EntityManagerFactory createEntityManagerFactory(SEPersistenceUnitInfo puInfo, Properties properties) {
+		/** 
+		 * this static setting forces creating of tables and indexes although already existing
+		 * and creates late introduced indexes
+		 */
+        TableCreator.CHECK_EXISTENCE = true;
+        EntityManagerFactoryImpl emf = createEntityManagerFactoryImpl(puInfo, properties, true);
+        if(emf != null) {
+	        emf.close();
+	        TableCreator.CHECK_EXISTENCE = false;
+			return createEntityManagerFactoryImpl(puInfo, properties, true);
+        }
+        return null;
+	}
+}
diff --git a/org.eclipse.osbp.persistence/src/org/eclipse/osbp/persistence/EntityClassLoader.java b/org.eclipse.osbp.persistence/src/org/eclipse/osbp/persistence/EntityClassLoader.java
new file mode 100644
index 0000000..715d793
--- /dev/null
+++ b/org.eclipse.osbp.persistence/src/org/eclipse/osbp/persistence/EntityClassLoader.java
@@ -0,0 +1,49 @@
+package org.eclipse.osbp.persistence;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
+
+public class EntityClassLoader extends ClassLoader {
+	private IDSLMetadataService dslMetadataService;
+	private final Map<String, Class<?>> cachedClasses = new HashMap<>();
+	
+	public EntityClassLoader(ClassLoader parent, IDSLMetadataService dslMetadataService) {
+		super(parent);
+		this.dslMetadataService = dslMetadataService;
+	}
+
+	@Override
+	protected Class<?> findClass(String className) throws ClassNotFoundException {
+		if(cachedClasses.containsKey(className)) {
+			return cachedClasses.get(className);
+		}
+		return super.findClass(className);
+	}
+
+	@Override
+	public Class<?> loadClass(String className) throws ClassNotFoundException {
+		if(!cachedClasses.containsKey(className)) {
+			ClassLoader loader = dslMetadataService.getClassLoader(className);
+			if (loader != null) {
+				Class<?> clz = loader.loadClass(className);
+				cachedClasses.put(className, clz);
+				return clz;
+			} 
+			return super.loadClass(className);
+		} else {
+			return cachedClasses.get(className);
+		}
+	}
+
+	@Override
+	public InputStream getResourceAsStream(String resourceName) {
+		ClassLoader loader = dslMetadataService.getClassLoader(resourceName);
+		if (loader != null) {
+			return loader.getResourceAsStream(resourceName);
+		}
+		return super.getResourceAsStream(resourceName);
+	}
+}
diff --git a/org.eclipse.osbp.persistence/src/org/eclipse/osbp/persistence/PersistenceService.java b/org.eclipse.osbp.persistence/src/org/eclipse/osbp/persistence/PersistenceService.java
index 40abe3f..48a91c6 100644
--- a/org.eclipse.osbp.persistence/src/org/eclipse/osbp/persistence/PersistenceService.java
+++ b/org.eclipse.osbp.persistence/src/org/eclipse/osbp/persistence/PersistenceService.java
@@ -20,6 +20,7 @@
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Hashtable;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -28,7 +29,9 @@
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceException;
 import javax.sql.CommonDataSource;
+import javax.sql.ConnectionPoolDataSource;
 import javax.sql.DataSource;
 import javax.sql.XAConnection;
 import javax.sql.XADataSource;
@@ -39,12 +42,18 @@
 import org.eclipse.osbp.core.api.persistence.IPersistenceService;
 import org.eclipse.osbp.mondrian.api.IMondrianManager;
 import org.eclipse.osbp.mondrian.api.IMondrianService;
+import org.eclipse.osbp.preferences.DataSourceConfiguration.DataSourceItemDescription;
 import org.eclipse.osbp.preferences.ProductConfiguration;
+import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
 import org.eclipse.persistence.config.PersistenceUnitProperties;
 import org.eclipse.persistence.config.SystemProperties;
+import org.eclipse.persistence.config.TargetServer;
+import org.eclipse.persistence.exceptions.DatabaseException;
 import org.eclipse.persistence.internal.jpa.deployment.ArchiveFactoryImpl;
+import org.eclipse.persistence.internal.jpa.deployment.SEPersistenceUnitInfo;
 import org.eclipse.persistence.jpa.PersistenceProvider;
 import org.eclipse.persistence.sessions.Session;
+import org.h2.tools.Server;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Filter;
 import org.osgi.framework.InvalidSyntaxException;
@@ -67,66 +76,153 @@
 import mondrian.rolap.RolapConnection;
 import mondrian.server.Execution;
 
+/**
+ * The Class PersistenceService.
+ */
 @Component(service = IPersistenceService.class)
 public class PersistenceService implements IPersistenceService {
+	
+	/** The Constant OSGI_JNDI_SERVICE_NAME. */
 	public static final String OSGI_JNDI_SERVICE_NAME = "osgi.jndi.service.name";
+	
+	/** The Constant OSGI_JNDI_URL_PREFIX. */
 	public static final String OSGI_JNDI_URL_PREFIX = "osgi:service/";
+	
+	/** The Constant JAVAX_PERSISTENCE_PROVIDER_PROP. */
 	public static final String JAVAX_PERSISTENCE_PROVIDER_PROP = "javax.persistence.provider";
+	
+	/** The Constant PERSISTENCE_PROVIDER. */
 	public static final String PERSISTENCE_PROVIDER = "javax.persistence.spi.PersistenceProvider";
+	
+	/** The Constant ENTITYMANAGERFACTORY. */
 	public static final String ENTITYMANAGERFACTORY = "javax.persistence.EntityManagerFactory";
+	
+	/** The Constant OSGI_UNIT_NAME. */
 	public static final String OSGI_UNIT_NAME = "osgi.unit.name";
+	
+	/** The Constant FILTER_EMF. */
 	private static final String FILTER_EMF = "(objectClass=javax.persistence.EntityManagerFactory)";
+	
+	/** The Constant FILTER_EMF_WITH_PERSISTENCE. */
 	private static final String FILTER_EMF_WITH_PERSISTENCE = "(&(objectClass=javax.persistence.EntityManagerFactory)(osgi.unit.name=%s))";
 
+	/** The Constant log. */
 	private static final Logger log = LoggerFactory.getLogger(PersistenceService.class);
+	
+	/** The mondrian manager. */
 	private IMondrianManager mondrianManager;
 
+	/** The bundle context. */
 	private BundleContext bundleContext = null;
+	
+	/** The service registration. */
 	private ServiceRegistration<?> serviceRegistration;
+	
+	/** The ds props map. */
 	private Map<String, IDataSourceProperties> dsPropsMap = new HashMap<>();
+	
+	/** The ds map. */
 	private Map<String, CommonDataSource> dsMap = new HashMap<>();
+	
+	/** The persistence exception handler. */
 	private List<IPersistenceException> persistenceExceptionHandler = new ArrayList<>() ;
+	
+	/** The validator factory. */
 	private ValidatorFactory validatorFactory;
+	
+	/** The em factories. */
 	private HashMap<String, EntityManagerFactory> emFactories = new HashMap<>();
+	
+	/** The h2 servers. */
+	private Server tcpServer = null;
+	private Server webServer = null;
 
+	/** The entity class loader. */
+	private EntityClassLoader entityClassLoader;
+	
+	/** The dsl metadata service. */
+	protected static IDSLMetadataService dslMetadataService;
+
+
+	/**
+	 * Activate.
+	 *
+	 * @param context the context
+	 */
 	protected void activate(ComponentContext context) {
 		if (log.isDebugEnabled())
-			log.debug("PersistenceService activated");
+			log.debug("{}", "PersistenceService activated");
 		initialize(context);
 	}
 
+	/**
+	 * Deactivate.
+	 *
+	 * @param context the context
+	 */
 	protected void deactivate(ComponentContext context) { //NOSONAR
+		if(tcpServer != null) {
+			tcpServer.shutdown();
+		}
+		if(webServer != null) {
+			webServer.shutdown();
+		}
 		if (serviceRegistration != null) {
 			serviceRegistration.unregister();
 		} else {
 			if (log.isDebugEnabled())
-				log.debug("serviceRegistration not set, cannot unregister");
+				log.debug("{}", "serviceRegistration not set, cannot unregister");
 		}
 		if (log.isDebugEnabled())
-			log.debug("PersistenceService deactivated");
+			log.debug("{}", "PersistenceService deactivated");
 	}
 
+	/**
+	 * Bind mondrian provider.
+	 *
+	 * @param mondrianManager the mondrian manager
+	 */
 	@Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC)
 	void bindMondrianProvider(IMondrianManager mondrianManager) {
 		this.mondrianManager = mondrianManager;
 	}
 
+	/**
+	 * Unbind mondrian provider.
+	 *
+	 * @param mondrianManager the mondrian manager
+	 */
 	void unbindMondrianProvider(IMondrianManager mondrianManager) {		//NOSONAR 
 		this.mondrianManager = null;
 	}
 
+	/**
+	 * Bind validation factory.
+	 *
+	 * @param validatorFactory the validator factory
+	 */
 	@Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC)
 	void bindValidationFactory(ValidatorFactory validatorFactory) {
 		this.validatorFactory = validatorFactory;
 	}
 
+	/**
+	 * Unbind validation factory.
+	 *
+	 * @param validatorFactory the validator factory
+	 */
 	void unbindValidationFactory(ValidatorFactory validatorFactory) {	//NOSONAR
 		this.validatorFactory = null;
 	}
 
+	/**
+	 * Initialize.
+	 *
+	 * @param context the context
+	 */
 	public void initialize(ComponentContext context) {
 		if (log.isDebugEnabled())
-			log.debug("initializing PersistenceService");
+			log.debug("{}", "initializing PersistenceService");
 		bundleContext = context.getBundleContext();
 		// build properties map
 		createDataSourcePropertiesMap();
@@ -135,10 +231,19 @@
 		initDataSourceMap();
 		// register persistence provider in context
 		registerPersistenceProvider();
+		// our dynamic class loader
+		entityClassLoader = new EntityClassLoader(getClass().getClassLoader(), dslMetadataService);
+		// create all emf
+		createEntityManagerFactories();
 		if (log.isDebugEnabled())
-			log.debug("PersistenceService ready");
+			log.debug("{}", "PersistenceService ready");
 	}
 
+	/**
+	 * Show possible configuration errors.
+	 *
+	 * @param logger the logger
+	 */
 	public static void showPossibleConfigurationErrors(Logger logger) {
 		String[] messages = {
 				"Maybe misconfigured data sources? Verify configuration in Product properties for missing plugins or configuration!" };
@@ -147,6 +252,9 @@
 		}
 	}
 
+	/**
+	 * Creates the data source properties map.
+	 */
 	private void createDataSourcePropertiesMap() {
 		for (String name : ProductConfiguration.getDataSourceNames()) {
 			IDataSourceProperties dsProp = new DataSourceProperties(name);
@@ -156,13 +264,25 @@
 		}
 	}
 
+	/**
+	 * Lookup dsf.
+	 *
+	 * @param clientDriverName the client driver name
+	 * @return the data source factory
+	 */
 	private DataSourceFactory lookupDsf(String clientDriverName) {
 		String filter = "(&(" + DataSourceFactory.OSGI_JDBC_DRIVER_CLASS + "=" + clientDriverName + "))";
 		if (log.isDebugEnabled())
-			log.debug("Filter is: " + filter);
+			log.debug("Filter is: {}", filter);
 		return getDsf(filter);
 	}
 
+	/**
+	 * Gets the dsf.
+	 *
+	 * @param filter the filter
+	 * @return the dsf
+	 */
 	@SuppressWarnings("unchecked")
 	private DataSourceFactory getDsf(String filter) {
 		ServiceReference<DataSourceFactory>[] refs = null;
@@ -180,28 +300,93 @@
 		return (refs == null) ? null : bundleContext.getService(refs[0]);
 	}
 
-	private synchronized DataSource createDataSource(String jndiDatasource) {
-		DataSource ds = null;
+	/**
+	 * Creates the data source.
+	 *
+	 * @param jndiDatasource the jndi datasource
+	 * @return the connection pool data source
+	 */
+	private synchronized ConnectionPoolDataSource createDataSource(String jndiDatasource) {
+		ConnectionPoolDataSource ds = null;
 		try {
 			if (log.isDebugEnabled())
-				log.debug("createDataSource:" + jndiDatasource);
+				log.debug("createDataSource: {}", jndiDatasource);
 			IDataSourceProperties dsProps = dsPropsMap.get(jndiDatasource);
 			DataSourceFactory dsf = null;
 			if (dsProps != null) {
 				dsf = lookupDsf(dsProps.getClientDriverName());
 				if (dsf == null) {
-					log.error("Driver {} for {} not installed! If you want to use the driver, you have to add it to the .product configuration file!", dsProps.getClientDriverName(), jndiDatasource);
+					log.info("createDataSource: Driver {} for {} not installed! If you want to use the driver, you have to add it to the .product configuration file!", dsProps.getClientDriverName(), jndiDatasource);
 					return null;
 				}
 				Properties props=dsProps.getDataSourceProperties();
-				ds = dsf.createDataSource(props);
+				if ( log.isInfoEnabled() ) {
+					log.info("createDataSource: Driver {} for Datasource {} found with the following properties:", dsProps.getClientDriverName(), jndiDatasource);
+				    Iterator<Entry<Object, Object>> it = props.entrySet().iterator();
+				    while (it.hasNext()) {
+				        Entry<Object, Object> pair = it.next();
+				        if( pair.getKey().equals("password") ) {
+							if ( log.isDebugEnabled() ) {
+								log.debug("  {}={}", pair.getKey(), pair.getValue() );
+							} else {
+								log.info("  {}=******", pair.getKey() );
+							}
+				        } else {
+							log.info("  {}={}", pair.getKey(), pair.getValue() );
+				        }
+				    }
+				}
+				
+				ds = dsf.createConnectionPoolDataSource(props);
 				Hashtable<String, String> ht = new Hashtable<>();	// NOSONAR
 				ht.put(OSGI_JNDI_SERVICE_NAME, jndiDatasource);
-				bundleContext.registerService(DataSource.class, ds, ht);
+				if( bundleContext.registerService(ConnectionPoolDataSource.class, ds, ht) == null ) {
+					log.error("createDataSource: RegisterService for Driver {} for Datasource {} failed!", dsProps.getClientDriverName(), jndiDatasource);
+				}
 				if ( log.isInfoEnabled() ) {
-					log.info("Driver {} for Datasource {} found and registered!", dsProps.getClientDriverName(), jndiDatasource);
-					log.info("         url:        {}", props.getProperty("url"));
+					log.info("createDataSource: Driver {} for Datasource {} registered!", dsProps.getClientDriverName(), jndiDatasource);
+				}
+
+				if(ProductConfiguration.getDataSource(jndiDatasource).getValue(DataSourceItemDescription.SERVER_PORT) != null) {
+					Integer port = Integer.parseInt(ProductConfiguration.getDataSource(jndiDatasource).getValue(DataSourceItemDescription.SERVER_PORT));
+					if(tcpServer == null && dsProps.getClientDriverName().contains(".h2.") && port > 0) {
+						// create a h2 server for remote access
+						tcpServer = Server.createTcpServer("-tcp","-tcpAllowOthers","-tcpPort", port.toString()).start();
+						log.info("H2 TcpServer startet on port {}", port );
+					}
+					if(webServer == null && dsProps.getClientDriverName().contains(".h2.") && port > 0) {
+						// create a h2 server for remote access
+						port ++;
+						webServer = Server.createWebServer("-web","-webAllowOthers","-webPort", port.toString()).start();
+						log.info("H2 Web Server startet on port {}", port );
+					}
+				}
+			}
+		} catch (Exception e) {
+			log.error("createDataSource {} failed {}", jndiDatasource, e);
+		}
+		return ds;
+	}
+
+	private synchronized DataSource createSimpleDataSource(String jndiDatasource) {
+		DataSource ds = null;
+		try {
+			if (log.isDebugEnabled())
+				log.debug("createSimpleDataSource: {}", jndiDatasource);
+			IDataSourceProperties dsProps = dsPropsMap.get(jndiDatasource);
+			DataSourceFactory dsf = null;
+			if (dsProps != null) {
+				dsf = lookupDsf(dsProps.getClientDriverName());
+				if (dsf == null) {
+					log.info("createSimpleDataSource: Driver {} for {} not installed! If you want to use the driver, you have to add it to the .product configuration file!", dsProps.getClientDriverName(), jndiDatasource);
+					return null;
+				}
+				Properties props=dsProps.getDataSourceProperties();
+				if ( log.isInfoEnabled() ) {
+					log.info("createSimpleDataSource: Driver {} for Datasource {} found with the following properties:", dsProps.getClientDriverName(), jndiDatasource);
+					log.info("         url:        {}", props.getProperty("URL"));
 					log.info("         Servername: {}", props.getProperty("serverName"));
+					log.info("         Port:       {}", props.getProperty("portNumber"));
 					log.info("         Database:   {}", props.getProperty("databaseName"));
 					log.info("         User:       {}", props.getProperty("user"));
 				}
@@ -210,18 +395,48 @@
 				} else {
 					log.info("         Password:   {}", props.getProperty("password").replaceAll("..", "*#"));
 				}
+				
+				ds = dsf.createDataSource(props);
+				Hashtable<String, String> ht = new Hashtable<>();	// NOSONAR
+				ht.put(OSGI_JNDI_SERVICE_NAME, jndiDatasource);
+				if( bundleContext.registerService(DataSource.class, ds, ht) == null ) {
+					log.error("createSimpleDataSource: RegisterService for Driver {} for Datasource {} failed!", dsProps.getClientDriverName(), jndiDatasource);
+				}
+				if ( log.isInfoEnabled() ) {
+					log.info("createSimpleDataSource: Driver {} for Datasource {} registered!", dsProps.getClientDriverName(), jndiDatasource);
+				}
+
+				if(ProductConfiguration.getDataSource(jndiDatasource).getValue(DataSourceItemDescription.SERVER_PORT) != null) {
+					Integer port = Integer.parseInt(ProductConfiguration.getDataSource(jndiDatasource).getValue(DataSourceItemDescription.SERVER_PORT));
+					if(tcpServer == null && dsProps.getClientDriverName().contains(".h2.") && port > 0) {
+						// create a h2 server for remote access
+						tcpServer = Server.createTcpServer("-tcp","-tcpAllowOthers","-tcpPort", port.toString()).start();
+						log.info("H2 TcpServer startet on port {}", port );
+					}
+					if(webServer == null && dsProps.getClientDriverName().contains(".h2.") && port > 0) {
+						// create a h2 server for remote access
+						port ++;
+						webServer = Server.createWebServer("-web","-webAllowOthers","-webPort", port.toString()).start();
+						log.info("H2 Web Server startet on port {}", port );
+					}
+				}
 			}
 		} catch (Exception e) {
-			log.error("createDataSource '" + jndiDatasource + "' " + e.getClass().getCanonicalName(), e);
+			log.error("createSimpleDataSource {} failed {}", jndiDatasource, e);
 		}
 		return ds;
 	}
-
+	/**
+	 * Creates the XA data source.
+	 *
+	 * @param jndiDatasource the jndi datasource
+	 * @return the XA data source
+	 */
 	private synchronized XADataSource createXADataSource(String jndiDatasource) {
 		XADataSource ds = null;
 		try {
 			if (log.isDebugEnabled())
-				log.debug("createXADataSource:" + jndiDatasource);
+				log.debug("createXADataSource:{}", jndiDatasource);
 			IDataSourceProperties dsProps = dsPropsMap.get(jndiDatasource);
 			DataSourceFactory dsf = null;
 			if (dsProps != null) {
@@ -240,19 +455,36 @@
 		return ds;
 	}
 
+	/**
+	 * Lookup DS.
+	 *
+	 * @param jndiDatasource the jndi datasource
+	 * @return the data source
+	 * @throws NamingException the naming exception
+	 */
 	private DataSource lookupDS(String jndiDatasource) throws NamingException {
 		InitialContext ictx = new InitialContext();
 		return (DataSource) ictx.lookup(OSGI_JNDI_URL_PREFIX + jndiDatasource);
 	}
 
+	/**
+	 * Lookup XADS.
+	 *
+	 * @param jndiDatasource the jndi datasource
+	 * @return the XA data source
+	 * @throws NamingException the naming exception
+	 */
 	private XADataSource lookupXADS(String jndiDatasource) throws NamingException {
 		InitialContext ictx = new InitialContext();
 		return (XADataSource) ictx.lookup(OSGI_JNDI_URL_PREFIX + "XA" + jndiDatasource);
 	}
 
+	/**
+	 * Inits the data source map.
+	 */
 	public void initDataSourceMap() {
 		if (log.isDebugEnabled())
-			log.debug("initDataSourceMap");
+			log.debug("{}", "initDataSourceMap");
 		for (String jndiName : ProductConfiguration.getDataSourceNames()) {
 			CommonDataSource ds = getDataSource(jndiName);
 			if (ds != null) {
@@ -261,26 +493,43 @@
 		}
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#getDataSource(java.lang.String)
+	 */
 	@Override
 	// must be checked if DataSource or XADatasource is returned
 	public CommonDataSource getDataSource(String jndiDatasource) {
 		if (log.isDebugEnabled())
-			log.debug("getDataSource:" + jndiDatasource);
+			log.debug("getDataSource:{}", jndiDatasource);
 		if (dsMap.containsKey(jndiDatasource)) {
 			return dsMap.get(jndiDatasource);
 		}
+		ConnectionPoolDataSource cpds = null;
+		try {
+			cpds = (ConnectionPoolDataSource) lookupDS(jndiDatasource);
+		} catch (NamingException e) {			// NOSONAR
+		} finally {
+			if (cpds == null) {
+				cpds = createDataSource(jndiDatasource);
+			}
+		}
+		if (cpds != null) {
+			return cpds;
+		}
+/*	
 		DataSource ds = null;
 		try {
 			ds = lookupDS(jndiDatasource);
 		} catch (NamingException e) {			// NOSONAR
 		} finally {
 			if (ds == null) {
-				ds = createDataSource(jndiDatasource);
+				ds = createSimpleDataSource(jndiDatasource);
 			}
 		}
 		if (ds != null) {
 			return ds;
 		}
+*/				
 		XADataSource xads = null;
 		try {
 			xads = lookupXADS(jndiDatasource);
@@ -293,40 +542,55 @@
 		return xads;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#getJndiConnection(java.lang.String)
+	 */
 	@Override
 	public java.sql.Connection getJndiConnection(String jndiName) throws SQLException {
 		if (log.isDebugEnabled())
-			log.debug("getConnection:" + jndiName);
+			log.debug("getConnection:{}", jndiName);
 		if (dsMap.get(jndiName) instanceof DataSource) {
 			return ((DataSource) dsMap.get(jndiName)).getConnection();
 		}
 		return null;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#getPersistenceUnitConnection(java.lang.String)
+	 */
 	@Override
 	public java.sql.Connection getPersistenceUnitConnection(String persistenceUnit) throws SQLException {
 		return getJndiConnection(ProductConfiguration.getPersistenceUnitJndiName(persistenceUnit));
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#getXAJndiConnection(java.lang.String)
+	 */
 	@Override
 	public XAConnection getXAJndiConnection(String jndiName) throws SQLException {
 		if (log.isDebugEnabled())
-			log.debug("getXAConnection:" + jndiName);
+			log.debug("getXAConnection:{}", jndiName);
 		if (dsMap.get(jndiName) instanceof XADataSource) {
 			return ((XADataSource) dsMap.get(jndiName)).getXAConnection();
 		}
 		return null;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#getXAPersistenceUnitConnection(java.lang.String)
+	 */
 	@Override
 	public XAConnection getXAPersistenceUnitConnection(String persistenceUnit) throws SQLException {
 		return getXAJndiConnection(ProductConfiguration.getPersistenceUnitJndiName(persistenceUnit));
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#getMondrianConnection(java.lang.String, java.lang.String)
+	 */
 	@Override
 	public RolapConnection getMondrianConnection(String persistenceUnit, String cubePackageName) throws SQLException {
 		if (log.isDebugEnabled()) {
-			log.debug("mondrian connection:" + cubePackageName + " persistenceUnit:" + persistenceUnit);
+			log.debug("mondrian connection:{} persistenceUnit:{}", cubePackageName, persistenceUnit);
 		}
 
 		IMondrianService service = mondrianManager.getService(cubePackageName);
@@ -340,21 +604,30 @@
 		list.put("Catalog", service.getMondrianCatalogURL().toString());
 		String jndiName = ProductConfiguration.getPersistenceUnitJndiName(persistenceUnit);
 		if (log.isDebugEnabled())
-			log.debug("mondrian connection jndi:" + jndiName);
+			log.debug("mondrian connection jndi:{}", jndiName);
 		return (RolapConnection) DriverManager.getConnection(list, null, (DataSource) getDataSource(jndiName));
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#sendQuery(mondrian.rolap.RolapConnection, java.lang.String)
+	 */
 	@Override
 	public Result sendQuery(RolapConnection con, String query) {
 		return sendQuery(con, query, 10000);
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#sendQuery(mondrian.rolap.RolapConnection, java.lang.String, long)
+	 */
 	@Override
 	public Result sendQuery(RolapConnection con, String query, long ms) {
 		log.debug("query: {}", query);
 		return con.execute(new Execution(con.parseQuery(query).getStatement(), ms));
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#clearMondrianCache()
+	 */
 	@Override
 	public void clearMondrianCache() {
 		for(IMondrianService service : mondrianManager.getAllServices()) {
@@ -379,6 +652,9 @@
 		}
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#clearCubeCache(mondrian.rolap.RolapConnection, java.lang.String)
+	 */
 	@Override
 	public void clearCubeCache(RolapConnection connection, String cubeName) {
 		Cube cube = connection.getSchema().lookupCube(cubeName, true);
@@ -390,6 +666,9 @@
 		}
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#clearJpaCache()
+	 */
 	@Override
 	public void clearJpaCache() {
 		for(EntityManagerFactory emf:emFactories.values()) {
@@ -397,23 +676,9 @@
 		}
 	}
 	
-	@Override
-	public void registerPersistenceUnit(String persistenceUnitName, Class<?> cls) {
-		registerPersistenceUnit(persistenceUnitName, cls.getClassLoader());		
-	}
-	
-	@Override
-	public void registerPersistenceUnit(String persistenceUnitName, ClassLoader classLoader) {
-		// lookup entity manager factory
-		if (emFactories.containsKey(persistenceUnitName)) {
-			return;
-		}
-		EntityManagerFactory emf = createEntityManagerFactory(persistenceUnitName, classLoader);
-		if (emf != null) {
-			emFactories.put(persistenceUnitName, emf);
-		}
-	}
-
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#getEntityManagerFactory(java.lang.String)
+	 */
 	@Override
 	public EntityManagerFactory getEntityManagerFactory(String persistenceUnitName) {
 		if (emFactories.containsKey(persistenceUnitName)) {
@@ -423,9 +688,12 @@
 		return null;
 	}
 
+	/**
+	 * Register persistence provider.
+	 */
 	private void registerPersistenceProvider() {
 		// register persistence provider
-		PersistenceProvider persistence = new PersistenceProvider();
+		CustomPersistenceProvider persistence = new CustomPersistenceProvider();
 
 		Dictionary<String, String> props = new Hashtable<>();			// NOSONAR
 		props.put(JAVAX_PERSISTENCE_PROVIDER_PROP, persistence.getClass().getName());
@@ -433,29 +701,36 @@
 		// Required setting to be able to handle 'bundleresource' and 'bundleentry' protocol. DO NOT DELETE!
 		System.setProperty(SystemProperties.ARCHIVE_FACTORY, ArchiveFactoryImpl.class.getCanonicalName());
 		if (log.isDebugEnabled())
-			log.debug("persistence provider registered");
+			log.debug("{}", "persistence provider registered");
 	}
 
-	private EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, ClassLoader classLoader) {
+	/**
+	 * Creates the entity manager factory.
+	 *
+	 * @param persistenceUnitName the persistence unit name
+	 * @param classLoader the class loader
+	 * @return the entity manager factory
+	 */
+	private void createEntityManagerFactories() {
 		// retrieve persistence provider from context
 		EntityManagerFactory emf = null;
 		ServiceReference<?>[] refs = null;
-		String filter = "(&(" + JAVAX_PERSISTENCE_PROVIDER_PROP + "=org.eclipse.persistence.jpa.PersistenceProvider))";
+		String filter = "(&(" + JAVAX_PERSISTENCE_PROVIDER_PROP + "=" + CustomPersistenceProvider.class.getName() + "))";
 		try {
 			refs = bundleContext.getAllServiceReferences(PersistenceProvider.class.getName(), filter);
 		} catch (InvalidSyntaxException e) {
 			log.error("exception while retrieving persistence providers", e);
 		}
 		if ((refs == null) || (refs.length < 1)) {
-			log.error(
-					"no persistence providers found, therefore the entity manager factory was NOT created and NOT registered for unit name {}",
-							persistenceUnitName);
-		} else {
-			// register all persistence units' emfs
-			Properties properties = null;
+			log.error("{}", "no persistence providers found");
+			return;
+		}
+		CustomPersistenceProvider persistenceProvider = (CustomPersistenceProvider) bundleContext.getService(refs[0]);
+		// register all persistence units' emfs
+		for(String persistenceUnitName : ProductConfiguration.getPersistenceUnitNames()) {
 			String jndiName = ProductConfiguration.getPersistenceUnitJndiName(persistenceUnitName);
 			CommonDataSource ds = getDataSource(jndiName);
-			properties = ProductConfiguration.getPersistenceUnitProperties(persistenceUnitName, ds,	classLoader);
+			Properties properties = ProductConfiguration.getPersistenceUnitProperties(persistenceUnitName, ds,	entityClassLoader);
 			properties.put(PersistenceUnitProperties.DDL_GENERATION_INDEX_FOREIGN_KEYS, "true");
 			properties.put(PersistenceUnitProperties.VALIDATOR_FACTORY, validatorFactory);
 			properties.put(PersistenceUnitProperties.EXCEPTION_HANDLER_CLASS, "org.eclipse.osbp.persistence.fragment.PersistenceExceptionHandler");
@@ -465,41 +740,49 @@
 			properties.put(PersistenceUnitProperties.WEAVING_FETCHGROUPS, "true");
 			properties.put(PersistenceUnitProperties.WEAVING_CHANGE_TRACKING, "true");
 			properties.put(PersistenceUnitProperties.LOGGING_PARAMETERS, "true");
+			properties.put(PersistenceUnitProperties.PERSISTENCE_CONTEXT_FLUSH_MODE, "commit");
+			properties.put(PersistenceUnitProperties.CONNECTION_POOL_INITIAL, "50");
+			properties.put(PersistenceUnitProperties.CONNECTION_POOL_MIN, "50");
+			properties.put(PersistenceUnitProperties.CONNECTION_POOL_MAX, "200");
+			properties.put(PersistenceUnitProperties.CONNECTION_POOL_READ+PersistenceUnitProperties.CONNECTION_POOL_SHARED, "true");
+			properties.put(PersistenceUnitProperties.TARGET_SERVER, TargetServer.None);
+
+			properties.put(PersistenceUnitProperties.JAVASE_DB_INTERACTION, "true");
+			properties.put(PersistenceUnitProperties.DDL_GENERATION_MODE, "both");
+			properties.put(PersistenceUnitProperties.APP_LOCATION, System.getProperty("user.home"));
+			properties.put(PersistenceUnitProperties.CREATE_JDBC_DDL_FILE, persistenceUnitName+".sql");
 			
-			PersistenceProvider persistenceProvider = (PersistenceProvider) bundleContext.getService(refs[0]);
 			if (log.isInfoEnabled())
-				log.info("create entity manager factory for persistenceUnit " + persistenceUnitName + " jndi "
-						+ jndiName + " with properties:" + properties.toString());
+				log.info("create entity manager factory for persistenceUnit '{}' jndi '{}' with properties {}", persistenceUnitName, jndiName, properties.toString());
 			try {
-				emf = persistenceProvider.createEntityManagerFactory(persistenceUnitName, properties);
-			} catch (/* DatabaseException | PersistenceException | */Exception dbe) {
-				log.error("creating entity manager factory for " + persistenceUnitName, dbe);
-			}
-			if (emf != null) {
-				Session session = emf.unwrap(Session.class);
-				persistenceExceptionHandler.add((IPersistenceException) session.getExceptionHandler());
-				// register this factory -- attention: the same xa and non xa
-				// will replace each other
-				Dictionary<String, String> emfprops = new Hashtable<>();	//NOSONAR
-				emfprops.put(ENTITYMANAGERFACTORY, emf.getClass().getName());
-				emfprops.put(OSGI_UNIT_NAME, persistenceUnitName);
-				bundleContext.registerService(EntityManagerFactory.class.getName(), emf, emfprops);
-				if (log.isInfoEnabled())
-					log.info("entity manager factory created and registered with unit name:" + persistenceUnitName);
-			} else {
-				log.error(
-						"incorrect persistence provider, therefore the entity manager factory was NOT created and NOT registered for unit name: {}",
-								persistenceUnitName);
+				SEPersistenceUnitInfo info = (SEPersistenceUnitInfo)dslMetadataService.getPersistenceUnitInfo(persistenceUnitName);
+				emf = persistenceProvider.createEntityManagerFactory(info, properties);
+				if (emf != null) {
+					Session session = emf.unwrap(Session.class);
+					persistenceExceptionHandler.add((IPersistenceException) session.getExceptionHandler());
+					// register this factory -- attention: the same xa and non xa
+					// will replace each other
+					Dictionary<String, String> emfprops = new Hashtable<>();	//NOSONAR
+					emfprops.put(ENTITYMANAGERFACTORY, emf.getClass().getName());
+					emfprops.put(OSGI_UNIT_NAME, persistenceUnitName);
+					bundleContext.registerService(EntityManagerFactory.class.getName(), emf, emfprops);
+					log.info("entity manager factory created and registered with unit name: {}", persistenceUnitName);
+					emFactories.put(persistenceUnitName, emf);
+				} else {
+					log.error("the entity manager factory was NOT created and NOT registered for unit name: {}", persistenceUnitName);
+				}
+			} catch (DatabaseException | PersistenceException dbe) {
+				log.error("creating entity manager factory for pu '{}' failed with {}.", persistenceUnitName, dbe);
 			}
 		}
-		return emf;
 	}
 
-	/**
-	 * Create the filter to find the proper service.
-	 * 
-	 * @return
-	 * @throws InvalidSyntaxException
+	/* Create the filter to find the proper service.
+	 *
+	 * @param context the context
+	 * @param persistenceUnitName the persistence unit name
+	 * @return the filter
+	 * @throws InvalidSyntaxException the invalid syntax exception
 	 */
 	@Override
 	public Filter createEMFFilter(ComponentContext context, String persistenceUnitName) throws InvalidSyntaxException {
@@ -511,11 +794,17 @@
 		}
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#getEntityManagerFactoryMap()
+	 */
 	@Override
 	public Map<String, EntityManagerFactory> getEntityManagerFactoryMap() {
 		return emFactories;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#inheritEntityManagerFactoryMap(java.util.Map)
+	 */
 	@Override
 	public void inheritEntityManagerFactoryMap(Map<String, EntityManagerFactory> entityManagerFactoryMap) {
 		for (Entry<String, EntityManagerFactory> persistenceUnit : entityManagerFactoryMap.entrySet()) {
@@ -523,8 +812,35 @@
 		}
 	}
 	
+	/* (non-Javadoc)
+	 * @see org.eclipse.osbp.core.api.persistence.IPersistenceService#registerPersistenceExceptionNotification(org.eclipse.osbp.core.api.persistence.IPersistenceException.Receiver)
+	 */
 	@Override
 	public void registerPersistenceExceptionNotification(IPersistenceException.Receiver receiver) {
 		persistenceExceptionHandler.forEach(it -> it.registerNotification(receiver));
 	}
+
+	/**
+	 * Bind persistence service.
+	 *
+	 * @param persistenceService
+	 *            the persistence service
+	 */
+	@Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.STATIC)
+	public synchronized void bindDSLMetadataService(final IDSLMetadataService dslMetadataService) {
+		PersistenceService.dslMetadataService = dslMetadataService;
+		log.debug("DSLMetadataService bound");
+	}
+
+	/**
+	 * Unbind persistence service.
+	 *
+	 * @param persistenceService
+	 *            the persistence service
+	 */
+	public synchronized void unbindDSLMetadataService(final IDSLMetadataService dslMetadataService) { // NOSONAR
+		PersistenceService.dslMetadataService = null;
+		log.debug("DSLMetadataService unbound");
+	}
+
 }
