Merge branch 'dev'
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 0000000..27af47e
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,260 @@
+# Notices for the mdmbl webapplication , openMDM(R) Eclipse Working Groupo
+
+This content is produced and maintained by the Eclipse mdmbl project.
+
+ * Project home: https://projects.eclipse.org/projects/technology.mdmbl
+
+## Trademarks
+
+Eclipse mdmbl are
+trademarks of the Eclipse Foundation. Eclipse, and the Eclipse Logo are
+registered trademarks of the Eclipse Foundation.
+
+## Declared Project Licenses
+
+This program and the accompanying materials are made available under the terms
+of the Eclipse Public License v. 1.0 which is available at
+http://www.eclipse.org/legal/epl-v10.html.
+
+SPDX-License-Identifier: EPL-1.0
+
+## Source Code
+
+The project maintains the following source code repositories:
+
+org.eclipse.mdm.api.base.git	        - The openMDM(R) API.
+org.eclipse.mdm.api.default.git	        - Extension of the openMDM(R) API containing default elements.
+org.eclipse.mdm.api.odsadapter.git	- ODS implementation of persistence adapter.
+org.eclipse.mdm.nucleus.git	        - Core building blocks for the openMDM Business Logic and Web Frontend.
+org.eclipse.mdm.realms.git	        - A GlassFish realm using ODS authentication.
+
+
+## Third-party Content
+
+antlr4-4.5.3.jar(2.5.3)
+    * License: New BSD license
+
+aopalliance-repackaged-2.5.0-b05.jar (2.5.0-b05)
+    * License: CDDL
+
+commons-codec-1.2.jar (1.2)
+    * License: Apache License, 2.0
+
+commons-httpclient-3.1.jar  (3.1)
+    * License: Apache License, 2.0
+
+commons-lang3-3.4.jar (3.4)
+    * License: Apache License, 2.0
+
+gson-2.7.jar (2.7)
+    * License: Apache License, 2.0
+
+guava-18.0.jar  (18.0)
+    * License: Apache License, 2.0
+
+hk2-api-2.5.0-b05.jar (2.5.0-b05)
+    * License: CDDL-1.1 OR GPL-2.0
+
+hk2-locator-2.5.0-b05.jar(2.5.0-b05)
+    * License: CDDL
+
+hk2-utils-2.5.0-b05.jar  (2.5.0-b05)
+    * License: CDDL
+
+jackson-annotations-2.9.0.jar  (2.9.0)
+    * License: Apache License, 2.0
+
+jackson-core-2.9.2.jar(2.9.2)
+    * License: Apache License, 2.0
+
+jackson-databind-2.9.2.jar  (2.9.2)
+    * License: Apache License, 2.0
+
+jackson-jaxrs-base-2.9.2.jar(2.9.2)
+    * License: Apache License, 2.0
+
+jackson-jaxrs-json-provider-2.9.2.jar(2.9.2)
+    * License: Apache License, 2.0
+
+jackson-module-jaxb-annotations-2.9.2.jar  (2.9.2)
+    * License: Apache License, 2.0
+
+javassist-3.20.0-GA.jar  (2.20.0-GA)
+    * License: Mozilla Public License 1.1 (MPL), Apache 2.0
+
+javax.annotation-api-1.2.jar(1.2)
+    * License: (CDDL-1.1 OR GPL-2.0 OR GPL-2.0-with-classpath-exception) AND Apache-2.0
+
+jcl-over-slf4j-1.7.25.jar(1.7.25)
+    * License: MIT License
+    
+jersey-client-2.23.2.jar (2.23.2)
+     * License: CDDL
+
+jersey-common-2.23.2.jar (2.23.2)
+    * License: CDDL
+
+jersey-container-servlet-2.23.2.jar  (2.23.2)
+    * License: CDDL
+
+jersey-container-servlet-core-2.23.3.jar(2.23.2)
+    * License: CDDL
+
+jersey-guava-2.23.2.jar  (2.23.2)
+    * License: Apache License, 2.0
+
+jersey-media-jaxb-2.23.2.jar(2.23.2)
+    * License: CDDL
+
+jersey-media-sse-2.23.2.jar (2.23.2)
+    * License: CDDL
+
+jersey-server-2.23.2.jar (2.23.2)
+    * License: (CDDL-1.1 OR GPL-2.0) AND Apache-2.0
+
+logback-classic-1.2.3.jar(1.2.3)
+    * License: Eclipse Public License 1.0
+
+logback-core-1.2.3.jar(1.2.3)
+    * License: Eclipse Public License 1.0
+
+osgi-resource-locator-1.0.1.jar(1.0.1)
+    * License: CDDL
+
+protobuf-java-3.2.0.jar (3.2.0)
+    * License: New BSD license
+
+protobuf-java-util-3.2.0.jar  (3.2.0)
+    * License: New BSD license
+
+slf4j-api-1.7.25.jar  (1.7.25)
+    * License: MIT license
+    * Project URL: https://github.com/qos-ch/slf4j
+    * Source URL:  https://github.com/qos-ch/slf4j/releases/tag/v_1.7.25
+
+validation-api-1.1.0.Final.jar (1.1.0.Final)
+* License: Apache License, 2.0
+
+@angular/common@2.4.8
+    * License: MIT
+    * Project: https: //github.com/angular/angular
+    * Source:  https: //github.com/angular/angular
+
+@angular/compiler@2.4.8 License: MIT
+    * Project: https: //github.com/angular/angular
+    * Source:  https: //github.com/angular/angular
+
+@angular/core@2.4.8
+    * License: MIT
+    * Project: https: //github.com/angular/angular
+    * Source:  https: //github.com/angular/angular
+
+@angular/forms@2.4.8
+    * License: MIT
+    * Project: https: //github.com/angular/angular
+    * Source:  https: //github.com/angular/angular
+
+@angular/http@2.4.8
+    * License: MIT
+    * Project: https: //github.com/angular/angular
+    * Source:  https: //github.com/angular/angular
+
+@angular/platform-browser-dynamic@2.4.8
+    * License: MIT
+    * Project: https: //github.com/angular/angular
+    * Source:  https: //github.com/angular/angular
+
+@angular/platform-browser@2.4.8
+    * License: MIT
+    * Project: https: //github.com/angular/angular
+    * Source:  https: //github.com/angular/angular
+
+@angular/router@3.4.8
+    * License: MIT
+    * Project: https: //github.com/angular/angular
+    * Source:  https: //github.com/angular/angular
+
+@types/file-saver@0.0.0
+    * License: MIT
+    * Project: https: //wwwhub.com/DefinitelyTyped/DefinitelyTyped
+    * Source:  https: //wwwhub.com/DefinitelyTyped/DefinitelyTyped
+
+bootstrap@3.3.7
+    * License: MIT
+    * Project: https: //github.com/twbs/bootstrap
+    * Source:  https: //github.com/twbs/bootstrap
+
+class-transformer@0.1.6
+    * License: MIT
+    * Project: https: //github.com/pleerock/class-transformer
+    * Source:  https: //github.com/pleerock/class-transformer
+
+core-js@2.4.1
+    * License: MIT
+    * Project: https: //github.com/zloirock/core-js
+    * Source:  https: //github.com/zloirock/core-js
+
+file-saver@1.3.3
+    * License: MIT
+    * Project: https: //github.com/eligrey/FileSaver.js
+    * Source:  https: //github.com/eligrey/FileSaver.js
+
+font-awesome@4.7.0
+    * License: SIL OPEN FONT LICENSE (OFL-1.1) AND MIT
+    * Project: https: //github.com/FortAwesome/Font-Awesome
+    * Source:  https: //github.com/FortAwesome/Font-Awesome
+
+moment@2.17.1
+    * License: MIT
+    * Project: https: //github.com/moment/moment
+    * Source:  https: //github.com/moment/moment
+
+ng2-bootstrap@1.3.1
+    * License: MIT
+    * Project: https: //github.com/valor-software/ng2-bootstrap
+    * Source:  https: //github.com/valor-software/ng2-bootstrap
+
+ng2-split-pane@1.3.1
+    * License: MIT
+    * Project: https: //github.com/wannabegeek/ng2-split-pane
+    * Source:  https: //github.com/wannabegeek/ng2-split-pane
+
+primeng@2.0.5
+    * License: MIT
+    * Project: https: //github.com/primefaces/primeng
+    * Source:  https: //github.com/primefaces/primeng
+
+reflect-metadata@0.1.3
+    * License: Apache-2.0
+    * Project: https: //github.com/rbuckton/ReflectDecorators
+    * Source:  https: //github.com/rbuckton/ReflectDecorators
+
+rxjs@5.1.0
+    * License: Apache-2.0
+    * Project: https: //github.com/ReactiveX/RxJS
+    * Source:  https: //github.com/ReactiveX/RxJS
+
+symbol-observable@1.2.0
+    * License: MIT
+    * Project: https: //github.com/blesh/symbol-observable
+    * Source:  https: //github.com/blesh/symbol-observable
+
+ts-helpers@1.1.1
+    * License: MIT
+    * Project: https: //github.com/ngParty/ts-helpers
+    * Source:  https: //github.com/ngParty/ts-helpers
+
+zone.js@0.7.6
+    * License: MIT
+    * Project: https: //github.com/angular
+    * Source:  https: //github.com/angular/zone.js
+
+
+## Cryptography
+
+Content may contain encryption software. The country in which you are currently
+may have restrictions on the import, possession, and use, and/or re-export to
+another country, of encryption software. BEFORE using any encryption software,
+please check the country's laws, regulations and policies concerning the import,
+possession, or use, and re-export of encryption software, to see if this is
+permitted.
diff --git a/build.gradle b/build.gradle
index 0b08a36..66ab357 100644
--- a/build.gradle
+++ b/build.gradle
@@ -8,7 +8,7 @@
 
 description = 'MDM API - ODSAdapter'
 group = 'org.eclipse.mdm'
-version = '1.0.0'
+version = '5.0.0M1'
 
 apply plugin: 'java'
 apply plugin: 'maven'
@@ -50,30 +50,34 @@
 	}
 }
 
