526880 - [REQU-65] Separation of interfaces

Change-Id: Id8406ea0dc0daa37179658f4375d6fa58c61832b
Signed-off-by: Matthias Koller <m.koller@peak-solution.de>
diff --git a/src/main/java/org/eclipse/mdm/api/base/BaseApplicationContext.java b/src/main/java/org/eclipse/mdm/api/base/BaseApplicationContext.java
new file mode 100644
index 0000000..99fda43
--- /dev/null
+++ b/src/main/java/org/eclipse/mdm/api/base/BaseApplicationContext.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2017 Peak Solution GmbH
+ * 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
+ */
+package org.eclipse.mdm.api.base;
+
+import java.util.Map;
+import java.util.Optional;
+
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.file.FileService;
+import org.eclipse.mdm.api.base.model.BaseEntityFactory;
+import org.eclipse.mdm.api.base.notification.NotificationService;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.base.search.SearchService;
+
+/**
+ * Base application context represents a connection/session to the underlying data store.
+ * It provides access to managers and services.
+ *
+ * @param <S>
+ *            Type of the connected entity factory.
+ * @param <T>
+ *            Type of the connected entity manager.
+ * @since 1.0.0
+ */
+public interface BaseApplicationContext<S extends BaseEntityFactory, T extends BaseEntityManager> extends AutoCloseable {
+	/**
+	 * The returned service loads entities from the underlying data source.
+	 *
+	 * @return {@code Optional} is empty if no such service is available.
+	 */
+	default Optional<T> getEntityManager() {
+		return Optional.empty();
+	}
+	
+	/**
+	 * The returned service creates new entities.
+	 *
+	 * @return {@code Optional} is empty if no such service is available.
+	 */
+	default Optional<S> getEntityFactory() {
+		return Optional.empty();
+	}
+
+	/**
+	 * The returned service provides access to the application model's meta data.
+	 *
+	 * @return {@code Optional} is empty if no such service is available.
+	 * @see ModelManager
+	 */
+	default Optional<ModelManager> getModelManager() {
+		return Optional.empty();
+	}
+
+	/**
+	 * The returned service provides advanced search capabilities for supported
+	 * entity types.
+	 *
+	 * @return {@code Optional} is empty if no such service is available.
+	 * @see SearchService
+	 */
+	default Optional<SearchService> getSearchService() {
+		return Optional.empty();
+	}
+
+	/**
+	 * The returned service provides access to the low level query API.
+	 *
+	 * @return {@code Optional} is empty if no such service is available.
+	 * @see QueryService
+	 */
+	default Optional<QueryService> getQueryService() {
+		return Optional.empty();
+	}
+	
+	/**
+	 * The returned service allows to download linked files from the file
+	 * storage.
+	 *
+	 * @return {@code Optional} is empty if no such service is available.
+	 * @see FileService
+	 */
+	default Optional<FileService> getFileService() {
+		return Optional.empty();
+	}
+	
+	/**
+	 * The returned service allows to register/unregister for events at a registration service.
+	 *
+	 * @return {@code Optional} is empty if no such service is available.
+	 * @see NotificationService
+	 */
+	default Optional<NotificationService> getNotificationService() {
+		return Optional.empty();
+	}
+	
+	/**
+	 * Returns a map with all configuration parameters, which where given to initialize this context.
+	 * 
+	 * @return map with configuration parameters
+	 */
+	Map<String, String> getParameters();
+	
+	/**
+	 * Closes the BaseContext.
+	 * 
+	 * This closes all underlying managers and services.
+	 */
+	void close() throws ConnectionException;
+}
diff --git a/src/main/java/org/eclipse/mdm/api/base/BaseApplicationContextFactory.java b/src/main/java/org/eclipse/mdm/api/base/BaseApplicationContextFactory.java
new file mode 100644
index 0000000..2f0ac30
--- /dev/null
+++ b/src/main/java/org/eclipse/mdm/api/base/BaseApplicationContextFactory.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2017 Peak Solution GmbH
+ * 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
+ */
+package org.eclipse.mdm.api.base;
+
+import java.util.Map;
+
+import org.eclipse.mdm.api.base.model.BaseEntityFactory;
+
+/**
+ * Takes connection parameters and produces a corresponding base application context.
+ *
+ * @param <T>
+ *            Type of the connected entity manager.
+ * @since 1.0.0
+ */
+public interface BaseApplicationContextFactory<T extends BaseApplicationContext<? extends BaseEntityFactory, ? extends BaseEntityManager>> {
+
+	/**
+	 * Takes given connection parameters and creates a new context, which
+	 * is permanently connected with configured data source.
+	 *
+	 * @param connectionParameters
+	 *            The connection parameters.
+	 * @return The connected context is returned.
+	 * @throws ConnectionException
+	 *             Thrown if unable to connect to a data source.
+	 */
+	T connect(Map<String, String> connectionParameters) throws ConnectionException;
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/mdm/api/base/BaseEntityManager.java b/src/main/java/org/eclipse/mdm/api/base/BaseEntityManager.java
index b7d8c7b..1588e59 100644
--- a/src/main/java/org/eclipse/mdm/api/base/BaseEntityManager.java
+++ b/src/main/java/org/eclipse/mdm/api/base/BaseEntityManager.java
@@ -15,7 +15,6 @@
 import java.util.Optional;
 
 import org.eclipse.mdm.api.base.massdata.ReadRequest;
-import org.eclipse.mdm.api.base.model.BaseEntityFactory;
 import org.eclipse.mdm.api.base.model.ContextDescribable;
 import org.eclipse.mdm.api.base.model.ContextRoot;
 import org.eclipse.mdm.api.base.model.ContextType;
@@ -26,8 +25,6 @@
 import org.eclipse.mdm.api.base.model.TestStep;
 import org.eclipse.mdm.api.base.model.User;
 import org.eclipse.mdm.api.base.query.DataAccessException;
-import org.eclipse.mdm.api.base.query.ModelManager;
-import org.eclipse.mdm.api.base.query.SearchService;
 
 /**
  * Provides business layer CRUD operations and services (CREATE, READ, UPDATE,
@@ -39,55 +36,13 @@
  * @author Viktor Stoehr, Gigatronik Ingolstadt GmbH
  * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
  */
-public interface BaseEntityManager<S extends BaseEntityFactory> {
+public interface BaseEntityManager {
 
 	// ======================================================================
 	// Public methods
 	// ======================================================================
 
 	/**
-	 * The returned service creates new entities.
-	 *
-	 * @return {@code Optional} is empty if no such service is available.
-	 */
-	default Optional<S> getEntityFactory() {
-		return Optional.empty();
-	}
-
-	/**
-	 * The returned service provides advanced search capabilities for supported
-	 * entity types.
-	 *
-	 * @return {@code Optional} is empty if no such service is available.
-	 * @see SearchService
-	 */
-	default Optional<SearchService> getSearchService() {
-		return Optional.empty();
-	}
-
-	/**
-	 * The returned service provides access to the low level query API and the
-	 * application model's meta data.
-	 *
-	 * @return {@code Optional} is empty if no such service is available.
-	 * @see ModelManager
-	 */
-	default Optional<ModelManager> getModelManager() {
-		return Optional.empty();
-	}
-
-	/**
-	 * The returned service allows to download linked files from the file
-	 * storage.
-	 *
-	 * @return {@code Optional} is empty if no such service is available.
-	 * @see FileService
-	 */
-	default Optional<FileService> getFileService() {
-		return Optional.empty();
-	}
-
-	/**
 	 * Returns the {@link Environment} this entity manager is connected to.
 	 *
 	 * @return The {@code Environment} is returned.
diff --git a/src/main/java/org/eclipse/mdm/api/base/EntityManagerFactory.java b/src/main/java/org/eclipse/mdm/api/base/EntityManagerFactory.java
deleted file mode 100644
index e153d44..0000000
--- a/src/main/java/org/eclipse/mdm/api/base/EntityManagerFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2016 Gigatronik Ingolstadt GmbH
- * 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
- */
-
-package org.eclipse.mdm.api.base;
-
-import java.util.Map;
-
-import org.eclipse.mdm.api.base.model.BaseEntityFactory;
-
-/**
- * Takes connection parameters and produces a corresponding entity manager.
- *
- * @param <T>
- *            Type of the connected entity manager.
- * @since 1.0.0
- * @author Viktor Stoehr, Gigatronik Ingolstadt GmbH
- */
-public interface EntityManagerFactory<T extends BaseEntityManager<? extends BaseEntityFactory>> {
-
-	// ======================================================================
-	// Public methods
-	// ======================================================================
-
-	/**
-	 * Takes given connection parameters and creates a new entity manager, which
-	 * is permanently connected with configured data source.
-	 *
-	 * @param connectionParameters
-	 *            The connection parameters.
-	 * @return The connected entity manager is returned.
-	 * @throws ConnectionException
-	 *             Thrown if unable to connect to a data source.
-	 */
-	T connect(Map<String, String> connectionParameters) throws ConnectionException;
-
-}
diff --git a/src/main/java/org/eclipse/mdm/api/base/NotificationManagerFactory.java b/src/main/java/org/eclipse/mdm/api/base/NotificationManagerFactory.java
deleted file mode 100644
index 5d51cbb..0000000
--- a/src/main/java/org/eclipse/mdm/api/base/NotificationManagerFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.eclipse.mdm.api.base;
-
-import java.util.Map;
-
-import org.eclipse.mdm.api.base.model.BaseEntityFactory;
-import org.eclipse.mdm.api.base.notification.NotificationManager;
-
-/**
- * Takes a base entity manager and connection parameters and produces a
- * corresponding notification manager.
- *
- * @since 1.0.0
- * @author Matthias Koller, Peak Solution GmbH
- */
-public interface NotificationManagerFactory {
-
-	/**
-	 * Creates a notification manager based on the given entity manager and
-	 * parameters
-	 *
-	 * @param entityManager
-	 *            The entityManager.
-	 * @param connectionParameters
-	 *            The connection parameters.
-	 * @return The configured NotificationManager is returned.
-	 * @throws ConnectionException
-	 *             Thrown if unable to connect to a data source.
-	 */
-	NotificationManager create(BaseEntityManager<? extends BaseEntityFactory> baseEntityManager,
-			Map<String, String> parameters) throws ConnectionException;
-}
diff --git a/src/main/java/org/eclipse/mdm/api/base/ServiceNotProvidedException.java b/src/main/java/org/eclipse/mdm/api/base/ServiceNotProvidedException.java
new file mode 100644
index 0000000..f351058
--- /dev/null
+++ b/src/main/java/org/eclipse/mdm/api/base/ServiceNotProvidedException.java
@@ -0,0 +1,25 @@
+/*

+ * Copyright (c) 2017 Peak Solution GmbH and others

+ * 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

+ */

+package org.eclipse.mdm.api.base;

+

+/**

+ * This exception indicates that a service is not provided by an adapter.

+ */

+public class ServiceNotProvidedException extends RuntimeException {

+

+	private static final long serialVersionUID = -4829618036958929415L;

+

+	/**

+	 * Constructor.

+	 *

+	 * @param clazz the service that is not provided

+	 */

+	public ServiceNotProvidedException(Class<?> clazz) {

+		super("The service '" + clazz + "' is not implemented!");

+	}

+}

diff --git a/src/main/java/org/eclipse/mdm/api/base/query/Attribute.java b/src/main/java/org/eclipse/mdm/api/base/adapter/Attribute.java
similarity index 98%
rename from src/main/java/org/eclipse/mdm/api/base/query/Attribute.java
rename to src/main/java/org/eclipse/mdm/api/base/adapter/Attribute.java
index 0ef918b..a9539b9 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/Attribute.java
+++ b/src/main/java/org/eclipse/mdm/api/base/adapter/Attribute.java
@@ -6,7 +6,7 @@
  * http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.eclipse.mdm.api.base.query;
+package org.eclipse.mdm.api.base.adapter;
 
 import org.eclipse.mdm.api.base.model.Enumeration;
 import org.eclipse.mdm.api.base.model.Value;
diff --git a/src/main/java/org/eclipse/mdm/api/base/query/DefaultCore.java b/src/main/java/org/eclipse/mdm/api/base/adapter/DefaultCore.java
similarity index 97%
rename from src/main/java/org/eclipse/mdm/api/base/query/DefaultCore.java
rename to src/main/java/org/eclipse/mdm/api/base/adapter/DefaultCore.java
index 7b8521c..16b6e17 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/DefaultCore.java
+++ b/src/main/java/org/eclipse/mdm/api/base/adapter/DefaultCore.java
@@ -6,7 +6,7 @@
  * http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.eclipse.mdm.api.base.query;
+package org.eclipse.mdm.api.base.adapter;
 
 import java.util.Collection;
 import java.util.HashMap;
@@ -15,6 +15,7 @@
 import org.eclipse.mdm.api.base.model.Core;
 import org.eclipse.mdm.api.base.model.Entity;
 import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.query.Record;
 
 /**
  * Provides access to the internals of any entity:
diff --git a/src/main/java/org/eclipse/mdm/api/base/query/EntityType.java b/src/main/java/org/eclipse/mdm/api/base/adapter/EntityType.java
similarity index 98%
rename from src/main/java/org/eclipse/mdm/api/base/query/EntityType.java
rename to src/main/java/org/eclipse/mdm/api/base/adapter/EntityType.java
index 3540e33..31a6a1d 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/EntityType.java
+++ b/src/main/java/org/eclipse/mdm/api/base/adapter/EntityType.java
@@ -6,7 +6,7 @@
  * http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.eclipse.mdm.api.base.query;
+package org.eclipse.mdm.api.base.adapter;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/org/eclipse/mdm/api/base/query/ModelManager.java b/src/main/java/org/eclipse/mdm/api/base/adapter/ModelManager.java
similarity index 94%
rename from src/main/java/org/eclipse/mdm/api/base/query/ModelManager.java
rename to src/main/java/org/eclipse/mdm/api/base/adapter/ModelManager.java
index 7c831fb..03d0e82 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/ModelManager.java
+++ b/src/main/java/org/eclipse/mdm/api/base/adapter/ModelManager.java
@@ -6,12 +6,13 @@
  * http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.eclipse.mdm.api.base.query;
+package org.eclipse.mdm.api.base.adapter;
 
 import java.util.List;
 
 import org.eclipse.mdm.api.base.model.ContextType;
 import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.query.Query;
 
 /**
  * Provides access to any modeled {@link EntityType} within an underlying
@@ -29,13 +30,6 @@
 	// ======================================================================
 
 	/**
-	 * Creates a new and empty {@link Query}.
-	 *
-	 * @return Created {@code Query} is returned.
-	 */
-	Query createQuery();
-
-	/**
 	 * Returns all available {@link EntityType}s.
 	 *
 	 * @return The returned {@code List} is unmodifiable.
diff --git a/src/main/java/org/eclipse/mdm/api/base/query/Relation.java b/src/main/java/org/eclipse/mdm/api/base/adapter/Relation.java
similarity index 98%
rename from src/main/java/org/eclipse/mdm/api/base/query/Relation.java
rename to src/main/java/org/eclipse/mdm/api/base/adapter/Relation.java
index 4b76edd..bc667ba 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/Relation.java
+++ b/src/main/java/org/eclipse/mdm/api/base/adapter/Relation.java
@@ -6,7 +6,7 @@
  * http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.eclipse.mdm.api.base.query;
+package org.eclipse.mdm.api.base.adapter;
 
 import org.eclipse.mdm.api.base.model.Value;
 import org.eclipse.mdm.api.base.model.ValueType;
diff --git a/src/main/java/org/eclipse/mdm/api/base/query/RelationType.java b/src/main/java/org/eclipse/mdm/api/base/adapter/RelationType.java
similarity index 96%
rename from src/main/java/org/eclipse/mdm/api/base/query/RelationType.java
rename to src/main/java/org/eclipse/mdm/api/base/adapter/RelationType.java
index 85de713..02b09aa 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/RelationType.java
+++ b/src/main/java/org/eclipse/mdm/api/base/adapter/RelationType.java
@@ -6,7 +6,7 @@
  * http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.eclipse.mdm.api.base.query;
+package org.eclipse.mdm.api.base.adapter;
 
 /**
  * RelationType enumeration.
diff --git a/src/main/java/org/eclipse/mdm/api/base/FileService.java b/src/main/java/org/eclipse/mdm/api/base/file/FileService.java
similarity index 99%
rename from src/main/java/org/eclipse/mdm/api/base/FileService.java
rename to src/main/java/org/eclipse/mdm/api/base/file/FileService.java
index 34e64f1..8ceb888 100644
--- a/src/main/java/org/eclipse/mdm/api/base/FileService.java
+++ b/src/main/java/org/eclipse/mdm/api/base/file/FileService.java
@@ -6,7 +6,7 @@
  * http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.eclipse.mdm.api.base;
+package org.eclipse.mdm.api.base.file;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/src/main/java/org/eclipse/mdm/api/base/model/ContextDescribable.java b/src/main/java/org/eclipse/mdm/api/base/model/ContextDescribable.java
index b3f5083..1337ee6 100644
--- a/src/main/java/org/eclipse/mdm/api/base/model/ContextDescribable.java
+++ b/src/main/java/org/eclipse/mdm/api/base/model/ContextDescribable.java
@@ -37,7 +37,7 @@
 	 * @throws DataAccessException
 	 *             Thrown if unable to query the available {@code ContextType}s.
 	 */
-	List<ContextType> loadContextTypes(BaseEntityManager<? extends BaseEntityFactory> manager) throws DataAccessException;
+	List<ContextType> loadContextTypes(BaseEntityManager manager) throws DataAccessException;
 
 	/**
 	 * Loads the requested {@link ContextRoot}s for given
@@ -55,7 +55,7 @@
 	 * 		ContextRoot}s.
 	 * @see ContextType
 	 */
-	Map<ContextType, ContextRoot> loadContexts(BaseEntityManager<? extends BaseEntityFactory> manager, ContextType... contextTypes)
+	Map<ContextType, ContextRoot> loadContexts(BaseEntityManager manager, ContextType... contextTypes)
 			throws DataAccessException;
 
 }
diff --git a/src/main/java/org/eclipse/mdm/api/base/model/Measurement.java b/src/main/java/org/eclipse/mdm/api/base/model/Measurement.java
index 4a0bad0..7e4d332 100644
--- a/src/main/java/org/eclipse/mdm/api/base/model/Measurement.java
+++ b/src/main/java/org/eclipse/mdm/api/base/model/Measurement.java
@@ -136,7 +136,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public List<ContextType> loadContextTypes(BaseEntityManager<? extends BaseEntityFactory> manager) 
+	public List<ContextType> loadContextTypes(BaseEntityManager manager) 
 			throws DataAccessException {
 		return manager.loadContextTypes(this);
 	}
@@ -145,7 +145,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public Map<ContextType, ContextRoot> loadContexts(BaseEntityManager<? extends BaseEntityFactory> manager,
+	public Map<ContextType, ContextRoot> loadContexts(BaseEntityManager manager,
 			ContextType... contextTypes) throws DataAccessException {
 		return manager.loadContexts(this, contextTypes);
 	}
diff --git a/src/main/java/org/eclipse/mdm/api/base/model/TestStep.java b/src/main/java/org/eclipse/mdm/api/base/model/TestStep.java
index 802c220..126215d 100644
--- a/src/main/java/org/eclipse/mdm/api/base/model/TestStep.java
+++ b/src/main/java/org/eclipse/mdm/api/base/model/TestStep.java
@@ -94,7 +94,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public List<ContextType> loadContextTypes(BaseEntityManager<? extends BaseEntityFactory> manager)
+	public List<ContextType> loadContextTypes(BaseEntityManager manager)
 			throws DataAccessException {
 		return manager.loadContextTypes(this);
 	}
@@ -103,7 +103,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public Map<ContextType, ContextRoot> loadContexts(BaseEntityManager<? extends BaseEntityFactory> manager,
+	public Map<ContextType, ContextRoot> loadContexts(BaseEntityManager manager,
 			ContextType... contextTypes) throws DataAccessException {
 		return manager.loadContexts(this, contextTypes);
 	}
diff --git a/src/main/java/org/eclipse/mdm/api/base/notification/NotificationFilter.java b/src/main/java/org/eclipse/mdm/api/base/notification/NotificationFilter.java
index d3409e0..2adbc3e 100644
--- a/src/main/java/org/eclipse/mdm/api/base/notification/NotificationFilter.java
+++ b/src/main/java/org/eclipse/mdm/api/base/notification/NotificationFilter.java
@@ -5,7 +5,7 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.eclipse.mdm.api.base.query.EntityType;
+import org.eclipse.mdm.api.base.adapter.EntityType;
 
 /**
  * Class represents a filter for notifications.
diff --git a/src/main/java/org/eclipse/mdm/api/base/notification/NotificationListener.java b/src/main/java/org/eclipse/mdm/api/base/notification/NotificationListener.java
index 63344d9..0ac0ca8 100644
--- a/src/main/java/org/eclipse/mdm/api/base/notification/NotificationListener.java
+++ b/src/main/java/org/eclipse/mdm/api/base/notification/NotificationListener.java
@@ -2,9 +2,9 @@
 
 import java.util.List;
 
+import org.eclipse.mdm.api.base.adapter.EntityType;
 import org.eclipse.mdm.api.base.model.Entity;
 import org.eclipse.mdm.api.base.model.User;
-import org.eclipse.mdm.api.base.query.EntityType;
 
 /**
  * Listener interface for notifications.
diff --git a/src/main/java/org/eclipse/mdm/api/base/notification/NotificationManager.java b/src/main/java/org/eclipse/mdm/api/base/notification/NotificationService.java
similarity index 97%
rename from src/main/java/org/eclipse/mdm/api/base/notification/NotificationManager.java
rename to src/main/java/org/eclipse/mdm/api/base/notification/NotificationService.java
index f3a0243..6093473 100644
--- a/src/main/java/org/eclipse/mdm/api/base/notification/NotificationManager.java
+++ b/src/main/java/org/eclipse/mdm/api/base/notification/NotificationService.java
@@ -6,7 +6,7 @@
  * @since 1.0.0
  * @author Matthias Koller, Peak Solution GmbH
  */
-public interface NotificationManager {
+public interface NotificationService {
 
 	/**
 	 * Registers a NotificationListener at the underlying notification service.
diff --git a/src/main/java/org/eclipse/mdm/api/base/query/ComparisonOperator.java b/src/main/java/org/eclipse/mdm/api/base/query/ComparisonOperator.java
index a40211c..aa3c530 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/ComparisonOperator.java
+++ b/src/main/java/org/eclipse/mdm/api/base/query/ComparisonOperator.java
@@ -10,6 +10,7 @@
 
 import java.util.Arrays;
 
+import org.eclipse.mdm.api.base.adapter.Attribute;
 import org.eclipse.mdm.api.base.model.ValueType;
 
 /**
diff --git a/src/main/java/org/eclipse/mdm/api/base/query/Condition.java b/src/main/java/org/eclipse/mdm/api/base/query/Condition.java
index 700e642..eda235a 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/Condition.java
+++ b/src/main/java/org/eclipse/mdm/api/base/query/Condition.java
@@ -10,6 +10,7 @@
 
 import java.util.Objects;
 
+import org.eclipse.mdm.api.base.adapter.Attribute;
 import org.eclipse.mdm.api.base.model.Value;
 
 /**
diff --git a/src/main/java/org/eclipse/mdm/api/base/query/DataAccessException.java b/src/main/java/org/eclipse/mdm/api/base/query/DataAccessException.java
index c291aab..2f8cbe0 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/DataAccessException.java
+++ b/src/main/java/org/eclipse/mdm/api/base/query/DataAccessException.java
@@ -14,7 +14,7 @@
  * @since 1.0.0
  * @author Viktor Stoehr, Gigatronik Ingolstadt GmbH
  */
-public final class DataAccessException extends Exception {
+public final class DataAccessException extends RuntimeException {
 
 	// ======================================================================
 	// Class variables
diff --git a/src/main/java/org/eclipse/mdm/api/base/query/Filter.java b/src/main/java/org/eclipse/mdm/api/base/query/Filter.java
index e75d0fa..4b70368 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/Filter.java
+++ b/src/main/java/org/eclipse/mdm/api/base/query/Filter.java
@@ -18,6 +18,11 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.search.SearchQuery;
+import org.eclipse.mdm.api.base.search.SearchService;
+
 /**
  * A filter is a sequence of {@link FilterItem}s containing {@link BooleanOperator}s or
  * {@link Condition}s.
diff --git a/src/main/java/org/eclipse/mdm/api/base/query/Query.java b/src/main/java/org/eclipse/mdm/api/base/query/Query.java
index ae4be98..9d6b277 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/Query.java
+++ b/src/main/java/org/eclipse/mdm/api/base/query/Query.java
@@ -12,6 +12,10 @@
 import java.util.List;
 import java.util.Optional;
 
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+
 /**
  * Provides methods to easily build queries by adding select, join, group by and
  * order by statements. Finally an optional {@link Filter} may be given to
diff --git a/src/main/java/org/eclipse/mdm/api/base/query/QueryService.java b/src/main/java/org/eclipse/mdm/api/base/query/QueryService.java
new file mode 100644
index 0000000..389b68d
--- /dev/null
+++ b/src/main/java/org/eclipse/mdm/api/base/query/QueryService.java
@@ -0,0 +1,27 @@
+/*

+ * Copyright (c) 2017 Peak Solution GmbH

+ * 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

+ */

+package org.eclipse.mdm.api.base.query;

+

+/**

+ * The {@link QueryService} provides access to the low level query API.

+ * 

+ * A {@link Query}, created by this service, can be used to build and execute 

+ * queries on the underlying datastore. The results are returned as a list 

+ * of {@link Result}s.

+ *

+ * @since 1.0.0

+ */

+public interface QueryService {

+	

+	/**

+	 * Creates a new and empty {@link Query}.

+	 *

+	 * @return Created {@code Query} is returned.

+	 */

+	Query createQuery();

+}

diff --git a/src/main/java/org/eclipse/mdm/api/base/query/Record.java b/src/main/java/org/eclipse/mdm/api/base/query/Record.java
index 53778ab..979932a 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/Record.java
+++ b/src/main/java/org/eclipse/mdm/api/base/query/Record.java
@@ -12,6 +12,9 @@
 import java.util.Map;
 import java.util.Optional;
 
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
 import org.eclipse.mdm.api.base.model.Value;
 
 /**
diff --git a/src/main/java/org/eclipse/mdm/api/base/query/Result.java b/src/main/java/org/eclipse/mdm/api/base/query/Result.java
index bf11b7a..8fb9d4a 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/Result.java
+++ b/src/main/java/org/eclipse/mdm/api/base/query/Result.java
@@ -14,6 +14,8 @@
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
 import org.eclipse.mdm.api.base.model.Value;
 
 /**
diff --git a/src/main/java/org/eclipse/mdm/api/base/query/SearchQuery.java b/src/main/java/org/eclipse/mdm/api/base/search/SearchQuery.java
similarity index 95%
rename from src/main/java/org/eclipse/mdm/api/base/query/SearchQuery.java
rename to src/main/java/org/eclipse/mdm/api/base/search/SearchQuery.java
index e4f266c..1652e06 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/SearchQuery.java
+++ b/src/main/java/org/eclipse/mdm/api/base/search/SearchQuery.java
@@ -6,11 +6,16 @@
  * http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.eclipse.mdm.api.base.query;
+package org.eclipse.mdm.api.base.search;
 
 import java.util.List;
 
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
 import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.Result;
 
 /**
  * This is an interface for predefined search query implementations.
diff --git a/src/main/java/org/eclipse/mdm/api/base/query/SearchService.java b/src/main/java/org/eclipse/mdm/api/base/search/SearchService.java
similarity index 97%
rename from src/main/java/org/eclipse/mdm/api/base/query/SearchService.java
rename to src/main/java/org/eclipse/mdm/api/base/search/SearchService.java
index e6c3b8a..f2683ea 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/SearchService.java
+++ b/src/main/java/org/eclipse/mdm/api/base/search/SearchService.java
@@ -6,15 +6,22 @@
  * http://www.eclipse.org/legal/epl-v10.html

  */

 

-package org.eclipse.mdm.api.base.query;

+package org.eclipse.mdm.api.base.search;

 

 import java.util.Collections;

 import java.util.List;

 import java.util.Map;

 import java.util.stream.Collectors;

 

+import org.eclipse.mdm.api.base.adapter.Attribute;

+import org.eclipse.mdm.api.base.adapter.EntityType;

+import org.eclipse.mdm.api.base.adapter.Relation;

 import org.eclipse.mdm.api.base.model.Entity;

 import org.eclipse.mdm.api.base.model.Value;

+import org.eclipse.mdm.api.base.query.DataAccessException;

+import org.eclipse.mdm.api.base.query.Filter;

+import org.eclipse.mdm.api.base.query.Record;

+import org.eclipse.mdm.api.base.query.Result;

 

 /**

  * This search service uses given {@link Entity} type to execute the associated

diff --git a/src/main/java/org/eclipse/mdm/api/base/query/Searchable.java b/src/main/java/org/eclipse/mdm/api/base/search/Searchable.java
similarity index 93%
rename from src/main/java/org/eclipse/mdm/api/base/query/Searchable.java
rename to src/main/java/org/eclipse/mdm/api/base/search/Searchable.java
index cab0bee..355bcda 100644
--- a/src/main/java/org/eclipse/mdm/api/base/query/Searchable.java
+++ b/src/main/java/org/eclipse/mdm/api/base/search/Searchable.java
@@ -6,10 +6,12 @@
  * http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.eclipse.mdm.api.base.query;
+package org.eclipse.mdm.api.base.search;
 
 import java.util.List;
 
+import org.eclipse.mdm.api.base.adapter.EntityType;
+
 /**
  * A searchable is used to describe the hierarchical order of
  * {@link EntityType}s being used for searching.
diff --git a/src/test/java/org/eclipse/mdm/api/base/AttributeImpl.java b/src/test/java/org/eclipse/mdm/api/base/AttributeImpl.java
index 05d3253..7ab8187 100755
--- a/src/test/java/org/eclipse/mdm/api/base/AttributeImpl.java
+++ b/src/test/java/org/eclipse/mdm/api/base/AttributeImpl.java
@@ -8,10 +8,10 @@
 

 package org.eclipse.mdm.api.base;

 

+import org.eclipse.mdm.api.base.adapter.Attribute;

+import org.eclipse.mdm.api.base.adapter.EntityType;

 import org.eclipse.mdm.api.base.model.Enumeration;

 import org.eclipse.mdm.api.base.model.ValueType;

-import org.eclipse.mdm.api.base.query.Attribute;

-import org.eclipse.mdm.api.base.query.EntityType;

 

 public class AttributeImpl implements Attribute {

 

diff --git a/src/test/java/org/eclipse/mdm/api/base/EntityTypeImpl.java b/src/test/java/org/eclipse/mdm/api/base/EntityTypeImpl.java
index e723177..a8665a8 100755
--- a/src/test/java/org/eclipse/mdm/api/base/EntityTypeImpl.java
+++ b/src/test/java/org/eclipse/mdm/api/base/EntityTypeImpl.java
@@ -11,10 +11,10 @@
 import java.util.List;

 

 import org.eclipse.mdm.api.base.AttributeImpl.Type;

-import org.eclipse.mdm.api.base.query.Attribute;

-import org.eclipse.mdm.api.base.query.EntityType;

-import org.eclipse.mdm.api.base.query.Relation;

-import org.eclipse.mdm.api.base.query.RelationType;

+import org.eclipse.mdm.api.base.adapter.Attribute;

+import org.eclipse.mdm.api.base.adapter.EntityType;

+import org.eclipse.mdm.api.base.adapter.Relation;

+import org.eclipse.mdm.api.base.adapter.RelationType;

 

 public class EntityTypeImpl implements EntityType {

 

diff --git a/src/test/java/org/eclipse/mdm/api/base/RelationImpl.java b/src/test/java/org/eclipse/mdm/api/base/RelationImpl.java
index 4ca2c79..0ca5eea 100755
--- a/src/test/java/org/eclipse/mdm/api/base/RelationImpl.java
+++ b/src/test/java/org/eclipse/mdm/api/base/RelationImpl.java
@@ -8,10 +8,10 @@
 

 package org.eclipse.mdm.api.base;

 

-import org.eclipse.mdm.api.base.query.Attribute;

-import org.eclipse.mdm.api.base.query.EntityType;

-import org.eclipse.mdm.api.base.query.Relation;

-import org.eclipse.mdm.api.base.query.RelationType;

+import org.eclipse.mdm.api.base.adapter.Attribute;

+import org.eclipse.mdm.api.base.adapter.EntityType;

+import org.eclipse.mdm.api.base.adapter.Relation;

+import org.eclipse.mdm.api.base.adapter.RelationType;

 

 public class RelationImpl implements Relation {