-configurations {
-    all*.exclude group: 'javax.inject', module: 'javax.inject'
+configurations.all {
+	exclude group: 'javax.inject', module: 'javax.inject'
+	exclude group: 'commons-logging', module: 'commons-logging'
 }
 
 dependencies {
-	compile 'javax:javaee-api:7.0'
+	compileOnly 'javax:javaee-api:7.0'
 
-	// logging	
-	compile 'org.slf4j:slf4j-api:1.7.19'
-	
+	// logging
+	compile 'org.slf4j:slf4j-api:1.7.25'
+	// httpclient uses commons-logging
+	compile 'org.slf4j:jcl-over-slf4j:1.7.25'
+
 	// MDM5 API
-	compile 'org.eclipse.mdm:org.eclipse.mdm.api.base:1.0.0'
-	compile 'org.eclipse.mdm:org.eclipse.mdm.api.default:1.0.0'
-	
+	compile "org.eclipse.mdm:org.eclipse.mdm.api.base:${version}"
+	compile "org.eclipse.mdm:org.eclipse.mdm.api.default:${version}"
+
 	// compile CORBA idl using JDK tools
 	generatedCompile files(System.getenv('JAVA_HOME') + '/lib/tools.jar')
-
+    generatedCompile files('src/main/idl/')
+    
 	// Peak notification service
-	compile 'com.google.protobuf:protobuf-java:3.0.0-beta-3'
-	compile 'com.google.protobuf:protobuf-java-util:3.0.0-beta-3'
+	compile 'com.google.protobuf:protobuf-java:3.2.0'
+	compile 'com.google.protobuf:protobuf-java-util:3.2.0'
 	compile 'com.google.guava:guava:18.0'
 	compile 'org.glassfish.jersey.core:jersey-client:2.23.2'
 	compile 'org.glassfish.jersey.media:jersey-media-sse:2.23.2'
-	generatedCompile 'com.google.protobuf:protobuf-java:3.0.0-beta-3'
+	generatedCompile 'com.google.protobuf:protobuf-java:3.2.0'
 
 	// querying es
 	compile 'commons-httpclient:commons-httpclient:3.1'
@@ -81,8 +85,8 @@
 
 	// testing
 	testCompile 'junit:junit:4.12'
-	testRuntime 'org.slf4j:slf4j-simple:1.7.19'
-	testCompile 'org.mockito:mockito-core:2.10.0'
+	testRuntime 'org.slf4j:slf4j-simple:1.7.25'
+	testCompile 'org.mockito:mockito-core:2.13.0'
 	testCompile 'org.assertj:assertj-core:3.6.2'
 	testCompile(group: 'org.elasticsearch', name: 'elasticsearch', version: '2.3.4')
 	testCompile(group: 'org.elasticsearch', name: 'elasticsearch', version: '2.3.4', classifier: 'tests')
@@ -112,7 +116,7 @@
 
 protobuf {
 	protoc {
-		artifact = 'com.google.protobuf:protoc:3.0.0-beta-3'
+		artifact = 'com.google.protobuf:protoc:3.2.0'
 	}
 }
 
@@ -128,6 +132,17 @@
 	outputs.dir("src/gen/java")
 }
 
+task compileNotificationServiceIDL(type: JavaExec) {
+	classpath = configurations.generatedCompile
+
+	main = 'com.sun.tools.corba.se.idl.toJavaPortable.Compile'
+
+	args '-emitAll', '-fall', '-i', 'src/main/idl/', '-td', 'src/gen/java/', 'src/main/idl/CosNotifyChannelAdmin.idl'
+
+	outputs.dir("src/gen/java")
+	outputs.upToDateWhen { false }
+}
+
 compileGeneratedJava {
 	inputs.dir("build/generated/source")
 	inputs.dir("src/gen/java")
@@ -135,11 +150,16 @@
 
 // generate classes from idl and compile them
 compileGeneratedJava.dependsOn compileIDL
+compileGeneratedJava.dependsOn compileNotificationServiceIDL
+
 compileJava.dependsOn compileGeneratedJava
 
 jar {
 	from sourceSets.generated.output
 	dependsOn generatedClasses
+
+	metaInf { from 'NOTICE.txt' }
+	metaInf { from 'LICENSE.txt' }
 }
 
 task deleteGenerated(type: Delete) {
diff --git a/src/main/idl/CosEventChannelAdmin.idl b/src/main/idl/CosEventChannelAdmin.idl
new file mode 100644
index 0000000..8ddf3a3
--- /dev/null
+++ b/src/main/idl/CosEventChannelAdmin.idl
@@ -0,0 +1,59 @@
+/**

+ * This module is taken from the standard CORBA Event Service

+ * 1.2, as described in:

+ *

+ * https://www.omg.org/spec/EVNT/1.2/

+ *

+ * The idl was extracted from the following PDF:

+ * formal/04-10-02 

+ */

+

+#ifndef _COS_EVENT_CHANNEL_ADMIN_IDL_

+#define _COS_EVENT_CHANNEL_ADMIN_IDL_

+

+#include "CosEventComm.idl"
+

+#pragma prefix "omg.org"

+
+module CosEventChannelAdmin {
+
+   exception AlreadyConnected {};
+   exception TypeError {};
+
+   interface ProxyPushConsumer: CosEventComm::PushConsumer {
+      void connect_push_supplier(in CosEventComm::PushSupplier push_supplier)
+         raises(AlreadyConnected);
+   };
+
+   interface ProxyPullSupplier: CosEventComm::PullSupplier {
+      void connect_pull_consumer(in CosEventComm::PullConsumer pull_consumer)
+         raises(AlreadyConnected);
+   };
+
+   interface ProxyPullConsumer: CosEventComm::PullConsumer {
+      void connect_pull_supplier(in CosEventComm::PullSupplier pull_supplier)
+         raises(AlreadyConnected,TypeError);
+   };
+
+   interface ProxyPushSupplier: CosEventComm::PushSupplier {
+      void connect_push_consumer(in CosEventComm::PushConsumer push_consumer)
+         raises(AlreadyConnected, TypeError);
+   };
+
+   interface ConsumerAdmin {
+      ProxyPushSupplier obtain_push_supplier();
+      ProxyPullSupplier obtain_pull_supplier();
+   };
+
+   interface SupplierAdmin {
+      ProxyPushConsumer obtain_push_consumer();
+      ProxyPullConsumer obtain_pull_consumer();
+   };
+
+   interface EventChannel {
+      ConsumerAdmin for_consumers();
+      SupplierAdmin for_suppliers();
+      void destroy();
+   };
+};
+#endif /* ifndef _COS_EVENT_CHANNEL_ADMIN_IDL_ */
diff --git a/src/main/idl/CosEventComm.idl b/src/main/idl/CosEventComm.idl
new file mode 100644
index 0000000..ed88691
--- /dev/null
+++ b/src/main/idl/CosEventComm.idl
@@ -0,0 +1,41 @@
+/**

+ * This module is taken from the standard CORBA Event Service

+ * 1.2, as described in:

+ *

+ * https://www.omg.org/spec/EVNT/1.2/

+ *

+ * The idl was extracted from the following PDF:

+ * formal/04-10-02 

+ */

+ 

+#ifndef _COS_EVENT_COMM_IDL_

+#define _COS_EVENT_COMM_IDL_

+

+#pragma prefix "omg.org"

+

+module CosEventComm {
+
+   exception Disconnected{};
+
+   interface PushConsumer {
+      void push (in any data) raises(Disconnected);
+      void disconnect_push_consumer();
+   };
+
+    interface PushSupplier {
+      void disconnect_push_supplier();
+   };
+
+   interface PullSupplier {
+      any pull () raises(Disconnected);
+      any try_pull (out boolean has_event) raises(Disconnected);
+      void disconnect_pull_supplier();
+   };
+
+   interface PullConsumer {
+      void disconnect_pull_consumer();
+   };
+
+};
+
+#endif /* ifndef _COS_EVENT_COMM_IDL_ */
diff --git a/src/main/idl/CosNotification.idl b/src/main/idl/CosNotification.idl
new file mode 100644
index 0000000..a789700
--- /dev/null
+++ b/src/main/idl/CosNotification.idl
@@ -0,0 +1,180 @@
+/**

+ * This module is taken from the standard CORBA Notification Service

+ * 1.1, as described in:

+ *

+ * https://www.omg.org/spec/NOT/1.1/

+ *

+ * The idl was extracted from the following PDF:

+ * formal/04-10-13

+ */

+

+#ifndef _COS_NOTIFICATION_IDL_

+#define _COS_NOTIFICATION_IDL_

+

+#pragma prefix "omg.org"

+

+module CosNotification {
+
+   typedef string Istring;
+   typedef Istring PropertyName;
+   typedef any PropertyValue;
+
+   struct Property {
+      PropertyName name;
+      PropertyValue value;
+   };
+   typedef sequence<Property> PropertySeq;
+
+   // The following are the same, but serve different purposes.
+   typedef PropertySeq OptionalHeaderFields;
+   typedef PropertySeq FilterableEventBody;
+   typedef PropertySeq QoSProperties;
+   typedef PropertySeq AdminProperties;
+
+   struct _EventType {
+      string domain_name;
+      string type_name;
+   };
+   typedef sequence<_EventType> EventTypeSeq;
+
+   struct PropertyRange {
+      PropertyValue low_val;
+      PropertyValue high_val;
+   };
+
+   struct NamedPropertyRange {
+      PropertyName name;
+      PropertyRange range;
+   };
+   typedef sequence<NamedPropertyRange> NamedPropertyRangeSeq;
+
+   enum QoSError_code {
+      UNSUPPORTED_PROPERTY,
+      UNAVAILABLE_PROPERTY,
+      UNSUPPORTED_VALUE,
+      UNAVAILABLE_VALUE,
+      BAD_PROPERTY,
+      BAD_TYPE,
+      BAD_VALUE
+   };
+
+   struct PropertyError {
+      QoSError_code code;
+      PropertyName name;
+      PropertyRange available_range;
+   };
+   typedef sequence<PropertyError> PropertyErrorSeq;
+
+   exception UnsupportedQoS { PropertyErrorSeq qos_err; };
+   exception UnsupportedAdmin { PropertyErrorSeq admin_err; };
+
+   // Define the Structured Event structure
+   struct FixedEventHeader {
+      _EventType event_type;
+      string event_name;
+   };
+
+   struct EventHeader {
+      FixedEventHeader fixed_header;
+      OptionalHeaderFields variable_header;
+   };
+
+   struct StructuredEvent {
+      EventHeader header;
+      FilterableEventBody filterable_data;
+      any remainder_of_body;
+   }; // StructuredEvent
+   typedef sequence<StructuredEvent> EventBatch;
+
+   // The following constant declarations define the standard
+   // QoS property names and the associated values each property
+   // can take on. The name/value pairs for each standard property
+   // are grouped, beginning with a string constant defined for the
+   // property name, followed by the values the property can take on.
+
+   const string EventReliability = "EventReliability";
+   const short BestEffort = 0;
+   const short Persistent = 1;
+
+   const string ConnectionReliability = "ConnectionReliability";
+   // Can take on the same values as EventReliability
+
+   const string Priority = "Priority";
+   const short LowestPriority = -32767;
+   const short HighestPriority = 32767;
+   const short DefaultPriority = 0;
+
+   const string StartTime = "StartTime";
+   // StartTime takes a value of type TimeBase::UtcT.
+
+   const string StopTime = "StopTime";
+   // StopTime takes a value of type TimeBase::UtcT.
+
+   const string Timeout = "Timeout";
+   // Timeout takes on a value of type TimeBase::TimeT
+
+   const string OrderPolicy = "OrderPolicy";
+   const short AnyOrder = 0;
+   const short FifoOrder = 1;
+   const short PriorityOrder = 2;
+   const short DeadlineOrder = 3;
+
+   const string DiscardPolicy = "DiscardPolicy";
+   // DiscardPolicy takes on the same values as OrderPolicy, plus
+   const short LifoOrder = 4;
+
+   const string MaximumBatchSize = "MaximumBatchSize";
+   // MaximumBatchSize takes on a value of type long
+
+   const string PacingInterval = "PacingInterval";
+   // PacingInterval takes on a value of type TimeBase::TimeT
+
+   const string StartTimeSupported = "StartTimeSupported";
+   // StartTimeSupported takes on a boolean value
+
+   const string StopTimeSupported = "StopTimeSupported";
+   // StopTimeSupported takes on a boolean value
+
+   const string MaxEventsPerConsumer = "MaxEventsPerConsumer";
+   // MaxEventsPerConsumer takes on a value of type long
+
+   interface QoSAdmin {
+
+      QoSProperties get_qos();
+
+      void set_qos ( in QoSProperties qos) raises ( UnsupportedQoS );
+
+      void validate_qos (
+            in QoSProperties required_qos,
+            out NamedPropertyRangeSeq available_qos ) raises ( UnsupportedQoS );
+
+   }; // QosAdmin
+
+   // Admin properties are defined in similar manner as QoS
+   // properties. The only difference is that these properties
+   // are related to channel administration policies, as opposed
+   // message quality of service
+
+   const string MaxQueueLength = "MaxQueueLength";
+   // MaxQueueLength takes on a value of type long
+
+   const string MaxConsumers = "MaxConsumers";
+   // MaxConsumers takes on a value of type long
+
+   const string MaxSuppliers = "MaxSuppliers";
+   // MaxSuppliers takes on a value of type long
+
+   const string RejectNewEvents = "RejectNewEvents";
+   // RejectNewEvents takes on a value of type Boolean
+
+   interface AdminPropertiesAdmin {
+
+      AdminProperties get_admin();
+
+      void set_admin (in AdminProperties admin) raises ( UnsupportedAdmin);
+
+   }; // AdminPropertiesAdmin
+
+}; // CosNotification
+
+#endif /* _COS_NOTIFICATION_IDL_ */
diff --git a/src/main/idl/CosNotifyChannelAdmin.idl b/src/main/idl/CosNotifyChannelAdmin.idl
new file mode 100644
index 0000000..524d3ea
--- /dev/null
+++ b/src/main/idl/CosNotifyChannelAdmin.idl
@@ -0,0 +1,394 @@
+/**
+ * This module is taken from the standard CORBA Notification Service
+ * 1.1, as described in:
+ *
+ * https://www.omg.org/spec/NOT/1.1/
+ *
+ * The idl was extracted from the following PDF:
+ * formal/04-10-13
+ */
+
+#ifndef _COS_NOTIFY_CHANNEL_ADMIN_IDL_
+#define _COS_NOTIFY_CHANNEL_ADMIN_IDL_
+
+#include "CosNotification.idl"
+#include "CosNotifyFilter.idl"
+#include "CosNotifyComm.idl"
+#include "CosEventChannelAdmin.idl"
+
+#pragma prefix "omg.org"
+
+module CosNotifyChannelAdmin {
+
+   exception ConnectionAlreadyActive {};
+   exception ConnectionAlreadyInactive {};
+   exception NotConnected {};
+
+   // Forward declarations
+   interface ConsumerAdmin;
+   interface SupplierAdmin;
+   interface EventChannel;
+   interface EventChannelFactory;
+
+   enum ProxyType {
+      PUSH_ANY,
+      PULL_ANY,
+      PUSH_STRUCTURED,
+      PULL_STRUCTURED,
+      PUSH_SEQUENCE,
+      PULL_SEQUENCE,
+      PUSH_TYPED,
+      PULL_TYPED
+   };
+
+   enum ObtainInfoMode {
+      ALL_NOW_UPDATES_OFF,
+      ALL_NOW_UPDATES_ON,
+      NONE_NOW_UPDATES_OFF,
+      NONE_NOW_UPDATES_ON
+   };
+
+   interface ProxyConsumer :
+         CosNotification::QoSAdmin,
+         CosNotifyFilter::FilterAdmin {
+
+      readonly attribute ProxyType MyType;
+      readonly attribute SupplierAdmin MyAdmin;
+
+      CosNotification::EventTypeSeq obtain_subscription_types(
+            in ObtainInfoMode mode );
+
+      void validate_event_qos (
+            in CosNotification::QoSProperties required_qos,
+            out CosNotification::NamedPropertyRangeSeq available_qos)
+         raises (CosNotification::UnsupportedQoS);
+
+   }; // ProxyConsumer
+
+   interface ProxySupplier :
+         CosNotification::QoSAdmin,
+         CosNotifyFilter::FilterAdmin {
+
+      readonly attribute ProxyType MyType;
+      readonly attribute ConsumerAdmin MyAdmin;
+
+      attribute CosNotifyFilter::MappingFilter priority_filter;
+      attribute CosNotifyFilter::MappingFilter lifetime_filter;
+
+      CosNotification::EventTypeSeq obtain_offered_types(
+            in ObtainInfoMode mode );
+
+      void validate_event_qos (
+            in CosNotification::QoSProperties required_qos,
+            out CosNotification::NamedPropertyRangeSeq available_qos)
+         raises (CosNotification::UnsupportedQoS);
+
+   }; // ProxySupplier
+
+   interface ProxyPushConsumer :
+         ProxyConsumer,
+         CosNotifyComm::PushConsumer {
+
+      void connect_any_push_supplier (
+            in CosEventComm::PushSupplier push_supplier)
+         raises(CosEventChannelAdmin::AlreadyConnected);
+
+   }; // ProxyPushConsumer
+
+   interface StructuredProxyPushConsumer :
+         ProxyConsumer,
+         CosNotifyComm::StructuredPushConsumer {
+
+      void connect_structured_push_supplier (
+            in CosNotifyComm::StructuredPushSupplier push_supplier)
+         raises(CosEventChannelAdmin::AlreadyConnected);
+
+   }; // StructuredProxyPushConsumer
+
+   interface SequenceProxyPushConsumer :
+         ProxyConsumer,
+         CosNotifyComm::SequencePushConsumer {
+
+      void connect_sequence_push_supplier (
+            in CosNotifyComm::SequencePushSupplier push_supplier)
+         raises(CosEventChannelAdmin::AlreadyConnected);
+
+   }; // SequenceProxyPushConsumer
+
+   interface ProxyPullSupplier :
+         ProxySupplier,
+         CosNotifyComm::PullSupplier {
+
+      void connect_any_pull_consumer (
+            in CosEventComm::PullConsumer pull_consumer)
+         raises(CosEventChannelAdmin::AlreadyConnected);
+
+   }; // ProxyPullSupplier
+
+   interface StructuredProxyPullSupplier :
+         ProxySupplier,
+         CosNotifyComm::StructuredPullSupplier {
+
+      void connect_structured_pull_consumer (
+            in CosNotifyComm::StructuredPullConsumer pull_consumer)
+         raises(CosEventChannelAdmin::AlreadyConnected);
+
+   }; // StructuredProxyPullSupplier
+
+   interface SequenceProxyPullSupplier :
+         ProxySupplier,
+         CosNotifyComm::SequencePullSupplier {
+
+      void connect_sequence_pull_consumer (
+            in CosNotifyComm::SequencePullConsumer pull_consumer)
+         raises(CosEventChannelAdmin::AlreadyConnected);
+
+   }; // SequenceProxyPullSupplier
+
+   interface ProxyPullConsumer :
+         ProxyConsumer,
+         CosNotifyComm::PullConsumer {
+
+      void connect_any_pull_supplier (
+            in CosEventComm::PullSupplier pull_supplier)
+         raises(CosEventChannelAdmin::AlreadyConnected,
+                CosEventChannelAdmin::TypeError );
+
+      void suspend_connection()
+         raises(ConnectionAlreadyInactive, NotConnected);
+
+      void resume_connection()
+         raises(ConnectionAlreadyActive, NotConnected);
+
+   }; // ProxyPullConsumer
+
+   interface StructuredProxyPullConsumer :
+         ProxyConsumer,
+         CosNotifyComm::StructuredPullConsumer {
+
+      void connect_structured_pull_supplier (
+            in CosNotifyComm::StructuredPullSupplier pull_supplier)
+         raises(CosEventChannelAdmin::AlreadyConnected,
+                CosEventChannelAdmin::TypeError );
+
+      void suspend_connection()
+         raises(ConnectionAlreadyInactive, NotConnected);
+
+      void resume_connection()
+         raises(ConnectionAlreadyActive, NotConnected);
+
+   }; // StructuredProxyPullConsumer
+
+   interface SequenceProxyPullConsumer :
+         ProxyConsumer,
+         CosNotifyComm::SequencePullConsumer {
+
+      void connect_sequence_pull_supplier (
+            in CosNotifyComm::SequencePullSupplier pull_supplier)
+         raises(CosEventChannelAdmin::AlreadyConnected,
+                CosEventChannelAdmin::TypeError );
+
+      void suspend_connection()
+         raises(ConnectionAlreadyInactive, NotConnected);
+
+      void resume_connection()
+         raises(ConnectionAlreadyActive, NotConnected);
+
+   }; // SequenceProxyPullConsumer
+
+   interface ProxyPushSupplier :
+         ProxySupplier,
+         CosNotifyComm::PushSupplier {
+
+      void connect_any_push_consumer (
+            in CosEventComm::PushConsumer push_consumer)
+         raises(CosEventChannelAdmin::AlreadyConnected,
+                CosEventChannelAdmin::TypeError );
+
+      void suspend_connection()
+         raises(ConnectionAlreadyInactive, NotConnected);
+
+      void resume_connection()
+         raises(ConnectionAlreadyActive, NotConnected);
+
+   }; // ProxyPushSupplier
+
+   interface StructuredProxyPushSupplier :
+         ProxySupplier,
+         CosNotifyComm::StructuredPushSupplier {
+
+      void connect_structured_push_consumer (
+            in CosNotifyComm::StructuredPushConsumer push_consumer)
+         raises(CosEventChannelAdmin::AlreadyConnected,
+                CosEventChannelAdmin::TypeError );
+
+      void suspend_connection()
+         raises(ConnectionAlreadyInactive, NotConnected);
+
+      void resume_connection()
+         raises(ConnectionAlreadyActive, NotConnected);
+
+   }; // StructuredProxyPushSupplier
+
+   interface SequenceProxyPushSupplier :
+         ProxySupplier,
+         CosNotifyComm::SequencePushSupplier {
+
+      void connect_sequence_push_consumer (
+            in CosNotifyComm::SequencePushConsumer push_consumer)
+         raises(CosEventChannelAdmin::AlreadyConnected,
+                CosEventChannelAdmin::TypeError );
+
+      void suspend_connection()
+         raises(ConnectionAlreadyInactive, NotConnected);
+
+      void resume_connection()
+         raises(ConnectionAlreadyActive, NotConnected);
+
+   }; // SequenceProxyPushSupplier
+
+   typedef long ProxyID;
+   typedef sequence <ProxyID> ProxyIDSeq;
+
+   enum ClientType {
+      ANY_EVENT,
+      STRUCTURED_EVENT,
+      SEQUENCE_EVENT
+   };
+
+   enum InterFilterGroupOperator { AND_OP, OR_OP };
+
+   typedef long AdminID;
+   typedef sequence<AdminID> AdminIDSeq;
+
+   exception AdminNotFound {};
+   exception ProxyNotFound {};
+
+   struct AdminLimit {
+      CosNotification::PropertyName name;
+      CosNotification::PropertyValue value;
+   };
+
+   exception AdminLimitExceeded { AdminLimit admin_property_err; };
+
+   interface ConsumerAdmin :
+         CosNotification::QoSAdmin,
+         CosNotifyComm::NotifySubscribe,
+         CosNotifyFilter::FilterAdmin,
+         CosEventChannelAdmin::ConsumerAdmin {
+
+      readonly attribute AdminID MyID;
+      readonly attribute EventChannel MyChannel;
+
+      readonly attribute InterFilterGroupOperator MyOperator;
+
+      attribute CosNotifyFilter::MappingFilter priority_filter;
+      attribute CosNotifyFilter::MappingFilter lifetime_filter;
+
+      readonly attribute ProxyIDSeq pull_suppliers;
+      readonly attribute ProxyIDSeq push_suppliers;
+
+      ProxySupplier get_proxy_supplier ( in ProxyID proxy_id )
+         raises ( ProxyNotFound );
+
+      ProxySupplier obtain_notification_pull_supplier (
+            in ClientType ctype,
+            out ProxyID proxy_id)
+         raises ( AdminLimitExceeded );
+
+      ProxySupplier obtain_notification_push_supplier (
+            in ClientType ctype,
+            out ProxyID proxy_id)
+         raises ( AdminLimitExceeded );
+
+      void destroy();
+
+   }; // ConsumerAdmin
+
+   interface SupplierAdmin :
+         CosNotification::QoSAdmin,
+         CosNotifyComm::NotifyPublish,
+         CosNotifyFilter::FilterAdmin,
+         CosEventChannelAdmin::SupplierAdmin {
+
+      readonly attribute AdminID MyID;
+      readonly attribute EventChannel MyChannel;
+
+      readonly attribute InterFilterGroupOperator MyOperator;
+
+      readonly attribute ProxyIDSeq pull_consumers;
+      readonly attribute ProxyIDSeq push_consumers;
+
+      ProxyConsumer get_proxy_consumer ( in ProxyID proxy_id )
+         raises ( ProxyNotFound );
+
+      ProxyConsumer obtain_notification_pull_consumer (
+            in ClientType ctype,
+            out ProxyID proxy_id)
+         raises ( AdminLimitExceeded );
+
+      ProxyConsumer obtain_notification_push_consumer (
+            in ClientType ctype,
+            out ProxyID proxy_id)
+         raises ( AdminLimitExceeded );
+
+      void destroy();
+
+   }; // SupplierAdmin
+
+   interface EventChannel :
+      CosNotification::QoSAdmin,
+      CosNotification::AdminPropertiesAdmin,
+      CosEventChannelAdmin::EventChannel {
+
+      readonly attribute EventChannelFactory MyFactory;
+
+      readonly attribute ConsumerAdmin default_consumer_admin;
+      readonly attribute SupplierAdmin default_supplier_admin;
+
+      readonly attribute CosNotifyFilter::FilterFactory
+                  default_filter_factory;
+
+      ConsumerAdmin new_for_consumers(
+            in InterFilterGroupOperator op,
+            out AdminID id );
+
+      SupplierAdmin new_for_suppliers(
+            in InterFilterGroupOperator op,
+            out AdminID id );
+
+      ConsumerAdmin get_consumeradmin ( in AdminID id )
+         raises (AdminNotFound);
+
+      SupplierAdmin get_supplieradmin ( in AdminID id )
+         raises (AdminNotFound);
+
+      AdminIDSeq get_all_consumeradmins();
+      AdminIDSeq get_all_supplieradmins();
+
+   }; // EventChannel
+
+   typedef long ChannelID;
+   typedef sequence<ChannelID> ChannelIDSeq;
+
+   exception ChannelNotFound {};
+
+   interface EventChannelFactory {
+
+      EventChannel create_channel (
+            in CosNotification::QoSProperties initial_qos,
+            in CosNotification::AdminProperties initial_admin,
+            out ChannelID id)
+         raises(CosNotification::UnsupportedQoS,
+                CosNotification::UnsupportedAdmin );
+
+      ChannelIDSeq get_all_channels();
+
+      EventChannel get_event_channel ( in ChannelID id )
+         raises (ChannelNotFound);
+
+   }; // EventChannelFactory
+   
+}; // CosNotifyChannelAdmin
+
+#endif /* _COS_NOTIFY_CHANNEL_ADMIN_IDL_ */
diff --git a/src/main/idl/CosNotifyComm.idl b/src/main/idl/CosNotifyComm.idl
new file mode 100644
index 0000000..33df3d7
--- /dev/null
+++ b/src/main/idl/CosNotifyComm.idl
@@ -0,0 +1,135 @@
+/**
+ * This module is taken from the standard CORBA Notification Service
+ * 1.1, as described in:
+ *
+ * https://www.omg.org/spec/NOT/1.1/
+ *
+ * The idl was extracted from the following PDF:
+ * formal/04-10-13
+ */
+
+#ifndef _COS_NOTIFY_COMM_IDL_
+#define _COS_NOTIFY_COMM_IDL_
+
+#include "CosNotification.idl"
+#include "CosEventComm.idl"
+
+#pragma prefix "omg.org"
+
+module CosNotifyComm {
+
+   exception InvalidEventType { CosNotification::_EventType type; };
+
+   interface NotifyPublish {
+
+      void offer_change (
+            in CosNotification::EventTypeSeq added,
+            in CosNotification::EventTypeSeq removed )
+         raises ( InvalidEventType );
+
+   }; // NotifyPublish
+
+   interface NotifySubscribe {
+
+      void subscription_change(
+            in CosNotification::EventTypeSeq added,
+            in CosNotification::EventTypeSeq removed )
+         raises ( InvalidEventType );
+
+   }; // NotifySubscribe
+
+   interface PushConsumer :
+      NotifyPublish,
+      CosEventComm::PushConsumer {
+   }; // PushConsumer
+
+   interface PullConsumer :
+      NotifyPublish,
+      CosEventComm::PullConsumer {
+   }; // PullConsumer
+
+   interface PullSupplier :
+      NotifySubscribe,
+      CosEventComm::PullSupplier {
+   }; // PullSupplier
+
+   interface PushSupplier :
+      NotifySubscribe,
+      CosEventComm::PushSupplier {
+   };
+
+   interface StructuredPushConsumer : NotifyPublish {
+
+      void push_structured_event(
+            in CosNotification::StructuredEvent notification)
+         raises(CosEventComm::Disconnected);
+
+      void disconnect_structured_push_consumer();
+
+   }; // StructuredPushConsumer
+
+   interface StructuredPullConsumer : NotifyPublish {
+      
+      void disconnect_structured_pull_consumer();
+
+   }; // StructuredPullConsumer
+
+   interface StructuredPullSupplier : NotifySubscribe {
+
+      CosNotification::StructuredEvent pull_structured_event()
+         raises(CosEventComm::Disconnected);
+
+      CosNotification::StructuredEvent try_pull_structured_event(
+            out boolean has_event)
+         raises(CosEventComm::Disconnected);
+
+      void disconnect_structured_pull_supplier();
+
+   }; // StructuredPullSupplier
+
+   interface StructuredPushSupplier : NotifySubscribe {
+      
+      void disconnect_structured_push_supplier();
+
+   }; // StructuredPushSupplier
+
+   interface SequencePushConsumer : NotifyPublish {
+
+      void push_structured_events(
+            in CosNotification::EventBatch notifications)
+         raises(CosEventComm::Disconnected);
+
+      void disconnect_sequence_push_consumer();
+
+   }; // SequencePushConsumer
+
+   interface SequencePullConsumer : NotifyPublish {
+      
+      void disconnect_sequence_pull_consumer();
+
+   }; // SequencePullConsumer
+
+   interface SequencePullSupplier : NotifySubscribe {
+
+      CosNotification::EventBatch pull_structured_events(
+            in long max_number )
+         raises(CosEventComm::Disconnected);
+
+      CosNotification::EventBatch try_pull_structured_events(
+            in long max_number,
+            out boolean has_event)
+         raises(CosEventComm::Disconnected);
+
+      void disconnect_sequence_pull_supplier();
+
+   }; // SequencePullSupplier
+
+   interface SequencePushSupplier : NotifySubscribe {
+      
+      void disconnect_sequence_push_supplier();
+
+   }; // SequencePushSupplier
+
+}; // CosNotifyComm
+
+#endif /* _COS_NOTIFY_COMM_IDL_ */
diff --git a/src/main/idl/CosNotifyFilter.idl b/src/main/idl/CosNotifyFilter.idl
new file mode 100644
index 0000000..977cc3b
--- /dev/null
+++ b/src/main/idl/CosNotifyFilter.idl
@@ -0,0 +1,187 @@
+/**
+ * This module is taken from the standard CORBA Notification Service
+ * 1.1, as described in:
+ *
+ * https://www.omg.org/spec/NOT/1.1/
+ *
+ * The idl was extracted from the following PDF:
+ * formal/04-10-13
+ */
+
+#ifndef _COS_NOTIFY_FILTER_IDL_
+#define _COS_NOTIFY_FILTER_IDL_
+
+#include "CosNotifyComm.idl"
+
+#pragma prefix "omg.org"
+
+module CosNotifyFilter {
+
+   typedef long ConstraintID;
+
+   struct ConstraintExp {
+      CosNotification::EventTypeSeq event_types;
+      string constraint_expr;
+   };
+
+   typedef sequence<ConstraintID> ConstraintIDSeq;
+   typedef sequence<ConstraintExp> ConstraintExpSeq;
+
+   struct ConstraintInfo {
+      ConstraintExp constraint_expression;
+      ConstraintID constraint_id;
+   };
+
+   typedef sequence<ConstraintInfo> ConstraintInfoSeq;
+
+   struct MappingConstraintPair {
+      ConstraintExp constraint_expression;
+      any result_to_set;
+   };
+
+   typedef sequence<MappingConstraintPair> MappingConstraintPairSeq;
+
+   struct MappingConstraintInfo {
+      ConstraintExp constraint_expression;
+      ConstraintID constraint_id;
+      any value;
+   };
+
+   typedef sequence<MappingConstraintInfo> MappingConstraintInfoSeq;
+
+   typedef long CallbackID;
+   typedef sequence<CallbackID> CallbackIDSeq;
+
+   exception UnsupportedFilterableData {};
+   exception InvalidGrammar {};
+   exception InvalidConstraint {ConstraintExp constr;};
+   exception DuplicateConstraintID {ConstraintID id;};
+   exception ConstraintNotFound {ConstraintID id;};
+   
+   exception CallbackNotFound {};
+
+   exception InvalidValue {ConstraintExp constr; any value;};
+
+   interface Filter {
+
+      readonly attribute string constraint_grammar;
+
+      ConstraintInfoSeq add_constraints (
+            in ConstraintExpSeq constraint_list)
+         raises (InvalidConstraint);
+
+      void modify_constraints (
+            in ConstraintIDSeq del_list,
+            in ConstraintInfoSeq modify_list)
+         raises (InvalidConstraint, ConstraintNotFound);
+
+      ConstraintInfoSeq get_constraints(
+            in ConstraintIDSeq id_list)
+         raises (ConstraintNotFound);
+
+      ConstraintInfoSeq get_all_constraints();
+
+      void remove_all_constraints();
+
+      void destroy();
+
+      boolean match ( in any filterable_data )
+         raises (UnsupportedFilterableData);
+
+      boolean match_structured (
+            in CosNotification::StructuredEvent filterable_data )
+         raises (UnsupportedFilterableData);
+
+      boolean match_typed (
+            in CosNotification::PropertySeq filterable_data )
+         raises (UnsupportedFilterableData);
+
+      CallbackID attach_callback (
+            in CosNotifyComm::NotifySubscribe callback);
+
+      void detach_callback ( in CallbackID callback)
+         raises ( CallbackNotFound );
+
+      CallbackIDSeq get_callbacks();
+
+   }; // Filter
+
+   interface MappingFilter {
+
+      readonly attribute string constraint_grammar;
+
+      readonly attribute CORBA::TypeCode value_type;
+
+      readonly attribute any default_value;
+
+      MappingConstraintInfoSeq add_mapping_constraints (
+            in MappingConstraintPairSeq pair_list)
+         raises (InvalidConstraint, InvalidValue);
+
+      void modify_mapping_constraints (
+            in ConstraintIDSeq del_list,
+            in MappingConstraintInfoSeq modify_list)
+         raises (InvalidConstraint, InvalidValue,
+                  ConstraintNotFound);
+
+      MappingConstraintInfoSeq get_mapping_constraints (
+            in ConstraintIDSeq id_list)
+         raises (ConstraintNotFound);
+
+      MappingConstraintInfoSeq get_all_mapping_constraints();
+
+      void remove_all_mapping_constraints();
+
+      void destroy();
+
+      boolean match (
+            in any filterable_data,
+            out any result_to_set )
+         raises (UnsupportedFilterableData);
+
+      boolean match_structured (
+            in CosNotification::StructuredEvent filterable_data,
+            out any result_to_set)
+         raises (UnsupportedFilterableData);
+
+      boolean match_typed (
+            in CosNotification::PropertySeq filterable_data,
+            out any result_to_set)
+         raises (UnsupportedFilterableData);
+
+   }; // MappingFilter
+
+   interface FilterFactory {
+
+      Filter create_filter ( in string constraint_grammar)
+         raises (InvalidGrammar);
+
+      MappingFilter create_mapping_filter (
+            in string constraint_grammar,
+            in any default_value)
+         raises(InvalidGrammar);
+
+   }; // FilterFactory
+
+   typedef long FilterID;
+   typedef sequence<FilterID> FilterIDSeq;
+
+   exception FilterNotFound {};
+
+   interface FilterAdmin {
+
+      FilterID add_filter ( in Filter new_filter );
+
+      void remove_filter ( in FilterID filter ) raises ( FilterNotFound );
+
+      Filter get_filter ( in FilterID filter ) raises ( FilterNotFound );
+
+      FilterIDSeq get_all_filters();
+
+      void remove_all_filters();
+
+   }; // FilterAdmin
+
+}; // CosNotifyFilter
+
+#endif /* _COS_NOTIFY_FILTER_IDL_ */
diff --git a/src/main/idl/idl.config b/src/main/idl/idl.config
new file mode 100644
index 0000000..7c76796
--- /dev/null
+++ b/src/main/idl/idl.config
@@ -0,0 +1,6 @@
+PkgPrefix.CosEventComm=org.omg

+PkgPrefix.CosNotification=org.omg

+PkgPrefix.CosNotifyComm=org.omg

+PkgPrefix.CosNotifyFilter=org.omg

+PkgPrefix.CosEventChannelAdmin=org.omg

+PkgPrefix.CosNotifyChannelAdmin=org.omg
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/filetransfer/Transfer.java b/src/main/java/org/eclipse/mdm/api/odsadapter/filetransfer/Transfer.java
index 88605a7..63041b8 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/filetransfer/Transfer.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/filetransfer/Transfer.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt 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.odsadapter.filetransfer;
 
 import java.io.InputStream;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/Cache.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/Cache.java
index 2238bff..af9a8ae 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/Cache.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/Cache.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt 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.odsadapter.lookup;
 
 import java.util.HashMap;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/ChildRequest.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/ChildRequest.java
index 66e1cc1..cb72fc0 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/ChildRequest.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/ChildRequest.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt 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.odsadapter.lookup;
 
 import static java.util.stream.Stream.concat;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityLoader.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityLoader.java
index e8a0916..471301e 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityLoader.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityLoader.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt 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.odsadapter.lookup;
 
 import java.util.Collection;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRecord.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRecord.java
index 4c5b243..a47ff19 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRecord.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRecord.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt 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.odsadapter.lookup;
 
 import org.eclipse.mdm.api.base.adapter.Core;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRequest.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRequest.java
index c6b53dc..f898e09 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRequest.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRequest.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt 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.odsadapter.lookup;
 
 import static java.util.stream.Collectors.toList;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityResult.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityResult.java
index c1ab377..fe2046f 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityResult.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityResult.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt 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.odsadapter.lookup;
 
 import static org.eclipse.mdm.api.dflt.model.CatalogAttribute.VATTR_ENUMERATION_NAME;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/RelationConfig.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/RelationConfig.java
index a2dee0d..495e498 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/RelationConfig.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/RelationConfig.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt 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.odsadapter.lookup;
 
 import java.util.ArrayList;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfig.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfig.java
index 29683eb..e40f7f2 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfig.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfig.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt 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.odsadapter.lookup.config;
 
 import java.util.ArrayList;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfigRepository.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfigRepository.java
index d032b59..3cd1536 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfigRepository.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfigRepository.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt 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.odsadapter.lookup.config;
 
 import java.util.HashMap;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/NotificationEntityLoader.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/NotificationEntityLoader.java
index 63f5d41..62158b4 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/NotificationEntityLoader.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/NotificationEntityLoader.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2017-2018 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.odsadapter.notification;
 
 import java.util.ArrayList;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/ODSNotificationServiceFactory.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/ODSNotificationServiceFactory.java
index 57be20d..f612481 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/ODSNotificationServiceFactory.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/ODSNotificationServiceFactory.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2017-2018 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.odsadapter.notification;
 
 import java.util.Map;
@@ -9,6 +17,8 @@
 import org.eclipse.mdm.api.base.notification.NotificationService;
 import org.eclipse.mdm.api.base.query.QueryService;
 import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.odsadapter.ODSContextFactory;
+import org.eclipse.mdm.api.odsadapter.notification.avalon.AvalonNotificationManager;
 import org.eclipse.mdm.api.odsadapter.notification.peak.PeakNotificationManager;
 import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
 import org.slf4j.Logger;
@@ -59,25 +69,24 @@
 			}
 		} else if (SERVER_TYPE_AVALON.equalsIgnoreCase(type)) {
 
-			throw new IllegalArgumentException("Avalon notification service is not supported yet.");
-//			String serviceName = getParameter(parameters, ODSContextFactory.PARAM_SERVICENAME);
-//			serviceName = serviceName.replace(".ASAM-ODS", "");
-//			String nameServiceURL = getParameter(parameters, ODSContextFactory.PARAM_NAMESERVICE);
-//
-//			LOGGER.info("Connecting to Avalon Notification Server ...");
-//			LOGGER.info("Name service URL: {}", nameServiceURL);
-//			LOGGER.info("Service name: {}", serviceName);
-//
-//			long pollingInterval = 500L;
-//			try {
-//				pollingInterval = Long.parseLong(getParameter(parameters, PARAM_POLLING_INTERVAL));
-//			} catch (NumberFormatException | ConnectionException e) {
-//				LOGGER.warn("Could not parse parse parameter pollingInterval. Using default value: " + pollingInterval,
-//						e);
-//			}
-//
-//			return new AvalonNotificationManager((ODSModelManager) mm, queryService, serviceName, nameServiceURL, true,
-//					pollingInterval);
+			String serviceName = getParameter(parameters, ODSContextFactory.PARAM_SERVICENAME);
+			serviceName = serviceName.replace(".ASAM-ODS", "");
+			String nameServiceURL = getParameter(parameters, ODSContextFactory.PARAM_NAMESERVICE);
+
+			LOGGER.info("Connecting to Avalon Notification Server ...");
+			LOGGER.info("Name service URL: {}", nameServiceURL);
+			LOGGER.info("Service name: {}", serviceName);
+
+			long pollingInterval = 500L;
+			try {
+				pollingInterval = Long.parseLong(getParameter(parameters, PARAM_POLLING_INTERVAL));
+			} catch (NumberFormatException | ConnectionException e) {
+				LOGGER.warn("Could not parse parse parameter pollingInterval. Using default value: " + pollingInterval,
+						e);
+			}
+
+			return new AvalonNotificationManager((ODSModelManager) mm, queryService, serviceName, nameServiceURL, true,
+					pollingInterval);
 		} else {
 			throw new ConnectionException("Invalid server type. Expected on of: 'peak'");
 		}
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/AvalonNotificationManager.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/AvalonNotificationManager.java
index d30c966..e63ccf3 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/AvalonNotificationManager.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/AvalonNotificationManager.java
@@ -1,182 +1,190 @@
-//package org.eclipse.mdm.api.odsadapter.notification.avalon;
-//
-//import java.util.Arrays;
-//import java.util.HashMap;
-//import java.util.List;
-//import java.util.Map;
-//import java.util.Set;
-//import java.util.concurrent.Executors;
-//import java.util.concurrent.ScheduledExecutorService;
-//import java.util.concurrent.ScheduledFuture;
-//import java.util.concurrent.TimeUnit;
-//import java.util.stream.Collectors;
-//
-//import org.asam.ods.T_LONGLONG;
-//import org.eclipse.mdm.api.base.adapter.EntityType;
-//import org.eclipse.mdm.api.base.model.ContextComponent;
-//import org.eclipse.mdm.api.base.model.ContextDescribable;
-//import org.eclipse.mdm.api.base.model.ContextRoot;
-//import org.eclipse.mdm.api.base.model.User;
-//import org.eclipse.mdm.api.base.notification.NotificationException;
-//import org.eclipse.mdm.api.base.notification.NotificationFilter;
-//import org.eclipse.mdm.api.base.notification.NotificationFilter.ModificationType;
-//import org.eclipse.mdm.api.base.notification.NotificationListener;
-//import org.eclipse.mdm.api.base.notification.NotificationService;
-//import org.eclipse.mdm.api.base.query.DataAccessException;
-//import org.eclipse.mdm.api.base.query.QueryService;
-//import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig.Key;
-//import org.eclipse.mdm.api.odsadapter.notification.NotificationEntityLoader;
-//import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
-//import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
-//import org.omg.CORBA.ORB;
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//
-//import com.highqsoft.avalonCorbaNotification.notification.MODE_DELETE;
-//import com.highqsoft.avalonCorbaNotification.notification.MODE_INSERT;
-//import com.highqsoft.avalonCorbaNotification.notification.MODE_MODIFYRIGHTS;
-//import com.highqsoft.avalonCorbaNotification.notification.MODE_REPLACE;
-//
-///**
-// * Notification manager for handling notifications from the Avalon Notification
-// * Service
-// * 
-// * ModificationType.MODEL_MODIFIED is not supported!
-// * 
-// * @since 1.0.0
-// * @author Matthias Koller, Peak Solution GmbH
-// *
-// */
-//public class AvalonNotificationManager implements NotificationService {
-//
-//	private static final Logger LOGGER = LoggerFactory.getLogger(AvalonNotificationManager.class);
-//
-//	private final Map<String, EventProcessor> eventProcessors = new HashMap<>();
-//
-//	private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
-//
-//	private final ODSModelManager modelManager;
-//	private final String serviceName;
-//	private final String nameServiceURL;
-//	private long pollingInterval = 500L;
-//	private final NotificationEntityLoader loader;
-//
-//	private final ORB orb = ORB.init(new String[] {}, System.getProperties());
-//
-//	/**
-//	 * Creates a new AvalonNotificationManager.
-//	 * 
-//	 * @param modelManager
-//	 *            ODSModelManager used to laod entities.
-//	 * @param serviceName
-//	 *            name of the notification service.
-//	 * @param nameServiceURL
-//	 *            URL of the name service.
-//	 * @param loadContextDescribable
-//	 *            if true, notifications for {@link ContextRoot} and
-//	 *            {@link ContextComponent} will load their parent
-//	 *            {@link ContextDescribable}.
-//	 * @param pollingInterval
-//	 *            polling interval in milleseconds
-//	 */
-//	public AvalonNotificationManager(ODSModelManager modelManager, QueryService queryService, String serviceName, String nameServiceURL,
-//			boolean loadContextDescribable, long pollingInterval) {
-//		this.modelManager = modelManager;
-//		this.serviceName = serviceName;
-//		this.nameServiceURL = nameServiceURL;
-//		this.pollingInterval = pollingInterval;
-//		loader = new NotificationEntityLoader(modelManager, queryService, loadContextDescribable);
-//	}
-//
-//	@Override
-//	public void register(String registration, NotificationFilter filter, final NotificationListener listener)
-//			throws NotificationException {
-//		try {
-//			EventProcessor consumer = new EventProcessor(orb, listener, this, nameServiceURL, serviceName);
-//
-//			List<String> aids = filter.getEntityTypes().stream().map(e -> e.getId()).collect(Collectors.toList());
-//
-//			Set<ModificationType> modes = filter.getTypes().stream()
-//					.filter(m -> !ModificationType.MODEL_MODIFIED.equals(m)).collect(Collectors.toSet());
-//
-//			consumer.connect();
-//			consumer.setFilter(aids, modes);
-//
-//			ScheduledFuture<?> future = executor.scheduleAtFixedRate(consumer, 0, pollingInterval,
-//					TimeUnit.MILLISECONDS);
-//			consumer.setFuture(future);
-//
-//			eventProcessors.put(registration, consumer);
-//		} catch (Exception e) {
-//			throw new NotificationException("Exception creating notification listener registration!", e);
-//		}
-//	}
-//
-//	@Override
-//	public void deregister(String registration) {
-//		EventProcessor processor = eventProcessors.get(registration);
-//		if (processor != null) {
-//			processor.disconnect();
-//			eventProcessors.remove(registration);
-//		}
-//	}
-//
-//	@Override
-//	public void close(boolean isDeregisterAll) throws NotificationException {
-//		LOGGER.info("Closing NotificationManager...");
-//
-//		for (String registration : eventProcessors.keySet()) {
-//			LOGGER.debug("Disconnecting registration '" + registration + "'.");
-//			deregister(registration);
-//		}
-//
-//		try {
-//			executor.shutdown();
-//			boolean terminated = executor.awaitTermination(10, TimeUnit.SECONDS);
-//			if (!terminated) {
-//				throw new NotificationException("Could not close all registrations!");
-//			}
-//		} catch (InterruptedException e) {
-//			throw new NotificationException("Could not close all registrations!", e);
-//		}
-//	}
-//
-//	void processException(Exception e) {
-//		LOGGER.error("Exception during notification processing!", e);
-//	}
-//
-//	void processNotification(short mode, T_LONGLONG aeId, T_LONGLONG ieId, T_LONGLONG userId, String timestamp,
-//			NotificationListener notificationListener) {
-//
-//		try {
-//			User user = loader.load(new Key<>(User.class), Long.toString(ODSConverter.fromODSLong(userId)));
-//			LOGGER.debug("User loaded");
-//
-//			EntityType entityType = modelManager.getEntityTypeById(Long.toString(ODSConverter.fromODSLong(aeId)));
-//			List<String> ids = Arrays.asList(Long.toString(ODSConverter.fromODSLong(ieId)));
-//
-//			if (LOGGER.isTraceEnabled()) {
-//				LOGGER.trace("Notification event with: entityType=" + entityType + ", user=" + user);
-//			}
-//
-//			switch (mode) {
-//			case MODE_INSERT.value:
-//				notificationListener.instanceCreated(loader.loadEntities(entityType, ids), user);
-//				break;
-//			case MODE_REPLACE.value:
-//				notificationListener.instanceModified(loader.loadEntities(entityType, ids), user);
-//				break;
-//			case MODE_DELETE.value:
-//				notificationListener.instanceDeleted(entityType, ids, user);
-//				break;
-//			case MODE_MODIFYRIGHTS.value:
-//				notificationListener.securityModified(entityType, ids, user);
-//				break;
-//			default:
-//				processException(new NotificationException("Invalid notification type!"));
-//			}
-//		} catch (DataAccessException e) {
-//			processException(new NotificationException("Cannot load data for notification!", e));
-//		}
-//	}
-//}
+/*
+ * Copyright (c) 2017-2018 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.odsadapter.notification.avalon;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import org.asam.ods.T_LONGLONG;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.ContextComponent;
+import org.eclipse.mdm.api.base.model.ContextDescribable;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.User;
+import org.eclipse.mdm.api.base.notification.NotificationException;
+import org.eclipse.mdm.api.base.notification.NotificationFilter;
+import org.eclipse.mdm.api.base.notification.NotificationFilter.ModificationType;
+import org.eclipse.mdm.api.base.notification.NotificationListener;
+import org.eclipse.mdm.api.base.notification.NotificationService;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig.Key;
+import org.eclipse.mdm.api.odsadapter.notification.NotificationEntityLoader;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+import org.omg.CORBA.ORB;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.highqsoft.avalonCorbaNotification.notification.MODE_DELETE;
+import com.highqsoft.avalonCorbaNotification.notification.MODE_INSERT;
+import com.highqsoft.avalonCorbaNotification.notification.MODE_MODIFYRIGHTS;
+import com.highqsoft.avalonCorbaNotification.notification.MODE_REPLACE;
+
+/**
+ * Notification manager for handling notifications from the Avalon Notification
+ * Service
+ * 
+ * ModificationType.MODEL_MODIFIED is not supported!
+ * 
+ * @since 1.0.0
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+public class AvalonNotificationManager implements NotificationService {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(AvalonNotificationManager.class);
+
+	private final Map<String, EventProcessor> eventProcessors = new HashMap<>();
+
+	private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
+
+	private final ODSModelManager modelManager;
+	private final String serviceName;
+	private final String nameServiceURL;
+	private long pollingInterval = 500L;
+	private final NotificationEntityLoader loader;
+
+	private final ORB orb = ORB.init(new String[] {}, System.getProperties());
+
+	/**
+	 * Creates a new AvalonNotificationManager.
+	 * 
+	 * @param modelManager
+	 *            ODSModelManager used to laod entities.
+	 * @param serviceName
+	 *            name of the notification service.
+	 * @param nameServiceURL
+	 *            URL of the name service.
+	 * @param loadContextDescribable
+	 *            if true, notifications for {@link ContextRoot} and
+	 *            {@link ContextComponent} will load their parent
+	 *            {@link ContextDescribable}.
+	 * @param pollingInterval
+	 *            polling interval in milleseconds
+	 */
+	public AvalonNotificationManager(ODSModelManager modelManager, QueryService queryService, String serviceName, String nameServiceURL,
+			boolean loadContextDescribable, long pollingInterval) {
+		this.modelManager = modelManager;
+		this.serviceName = serviceName;
+		this.nameServiceURL = nameServiceURL;
+		this.pollingInterval = pollingInterval;
+		loader = new NotificationEntityLoader(modelManager, queryService, loadContextDescribable);
+	}
+
+	@Override
+	public void register(String registration, NotificationFilter filter, final NotificationListener listener)
+			throws NotificationException {
+		try {
+			EventProcessor consumer = new EventProcessor(orb, listener, this, nameServiceURL, serviceName);
+
+			List<String> aids = filter.getEntityTypes().stream().map(e -> e.getId()).collect(Collectors.toList());
+
+			Set<ModificationType> modes = filter.getTypes().stream()
+					.filter(m -> !ModificationType.MODEL_MODIFIED.equals(m)).collect(Collectors.toSet());
+
+			consumer.connect();
+			consumer.setFilter(aids, modes);
+
+			ScheduledFuture<?> future = executor.scheduleAtFixedRate(consumer, 0, pollingInterval,
+					TimeUnit.MILLISECONDS);
+			consumer.setFuture(future);
+
+			eventProcessors.put(registration, consumer);
+		} catch (Exception e) {
+			throw new NotificationException("Exception creating notification listener registration!", e);
+		}
+	}
+
+	@Override
+	public void deregister(String registration) {
+		EventProcessor processor = eventProcessors.get(registration);
+		if (processor != null) {
+			processor.disconnect();
+			eventProcessors.remove(registration);
+		}
+	}
+
+	@Override
+	public void close(boolean isDeregisterAll) throws NotificationException {
+		LOGGER.info("Closing NotificationManager...");
+
+		for (String registration : eventProcessors.keySet()) {
+			LOGGER.debug("Disconnecting registration '" + registration + "'.");
+			deregister(registration);
+		}
+
+		try {
+			executor.shutdown();
+			boolean terminated = executor.awaitTermination(10, TimeUnit.SECONDS);
+			if (!terminated) {
+				throw new NotificationException("Could not close all registrations!");
+			}
+		} catch (InterruptedException e) {
+			throw new NotificationException("Could not close all registrations!", e);
+		}
+	}
+
+	void processException(Exception e) {
+		LOGGER.error("Exception during notification processing!", e);
+	}
+
+	void processNotification(short mode, T_LONGLONG aeId, T_LONGLONG ieId, T_LONGLONG userId, String timestamp,
+			NotificationListener notificationListener) {
+
+		try {
+			User user = loader.load(new Key<>(User.class), Long.toString(ODSConverter.fromODSLong(userId)));
+			LOGGER.debug("User loaded");
+
+			EntityType entityType = modelManager.getEntityTypeById(Long.toString(ODSConverter.fromODSLong(aeId)));
+			List<String> ids = Arrays.asList(Long.toString(ODSConverter.fromODSLong(ieId)));
+
+			if (LOGGER.isTraceEnabled()) {
+				LOGGER.trace("Notification event with: entityType=" + entityType + ", user=" + user);
+			}
+
+			switch (mode) {
+			case MODE_INSERT.value:
+				notificationListener.instanceCreated(loader.loadEntities(entityType, ids), user);
+				break;
+			case MODE_REPLACE.value:
+				notificationListener.instanceModified(loader.loadEntities(entityType, ids), user);
+				break;
+			case MODE_DELETE.value:
+				notificationListener.instanceDeleted(entityType, ids, user);
+				break;
+			case MODE_MODIFYRIGHTS.value:
+				notificationListener.securityModified(entityType, ids, user);
+				break;
+			default:
+				processException(new NotificationException("Invalid notification type!"));
+			}
+		} catch (DataAccessException e) {
+			processException(new NotificationException("Cannot load data for notification!", e));
+		}
+	}
+}
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/EventProcessor.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/EventProcessor.java
index 32f5778..dfab460 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/EventProcessor.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/EventProcessor.java
@@ -1,270 +1,278 @@
-//package org.eclipse.mdm.api.odsadapter.notification.avalon;
-//
-//import java.util.List;
-//import java.util.Set;
-//import java.util.concurrent.ScheduledFuture;
-//import java.util.stream.Collectors;
-//
-//import org.eclipse.mdm.api.base.notification.NotificationException;
-//import org.eclipse.mdm.api.base.notification.NotificationFilter.ModificationType;
-//import org.eclipse.mdm.api.base.notification.NotificationListener;
-//import org.omg.CORBA.ORB;
-//import org.omg.CosNaming.NamingContextExt;
-//import org.omg.CosNaming.NamingContextExtHelper;
-//import org.omg.CosNotification.EventType;
-//import org.omg.CosNotification.StructuredEvent;
-//import org.omg.CosNotifyChannelAdmin.ClientType;
-//import org.omg.CosNotifyChannelAdmin.EventChannel;
-//import org.omg.CosNotifyChannelAdmin.EventChannelHelper;
-//import org.omg.CosNotifyChannelAdmin.StructuredProxyPullSupplier;
-//import org.omg.CosNotifyChannelAdmin.StructuredProxyPullSupplierHelper;
-//import org.omg.CosNotifyComm.InvalidEventType;
-//import org.omg.CosNotifyComm.StructuredPullConsumerPOA;
-//import org.omg.CosNotifyFilter.ConstraintExp;
-//import org.omg.CosNotifyFilter.Filter;
-//import org.omg.CosNotifyFilter.FilterFactory;
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//
-//import com.highqsoft.avalonCorbaNotification.notification.AvalonNotificationCorbaEvent;
-//import com.highqsoft.avalonCorbaNotification.notification.AvalonNotificationCorbaEventHelper;
-//
-///**
-// * Event processor responsible for receiving avalon events from the notification
-// * service and redirect them to the manager.
-// * 
-// * @since 1.0.0
-// * @author Matthias Koller, Peak Solution GmbH
-// *
-// */
-//public class EventProcessor extends StructuredPullConsumerPOA implements Runnable {
-//
-//	private static final Logger LOGGER = LoggerFactory.getLogger(EventProcessor.class);
-//
-//	private static final String eventDomainName = "AVALON";
-//
-//	private final ORB orb;
-//	private final NotificationListener listener;
-//	private final AvalonNotificationManager manager;
-//	private final String nameserviceUrl;
-//	private final String serviceName;
-//
-//	private EventChannel eventChannel;
-//	private StructuredProxyPullSupplier proxyPullSupplier;
-//
-//	private boolean connected = false;
-//
-//	private ScheduledFuture<?> future;
-//
-//	/**
-//	 * Creates a new event processor.
-//	 * 
-//	 * @param orb
-//	 *            CORBA orb to use
-//	 * @param listener
-//	 *            notification listener consuming the received events
-//	 * @param manager
-//	 *            notification manager responsible for processing the events
-//	 * @param serviceName
-//	 *            service name of the CORBA notification service
-//	 */
-//	public EventProcessor(ORB orb, NotificationListener listener, AvalonNotificationManager manager,
-//			String nameserviceUrl, String serviceName) {
-//		this.orb = orb;
-//		this.nameserviceUrl = nameserviceUrl;
-//		this.listener = listener;
-//		this.manager = manager;
-//		this.serviceName = String.format("com/highqsoft/avalon/notification/%s.Notification", serviceName);
-//	}
-//
-//	/**
-//	 * Connect the event processor to the notification service.
-//	 * 
-//	 * @throws NotificationException
-//	 *             in case the notification service cannot be connected.
-//	 */
-//	public synchronized void connect() throws NotificationException {
-//		if (isConnected()) {
-//			return;
-//		}
-//
-//		try {
-//			NamingContextExt nc = NamingContextExtHelper.narrow(orb.string_to_object(nameserviceUrl));
-//
-//			eventChannel = EventChannelHelper.narrow(nc.resolve(nc.to_name(serviceName)));
-//
-//			proxyPullSupplier = StructuredProxyPullSupplierHelper.narrow(eventChannel.default_consumer_admin()
-//					.obtain_notification_pull_supplier(ClientType.STRUCTURED_EVENT, new org.omg.CORBA.IntHolder()));
-//
-//			proxyPullSupplier.connect_structured_pull_consumer(this._this(orb));
-//			connected = true;
-//		} catch (Exception e) {
-//			throw new NotificationException("Cannot connect to notification service!", e);
-//		}
-//	}
-//
-//	/**
-//	 * Disconnect the event processor from the notification service.
-//	 */
-//	public synchronized void disconnect() {
-//		if (isConnected()) {
-//			if (future != null) {
-//				future.cancel(false);
-//			}
-//
-//			proxyPullSupplier = null;
-//
-//			eventChannel._release();
-//			eventChannel = null;
-//
-//			connected = false;
-//		}
-//	}
-//
-//	/**
-//	 * @return true if the event processor is connected to the notification
-//	 *         service
-//	 */
-//	public synchronized boolean isConnected() {
-//		return connected;
-//	}
-//
-//	/**
-//	 * Sets the event filter.
-//	 * 
-//	 * @param aids
-//	 *            List with application element IDs to filter for. Empty list
-//	 *            means no all.
-//	 * @param modificationTypes
-//	 *            Collection of modification types to filter for.
-//	 * @throws NotificationException
-//	 *             if the filter cannot be set
-//	 */
-//	public void setFilter(List<String> aids, Set<ModificationType> modificationTypes) throws NotificationException {
-//		if (!isConnected()) {
-//			throw new IllegalStateException("Cannot set filter when disconnected. Please connect first.");
-//		}
-//
-//		try {
-//			FilterFactory filterFactory = eventChannel.default_filter_factory();
-//			if (filterFactory == null) {
-//				throw new NotificationException("No default filter factory found!");
-//			}
-//
-//			Filter filter = filterFactory.create_filter("EXTENDED_TCL");
-//			filter.add_constraints(new ConstraintExp[] {
-//					new ConstraintExp(getEventTypes(modificationTypes), getConstraintFilter(aids)) });
-//			proxyPullSupplier.add_filter(filter);
-//		} catch (Exception e) {
-//			throw new NotificationException("Exception when creating filter.", e);
-//		}
-//	}
-//
-//	/**
-//	 * Sets the ScheduledFuture that will be used to stop the event processor
-//	 * task.
-//	 * 
-//	 * @param future
-//	 *            ScheduledFuture
-//	 */
-//	public void setFuture(ScheduledFuture<?> future) {
-//		this.future = future;
-//	}
-//
-//	@Override
-//	public synchronized void run() {
-//		if (isConnected()) {
-//			org.omg.CORBA.BooleanHolder bh = new org.omg.CORBA.BooleanHolder();
-//
-//			try {
-//				LOGGER.trace("Looking for structured events....");
-//				// try to pull an event
-//				StructuredEvent event = proxyPullSupplier.try_pull_structured_event(bh);
-//				if (bh.value) {
-//					AvalonNotificationCorbaEvent ev = AvalonNotificationCorbaEventHelper
-//							.extract(event.remainder_of_body);
-//					manager.processNotification(ev.mode, ev.aeId, ev.ieId, ev.userId, ev.timestamp, listener);
-//				} else {
-//					LOGGER.trace("No structured events found.");
-//				}
-//			} catch (Exception e) {
-//				manager.processException(e);
-//			}
-//		} else {
-//			LOGGER.warn("Disconnected.");
-//			manager.processException(new NotificationException("Not connected"));
-//			if (future != null) {
-//				future.cancel(false);
-//			}
-//		}
-//	}
-//
-//	@Override
-//	public void disconnect_structured_pull_consumer() {
-//		LOGGER.info("Disconnected!");
-//		connected = false;
-//	}
-//
-//	@Override
-//	public void offer_change(EventType[] added, EventType[] removed) throws InvalidEventType {
-//		// TODO Auto-generated method stub
-//
-//	}
-//
-//	/**
-//	 * Constructs a constraint filter.
-//	 * 
-//	 * @param aids
-//	 *            Application Element IDs used for filtering. Empty list means
-//	 *            no filter.
-//	 * @return Constraint filter containing the given aids
-//	 */
-//	private String getConstraintFilter(List<String> aids) {
-//		if (aids.isEmpty()) {
-//			return "TRUE";
-//		} else {
-//			return aids.stream().map(aid -> String.format("$.filterable_data(%s) == %s", "ApplicationElement", aid))
-//					.collect(Collectors.joining(" or "));
-//		}
-//	}
-//
-//	/**
-//	 * Converts ModificationTypes in EventTypes.
-//	 * 
-//	 * @param modificationTypes
-//	 * @return Array with EventTypes
-//	 */
-//	private EventType[] getEventTypes(Set<ModificationType> modificationTypes) {
-//		if (modificationTypes.isEmpty()) {
-//			return new EventType[0];
-//		} else {
-//			return modificationTypes.stream().map(s -> new EventType(eventDomainName, toAvalonString(s)))
-//					.collect(Collectors.toList()).toArray(new EventType[0]);
-//		}
-//	}
-//
-//	/**
-//	 * Converts a {@link ModificationType} enum value to a event type name for
-//	 * the CORBA notification service.
-//	 * 
-//	 * @param t
-//	 *            a modification type
-//	 * @return event type name
-//	 */
-//	private String toAvalonString(ModificationType t) {
-//		switch (t) {
-//		case INSTANCE_CREATED:
-//			return "INSERT";
-//		case INSTANCE_MODIFIED:
-//			return "REPLACE";
-//		case INSTANCE_DELETED:
-//			return "DELETE";
-//		case SECURITY_MODIFIED:
-//			return "MODIFYRIGHTS";
-//		case MODEL_MODIFIED:
-//			throw new IllegalArgumentException(t.name() + " not supported!");
-//		default:
-//			throw new IllegalArgumentException("Invalid enum value!");
-//		}
-//	}
-//}
+/*
+ * Copyright (c) 2017-2018 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.odsadapter.notification.avalon;
+
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ScheduledFuture;
+import java.util.stream.Collectors;
+
+import org.eclipse.mdm.api.base.notification.NotificationException;
+import org.eclipse.mdm.api.base.notification.NotificationFilter.ModificationType;
+import org.eclipse.mdm.api.base.notification.NotificationListener;
+import org.omg.CORBA.ORB;
+import org.omg.CosNaming.NamingContextExt;
+import org.omg.CosNaming.NamingContextExtHelper;
+import org.omg.CosNotification._EventType;
+import org.omg.CosNotification.StructuredEvent;
+import org.omg.CosNotifyChannelAdmin.ClientType;
+import org.omg.CosNotifyChannelAdmin.EventChannel;
+import org.omg.CosNotifyChannelAdmin.EventChannelHelper;
+import org.omg.CosNotifyChannelAdmin.StructuredProxyPullSupplier;
+import org.omg.CosNotifyChannelAdmin.StructuredProxyPullSupplierHelper;
+import org.omg.CosNotifyComm.InvalidEventType;
+import org.omg.CosNotifyComm.StructuredPullConsumerPOA;
+import org.omg.CosNotifyFilter.ConstraintExp;
+import org.omg.CosNotifyFilter.Filter;
+import org.omg.CosNotifyFilter.FilterFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.highqsoft.avalonCorbaNotification.notification.AvalonNotificationCorbaEvent;
+import com.highqsoft.avalonCorbaNotification.notification.AvalonNotificationCorbaEventHelper;
+
+/**
+ * Event processor responsible for receiving avalon events from the notification
+ * service and redirect them to the manager.
+ * 
+ * @since 1.0.0
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+public class EventProcessor extends StructuredPullConsumerPOA implements Runnable {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(EventProcessor.class);
+
+	private static final String eventDomainName = "AVALON";
+
+	private final ORB orb;
+	private final NotificationListener listener;
+	private final AvalonNotificationManager manager;
+	private final String nameserviceUrl;
+	private final String serviceName;
+
+	private EventChannel eventChannel;
+	private StructuredProxyPullSupplier proxyPullSupplier;
+
+	private boolean connected = false;
+
+	private ScheduledFuture<?> future;
+
+	/**
+	 * Creates a new event processor.
+	 * 
+	 * @param orb
+	 *            CORBA orb to use
+	 * @param listener
+	 *            notification listener consuming the received events
+	 * @param manager
+	 *            notification manager responsible for processing the events
+	 * @param serviceName
+	 *            service name of the CORBA notification service
+	 */
+	public EventProcessor(ORB orb, NotificationListener listener, AvalonNotificationManager manager,
+			String nameserviceUrl, String serviceName) {
+		this.orb = orb;
+		this.nameserviceUrl = nameserviceUrl;
+		this.listener = listener;
+		this.manager = manager;
+		this.serviceName = String.format("com/highqsoft/avalon/notification/%s.Notification", serviceName);
+	}
+
+	/**
+	 * Connect the event processor to the notification service.
+	 * 
+	 * @throws NotificationException
+	 *             in case the notification service cannot be connected.
+	 */
+	public synchronized void connect() throws NotificationException {
+		if (isConnected()) {
+			return;
+		}
+
+		try {
+			NamingContextExt nc = NamingContextExtHelper.narrow(orb.string_to_object(nameserviceUrl));
+
+			eventChannel = EventChannelHelper.narrow(nc.resolve(nc.to_name(serviceName)));
+
+			proxyPullSupplier = StructuredProxyPullSupplierHelper.narrow(eventChannel.default_consumer_admin()
+					.obtain_notification_pull_supplier(ClientType.STRUCTURED_EVENT, new org.omg.CORBA.IntHolder()));
+
+			proxyPullSupplier.connect_structured_pull_consumer(this._this(orb));
+			connected = true;
+		} catch (Exception e) {
+			throw new NotificationException("Cannot connect to notification service!", e);
+		}
+	}
+
+	/**
+	 * Disconnect the event processor from the notification service.
+	 */
+	public synchronized void disconnect() {
+		if (isConnected()) {
+			if (future != null) {
+				future.cancel(false);
+			}
+
+			proxyPullSupplier = null;
+
+			eventChannel._release();
+			eventChannel = null;
+
+			connected = false;
+		}
+	}
+
+	/**
+	 * @return true if the event processor is connected to the notification
+	 *         service
+	 */
+	public synchronized boolean isConnected() {
+		return connected;
+	}
+
+	/**
+	 * Sets the event filter.
+	 * 
+	 * @param aids
+	 *            List with application element IDs to filter for. Empty list
+	 *            means no all.
+	 * @param modificationTypes
+	 *            Collection of modification types to filter for.
+	 * @throws NotificationException
+	 *             if the filter cannot be set
+	 */
+	public void setFilter(List<String> aids, Set<ModificationType> modificationTypes) throws NotificationException {
+		if (!isConnected()) {
+			throw new IllegalStateException("Cannot set filter when disconnected. Please connect first.");
+		}
+
+		try {
+			FilterFactory filterFactory = eventChannel.default_filter_factory();
+			if (filterFactory == null) {
+				throw new NotificationException("No default filter factory found!");
+			}
+
+			Filter filter = filterFactory.create_filter("EXTENDED_TCL");
+			filter.add_constraints(new ConstraintExp[] {
+					new ConstraintExp(getEventTypes(modificationTypes), getConstraintFilter(aids)) });
+			proxyPullSupplier.add_filter(filter);
+		} catch (Exception e) {
+			throw new NotificationException("Exception when creating filter.", e);
+		}
+	}
+
+	/**
+	 * Sets the ScheduledFuture that will be used to stop the event processor
+	 * task.
+	 * 
+	 * @param future
+	 *            ScheduledFuture
+	 */
+	public void setFuture(ScheduledFuture<?> future) {
+		this.future = future;
+	}
+
+	@Override
+	public synchronized void run() {
+		if (isConnected()) {
+			org.omg.CORBA.BooleanHolder bh = new org.omg.CORBA.BooleanHolder();
+
+			try {
+				LOGGER.trace("Looking for structured events....");
+				// try to pull an event
+				StructuredEvent event = proxyPullSupplier.try_pull_structured_event(bh);
+				if (bh.value) {
+					AvalonNotificationCorbaEvent ev = AvalonNotificationCorbaEventHelper
+							.extract(event.remainder_of_body);
+					manager.processNotification(ev.mode, ev.aeId, ev.ieId, ev.userId, ev.timestamp, listener);
+				} else {
+					LOGGER.trace("No structured events found.");
+				}
+			} catch (Exception e) {
+				manager.processException(e);
+			}
+		} else {
+			LOGGER.warn("Disconnected.");
+			manager.processException(new NotificationException("Not connected"));
+			if (future != null) {
+				future.cancel(false);
+			}
+		}
+	}
+
+	@Override
+	public void disconnect_structured_pull_consumer() {
+		LOGGER.info("Disconnected!");
+		connected = false;
+	}
+
+	@Override
+	public void offer_change(_EventType[] added, _EventType[] removed) throws InvalidEventType {
+		// TODO Auto-generated method stub
+
+	}
+
+	/**
+	 * Constructs a constraint filter.
+	 * 
+	 * @param aids
+	 *            Application Element IDs used for filtering. Empty list means
+	 *            no filter.
+	 * @return Constraint filter containing the given aids
+	 */
+	private String getConstraintFilter(List<String> aids) {
+		if (aids.isEmpty()) {
+			return "TRUE";
+		} else {
+			return aids.stream().map(aid -> String.format("$.filterable_data(%s) == %s", "ApplicationElement", aid))
+					.collect(Collectors.joining(" or "));
+		}
+	}
+
+	/**
+	 * Converts ModificationTypes in EventTypes.
+	 * 
+	 * @param modificationTypes
+	 * @return Array with EventTypes
+	 */
+	private _EventType[] getEventTypes(Set<ModificationType> modificationTypes) {
+		if (modificationTypes.isEmpty()) {
+			return new _EventType[0];
+		} else {
+			return modificationTypes.stream().map(s -> new _EventType(eventDomainName, toAvalonString(s)))
+					.collect(Collectors.toList()).toArray(new _EventType[0]);
+		}
+	}
+
+	/**
+	 * Converts a {@link ModificationType} enum value to a event type name for
+	 * the CORBA notification service.
+	 * 
+	 * @param t
+	 *            a modification type
+	 * @return event type name
+	 */
+	private String toAvalonString(ModificationType t) {
+		switch (t) {
+		case INSTANCE_CREATED:
+			return "INSERT";
+		case INSTANCE_MODIFIED:
+			return "REPLACE";
+		case INSTANCE_DELETED:
+			return "DELETE";
+		case SECURITY_MODIFIED:
+			return "MODIFYRIGHTS";
+		case MODEL_MODIFIED:
+			throw new IllegalArgumentException(t.name() + " not supported!");
+		default:
+			throw new IllegalArgumentException("Invalid enum value!");
+		}
+	}
+}
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/EventProcessor.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/EventProcessor.java
index 7d578a2..d750a78 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/EventProcessor.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/EventProcessor.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2017-2018 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.odsadapter.notification.peak;
 
 import javax.ws.rs.ProcessingException;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/JsonMessageBodyProvider.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/JsonMessageBodyProvider.java
index 342f3c9..fddb72e 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/JsonMessageBodyProvider.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/JsonMessageBodyProvider.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2017-2018 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.odsadapter.notification.peak;
 
 import java.io.IOException;
@@ -19,7 +27,7 @@
 import javax.ws.rs.ext.Provider;
 
 import com.google.common.base.Charsets;
-import com.google.protobuf.GeneratedMessage;
+import com.google.protobuf.GeneratedMessageV3;
 import com.google.protobuf.Message;
 import com.google.protobuf.util.JsonFormat;
 import com.google.protobuf.util.JsonFormat.Parser;
@@ -36,14 +44,11 @@
 @Consumes(MediaType.APPLICATION_JSON)
 @Produces(MediaType.APPLICATION_JSON)
 public class JsonMessageBodyProvider implements MessageBodyReader<Message>, MessageBodyWriter<Message> {
+	
 	private static final Charset charset = Charsets.UTF_8;
 	private Printer jsonPrinter = JsonFormat.printer();
 	private Parser jsonParser = JsonFormat.parser();
 
-	public JsonMessageBodyProvider() {
-
-	}
-
 	@Override
 	public boolean isReadable(final Class<?> type, final Type genericType, final Annotation[] annotations,
 			final MediaType mediaType) {
@@ -56,7 +61,7 @@
 			throws IOException {
 		try {
 			final Method newBuilder = type.getMethod("newBuilder");
-			final GeneratedMessage.Builder<?> builder = (GeneratedMessage.Builder<?>) newBuilder.invoke(type);
+			final GeneratedMessageV3.Builder<?> builder = (GeneratedMessageV3.Builder<?>) newBuilder.invoke(type);
 			jsonParser.merge(new InputStreamReader(entityStream, charset), builder);
 			return builder.build();
 		} catch (Exception e) {
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationManager.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationManager.java
index 42ec47c..b4d45e7 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationManager.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationManager.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2017-2018 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.odsadapter.notification.peak;
 
 import java.util.HashMap;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/ProtobufConverter.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/ProtobufConverter.java
index 73a35dd..e70c5b0 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/ProtobufConverter.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/ProtobufConverter.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2017-2018 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.odsadapter.notification.peak;
 
 import java.util.stream.Collectors;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSQueryService.java b/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSQueryService.java
index 9e3a607..343d5a1 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSQueryService.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSQueryService.java
@@ -1,3 +1,11 @@
+/*

+ * Copyright (c) 2017-2018 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.odsadapter.query;

 

 import org.eclipse.mdm.api.base.query.Query;

diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/search/JoinTree.java b/src/main/java/org/eclipse/mdm/api/odsadapter/search/JoinTree.java
index 1918b80..26ef9dd 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/search/JoinTree.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/search/JoinTree.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt 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.odsadapter.search;
 
 import java.util.ArrayList;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/UploadService.java b/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/UploadService.java
index ebb9880..88c21bd 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/UploadService.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/UploadService.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt 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.odsadapter.transaction;
 
 import java.io.IOException;
diff --git a/src/test/java/org/eclipse/mdm/api/odsadapter/ODSAdapterTest.java b/src/test/java/org/eclipse/mdm/api/odsadapter/ODSAdapterTest.java
index 9d7790d..26a78d7 100644
--- a/src/test/java/org/eclipse/mdm/api/odsadapter/ODSAdapterTest.java
+++ b/src/test/java/org/eclipse/mdm/api/odsadapter/ODSAdapterTest.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt 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.odsadapter;
 
 import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_NAMESERVICE;
diff --git a/src/test/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationTest.java b/src/test/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationTest.java
index bb33a12..e04ad72 100644
--- a/src/test/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationTest.java
+++ b/src/test/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationTest.java
@@ -1,3 +1,10 @@
+/*
+ * Copyright (c) 2017-2018 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.odsadapter.notification.peak;
 
 import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_NAMESERVICE;
diff --git a/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSFreeTextSearchTest.java b/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSFreeTextSearchTest.java
index eb99de7..bdad55b 100644
--- a/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSFreeTextSearchTest.java
+++ b/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSFreeTextSearchTest.java
@@ -1,3 +1,10 @@
+/*

+ * Copyright (c) 2017-2018 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.odsadapter.search;

 

 import static org.junit.Assert.assertEquals;

diff --git a/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSSearchServiceTest.java b/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSSearchServiceTest.java
index b1228fa..f201b1e 100644
--- a/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSSearchServiceTest.java
+++ b/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSSearchServiceTest.java
@@ -1,3 +1,10 @@
+/*
+ * Copyright (c) 2017-2018 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.odsadapter.search;
 
 import static org.assertj.core.api.Assertions.assertThat;